GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (252 стр.)

Сообщения на форуме пользователя Andrey (252 стр.)

Проблема со столкновениями14 сен. 20048:43#18
D0cent
А мой код в посте 5 и 6 там абсолютно все что нужно.
dimanizmpp
А у тебя код такой-же ? или другой?
Вот так я загружаю массив из файла:
//Загрузка вершин
void ListScene::LoadVertex()
{
	//Имя файла для загрузки уровня
	const char* FileName = "data\\level.raw";

	_log -> Report("Загрузка пробного уровня из файла ", _OK);
	_log -> Report(FileName, NO_TIME);
	ifstream in;

	//Число вершин в сцене
	int i = 0;
	//Временная переменная для чтения вершин
	float temp;

	vertex = 0;
	in.open(FileName,ios::in);
	if (!in) {
		_log -> Report("Не удалось открыть файл ", NO_TIME_ERROR);
		_log -> Report(FileName, NO_TIME);
		return;//Не удалось открыть файл
	}
	//Узнаем число вершин
	while(!in.eof()) {
		//Читаем вершины временно
		in >> temp;
		vertex++;
	}
	in.close();
	Vertex = new Vector3D[vertex];//Выделяем памяит под массив
	in.open(FileName,ios::in);
	in.seekg(0, ios::beg);//Устанавливаем на начало позиции файла
	//Читаем вершины
	while(!in.eof()) {
		in >> Vertex[i].x >> Vertex[i].y >> Vertex[i].z;
		i++;
	}
	_log -> Report(" Ok\n", NO_TIME);
}

[/b]

Правка: 14 сен. 2004 8:44

Проблема со столкновениями13 сен. 200416:16#15
Есть у кого нибудь еще какие-нибудь идеи?
Подсчет FPS13 сен. 200414:38#3
BAMC
>таймера стаятся в очередь на обработку, если у меня будет много других сообщений и.т.п >грузни, то все пойдет неправильно FPS будет скакать...
Пробуй прошедшее время вычислять с помощью функции time() тогда не будет привязки к сообщению от таймера WM_TIMER.
Хороший сайт13 сен. 200411:38#22
-=InQ=-,wat
Я уже говорил что сайт просто супер.Я как на работу прихожу первым делом сюда заглядываю.Спасибо сбольшое создателям и разработчикам!!!

Правка: 13 сен. 2004 11:46

Модели..13 сен. 20049:40#4
An-v1
А в Ase хорошо анимация поддерживается?Я вот пробовал занятся этим но про формат Ase для анимации говорили что он не полностью ее поддерживает.
Проблема со столкновениями13 сен. 20049:33#14
JK Viking,Uranius
Ну спасибо всем буду думать.А как нибудь без физики можно ну хотя-бы пока?
А то слишком это сложно, я ее просто всю забыл.А как объяснть что в том исходнике не трясется?Может тут дело в скорости перемещения?Хотя я пробовал менять в том исходнике и все работает!!!И там тоже нет физики.
Ну я еще подумаю потом напишу.Спасибо еще раз всем
Проблема со столкновениями11 сен. 200414:25#11
Народ откликнитесь!!!!
Glut и .net 200311 сен. 200412:41#1
FireSol
Попробуй по шагам отладить.

Правка: 11 сен. 2004 12:41

Проблема со столкновениями11 сен. 200410:56#10
Uranius
>Так, чтоп. А что у тебя не работает-то? Ты комп включил?:) если да, то как оно не работает?

Ну хватит прикалываться.У меня вчера почти получилось.Я проверку столкновений поставил после
метода перемещения камеры.Но теперь получаются что тебя очень трясет после столкновений.Не знаешь в чем дело?

Проблема со столкновениями10 сен. 200416:03#8
Uranius

Премещение камеры у меня происходит в фоновом цикле при обработке событий.
в методе перемещения камеры проверяется нажатие соответствующей клавиши.
А столкновения(коллизию)  проверяю при отривсовке:

//Отображение сцены
void Render::DrawScene()
{

          //...

          camera -> UpdateMatrix();//Вот тут обновляю матрицу камеры

         //...

        //Проверка столкновений
        CheckCollision(listScene -> GetVertex(), listScene -> GetNumberVertex());

        //...

}

Правка: 10 сен. 2004 16:04

opengl.org.ru10 сен. 200413:23#3
azazello
А знаю такого Книгу написал Основы OpenGL а не знаешь где он сейчас?Графикой еще занимается?
Проблема со столкновениями10 сен. 200412:33#6
А теперь сама функция проверки столкновений:
//Проверка столкновений
void CheckCollision(Vector3D *Vertices, int numOfVerts)
{
	for(int i = 0; i < numOfVerts; i += 3)	{
		// Store of the current triangle we testing
	Vector3D Triangle[3] = {Vertices[i], Vertices[i+1], Vertices[i+2]};

	// 1) STEP ONE - Finding the sphere's classification

	// We want the normal to the current polygon being checked
	Vector3D normal = Normal(Triangle);

	// This will store the distance our sphere is from the plane
	float distance = 0.0f;
	Vector3D Position = camera -> GetPosition();

	// This is where we determine if the sphere is in FRONT, BEHIND, or INTERSECTS the plane

	int classification = ClassifySphere(Position, normal, Triangle[0], radius, distance);

	// If the sphere intersects the polygon's plane, then we need to check further
	if(classification == INTERSECTS) {
	// 2) STEP TWO - Finding the psuedo intersection point on the plane

	// Now we want to project the sphere's center onto the triangle's plane
	Vector3D Offset = normal * distance;
	// Once we have the offset to the plane, we just subtract it from the center
	// of the sphere.  "vIntersection" is now a point that lies on the plane of the triangle.

	Vector3D Intersection = Position - Offset;

	// 3) STEP THREE - Check if the intersection point is inside the triangles perimeter

	// We first check if our intersection point is inside the triangle, if not,
	// the algorithm goes to step 4 where we check the sphere again the polygon's edges.

               // We do one thing different in the parameters for EdgeSphereCollision though.
               // Since we have a bulky sphere for our camera, it makes it so that we have to
             // go an extra distance to pass around a corner. This is because the edges of
            // the polygons are colliding with our peripheral view (the sides of the sphere).
            // So it looks likes we should be able to go forward, but we are stuck and considered
           // to be colliding.  To fix this, we just pass in the radius / 2.  Remember, this
	// is only for the check of the polygon's edges.  It just makes it look a bit more
	// realistic when colliding around corners.  Ideally, if we were using bounding box
          // collision, cylinder or ellipses, this wouldn't really be a problem.

         if(InsidePolygon(Intersection, Triangle, 3) ||
	   EdgeSphereCollision(Position, Triangle, 3, radius / 2))		{
	// If we get here, we have collided!  To handle the collision detection
	// all it takes is to find how far we need to push the sphere back.
	// GetCollisionOffset() returns us that offset according to the normal,
	// radius, and current distance the center of the sphere is from the plane.

                    Offset = GetCollisionOffset(normal, radius, distance);

	// Now that we have the offset, we want to ADD it to the position and
	// view vector in our camera.  This pushes us back off of the plane.  We
	// don't see this happening because we check collision before we render
	// the scene.

       camera -> SetPosition(Position + Offset); //Устанавливаем новый вектор позиции камеры
 	      Vector3D v = camera -> GetDirection() + Offset;
     camera -> SetDirection(v); //Устанавливаем новый вектрор направления взгляда камеры
            }
         }
     }
}

Люди помогите что у меня не так???

Правка: 10 сен. 2004 12:34

Проблема со столкновениями10 сен. 200412:33#5
Привожу полностью код для столкновениуй.
Применяемые функции:
//Определение позиции сферы относительно плоскости
//Спереди,сзади,пересечение
int ClassifySphere(Vector3D &Center,Vector3D &normal, Vector3D &Point, float radius, float &distance)
{
	//Находим расстояние между нормалью и точкой
	//Из уравнения плоскости имеем Ax+By+cZ+D = 0;
	//D = -(Ax+By+cZ+D) где Normal = {A,B,A},Point = {x,y,z}
	float d = - dotProduct(normal, Point);
	//Находим расстояние дистанцию между центром сферы и
	//Нормалью к плоскости
	distance = dotProduct(normal, Center) + d;
	//Далее сравниваем это расстояние по модулю с радиусом сферы
	if(fabs(distance) < radius)
		return INTERSECTS;
	else
		if (distance >= radius)
			return FRONT;
	return BEHIND;
}
//Определнение пересечения сферы с полигоном
//Параметры Center - центр сферы Polygon - полигон,
//vertexCount - число вершин полигона,radius - радиус сферы
bool EdgeSphereCollision(Vector3D &Center, Vector3D Polygon[],
                        int vertexCount, float radius)
{
	Vector3D Point;
	//Просмотр всех вершин полигона
	for (int i = 0; i < vertexCount; i++) {
	//Находим ближайшую точку к центру сферы на текущем ребре
//Нахождение точки на данном отрезке, ближайшей к данной точке.
          Point = ClosestPointOnLine(Polygon[i], Polygon[(i + 1) % vertexCount], Center);
	//Теперь считаем расстояние между этой ближайшей точкой
	//и центром
    if (Distance(Point, Center) < radius)
		return true;//Произошдо столкновение
   }
  return false;
}
//Нахождение смещения, для движения центра сферы от пересеченного полигона.
//Входные параметры Нормальный вектор радиус расстояние
Vector3D GetCollisionOffset(Vector3D &normal, float radius, float distance)
{
	if (distance > 0)
   	   return normal * (radius - distance);
	else
	   return normal * (radius + distance);
	//Если дистанция равна нулю то столкновения нет возвращаем
	//нулевой вектор
	return Vector3D(0,0,0);
}

В следующем посте последняя функция проверки столкновений

Ну и где же обещанная на 30 августа спецификация OpenGL 2.0 ?10 сен. 20049:53#22
YgriK
А как ты думаешь вот выпустят версию Microsoft Visual C++ .Net за 2005 год.
Там наверное будет уже другие файлы gl.h,glu.h и соответствующие библиотеки да + еще расширения для версии 2.0?

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр