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

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

Отсечение по пирамиде видимости1 окт. 200413:50#6
lsiserg 
>ведь треугольник будет виден даже если одна точка в фрастуме

только что догадался так сделать :). Но вот при повороте что-то отсекает  то что не должно отсекать.
В чем может быть дело?

Отсечение по пирамиде видимости1 окт. 200413:20#2
Вот проверка нахождения точки в пирамиде видимости:
//Проверка нахождения точки в пирамиде видимости
	inline bool Frustum::PointInFrustum( float x, float y, float z)
	{
	   int p;
//	   for (p = 0; p < 6; p++)
		//	if (PlaneDistance(x, y, z, frustum[p][0], frustum[p][1], frustum[p][2],frustum[p][3]) <= 0)
		  if (PlaneDistance(x , y, z, frustum[0][0], frustum[0][1], frustum[0][2]) <= 0 ||
			   PlaneDistance(x , y, z, frustum[1][0], frustum[1][1], frustum[1][2],frustum[p][3]) <= 0 ||
			   PlaneDistance(x , y, z, frustum[2][0], frustum[2][1], frustum[2][2],frustum[p][3]) <= 0 ||
			   PlaneDistance(x , y, z, frustum[3][0], frustum[3][1], frustum[3][2],frustum[p][3]) <= 0 ||
			   PlaneDistance(x , y, z, frustum[4][0], frustum[4][1], frustum[4][2],frustum[p][3]) <= 0 ||
			   PlaneDistance(x , y, z, frustum[5][0], frustum[5][1], frustum[5][2],frustum[p][3]) <= 0)
			 return false;
	   return true;
}
//Расстояние от точки (x1;y1;z1) до плоскости с нормалью {x2,y2,z2} d - расстояние по нормали до начала координат
inline float Frustum::PlaneDistance(float x1, float y1, float z1, float x2, float y2, float z2, float d)
{
	return (x1 * x2) + (y1 * y2) + (z1 * z2) + d;
}

Теперь я пробую определить нахождения треугольника в пирамиде видимости:
//Проверка нахождения всех 3 вершин в пирамиде видимости
if (PointInFrustum(_x1, _y1, _z1) && PointInFrustum(_x2, _y2, _z2) && PointInFrustum(_x3, _y3, _z3)) {
          //...Отрисовка треугольника
}

Но почемуто не работает получается что  треугольники не правильно отсекаются получается что они должны быть видны но отсекаются.Хотя для отдельных точек все работает.
Скажите в чем может быть дело?Или я не правильно провожу проверку нахождения треугольника в пирамиде видимости?
Заранее спасибо всем.
С уважением Андрей.

Правка: 1 окт. 2004 14:06

Отсечение по пирамиде видимости1 окт. 200413:19#1
//Функция расчета пирамиды
	inline void Frustum::ExtractFrustum()
	{

	   float   proj[16];//Матрица проекций
	   float   modl[16];//видовая матрица
	   float   clip[16];
	   float   t;

	   //Узнаем текущую матрицу PROJECTION
	   glGetFloatv(GL_PROJECTION_MATRIX, proj);
	   //Узнаем текущую матрицу MODELVIEW
	   glGetFloatv(GL_MODELVIEW_MATRIX, modl);
	   //Комбинируем матрицы(перемножаем)
	   clip[0] = modl[0] * proj[0] + modl[1] * proj[4] + modl[2] * proj[8] + modl[3] * proj[12];
	   clip[1] = modl[0] * proj[1] + modl[1] * proj[5] + modl[2] * proj[9] + modl[3] * proj[13];
	   clip[2] = modl[0] * proj[2] + modl[1] * proj[6] + modl[2] * proj[10] + modl[3] * proj[14];
	   clip[3] = modl[0] * proj[3] + modl[1] * proj[7] + modl[2] * proj[11] + modl[3] * proj[15];

	   clip[4] = modl[4] * proj[0] + modl[5] * proj[4] + modl[6] * proj[8] + modl[7] * proj[12];
	   clip[5] = modl[4] * proj[1] + modl[5] * proj[5] + modl[6] * proj[9] + modl[7] * proj[13];
	   clip[6] = modl[4] * proj[2] + modl[5] * proj[6] + modl[6] * proj[10] + modl[7] * proj[14];
	   clip[7] = modl[4] * proj[3] + modl[5] * proj[7] + modl[6] * proj[11] + modl[7] * proj[15];

	   clip[8] = modl[8] * proj[0] + modl[9] * proj[4] + modl[10] * proj[8] + modl[11] * proj[12];
	   clip[9] = modl[8] * proj[1] + modl[9] * proj[5] + modl[10] * proj[9] + modl[11] * proj[13];
	   clip[10] = modl[8] * proj[2] + modl[9] * proj[6] + modl[10] * proj[10] + modl[11] * proj[14];
	   clip[11] = modl[8] * proj[3] + modl[9] * proj[7] + modl[10] * proj[11] + modl[11] * proj[15];

	   clip[12] = modl[12] * proj[0] + modl[13] * proj[4] + modl[14] * proj[8] + modl[15] * proj[12];
	   clip[13] = modl[12] * proj[1] + modl[13] * proj[5] + modl[14] * proj[9] + modl[15] * proj[13];
	   clip[14] = modl[12] * proj[2] + modl[13] * proj[6] + modl[14] * proj[10] + modl[15] * proj[14];
	   clip[15] = modl[12] * proj[3] + modl[13] * proj[7] + modl[14] * proj[11] + modl[15] * proj[15];

	   //Находим A, B, C, D для ПРАВОЙ плоскости
	   frustum[0][0] = clip[3] - clip[0];
	   frustum[0][1] = clip[7] - clip[4];
	   frustum[0][2] = clip[11] - clip[8];
	   frustum[0][3] = clip[15] - clip[12];

	   //Приводим уравнение плоскости к нормальному виду
	   t = float(sqrt(frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2]));
	   frustum[0][0] /= t;
	   frustum[0][1] /= t;
	   frustum[0][2] /= t;
	   frustum[0][3] /= t;

	   //Находим A, B, C, D для ЛЕВОЙ плоскости
	   frustum[1][0] = clip[3] + clip[0];
	   frustum[1][1] = clip[7] + clip[4];
	   frustum[1][2] = clip[11] + clip[8];
	   frustum[1][3] = clip[15] + clip[12];
	   //Приводим уравнение плоскости к нормальному виду
	   t = float(sqrt(frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2]));
	   frustum[1][0] /= t;
	   frustum[1][1] /= t;
	   frustum[1][2] /= t;
	   frustum[1][3] /= t;
	   //Находим A, B, C, D для НИЖНЕЙ плоскости
	   frustum[2][0] = clip[3] + clip[1];
	   frustum[2][1] = clip[7] + clip[5];
	   frustum[2][2] = clip[11] + clip[9];
	   frustum[2][3] = clip[15] + clip[13];
	   //Приводим уравнение плоскости к нормальному
	   t = float(sqrt(frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2]));
	   frustum[2][0] /= t;
	   frustum[2][1] /= t;
	   frustum[2][2] /= t;
	   frustum[2][3] /= t;
	   //ВЕРХНЯЯ плоскость
	   frustum[3][0] = clip[3] - clip[1];
	   frustum[3][1] = clip[7] - clip[5];
	   frustum[3][2] = clip[11] - clip[9];
	   frustum[3][3] = clip[15] - clip[13];
	   //Нормальный вид
	   t = float(sqrt(frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2]));
	   frustum[3][0] /= t;
	   frustum[3][1] /= t;
	   frustum[3][2] /= t;
	   frustum[3][3] /= t;
	   //ЗАДНЯЯ плоскость
	   frustum[4][0] = clip[3] - clip[2];
	   frustum[4][1] = clip[7] - clip[6];
	   frustum[4][2] = clip[11] - clip[10];
	   frustum[4][3] = clip[15] - clip[14];
	   //Нормальный вид
	   t = float(sqrt(frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2]));
	   frustum[4][0] /= t;
	   frustum[4][1] /= t;
	   frustum[4][2] /= t;
	   frustum[4][3] /= t;
	   //ПЕРЕДНЯЯ плоскость
	   frustum[5][0] = clip[3] + clip[2];
	   frustum[5][1] = clip[7] + clip[6];
	   frustum[5][2] = clip[11] + clip[10];
	   frustum[5][3] = clip[15] + clip[14];
	   //Нормальный вид
	   t = float(sqrt(frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2]));
	   frustum[5][0] /= t;
	   frustum[5][1] /= t;
	   frustum[5][2] /= t;
	   frustum[5][3] /= t;
	}

Правка: 1 окт. 2004 14:05

Отсечение по пирамиде видимости1 окт. 200413:18#0
Привет всем.
вот почитал урок от NeHe:http://pmg.org.ru/russian/nehe/nehex2.htm
пробую применить проверку нахождения треугольника в пирамиде видимости.
Вот код:
Кто в какой среде разработки пишет и под какой ОС?30 сен. 200410:17#36
Visual C++ .Net 2002 - только начинаю,Visual C++ 6.0
Windows XP
GUNgine27 сен. 20049:43#555
corristo
Просто Майк сказал дальше все коммерческое и выкладывать не будет исходники
OpenGL в Visual C++24 сен. 200419:51#8
lsiserg
>и еще может строки

>auxSwapBuffers();
> glFlush();

>надо местами поменять - так вроде правильнее будет

Все правильно.

vixen
>А что значит без Winapi никак:( ?

MFC - не для 3D программирования в какой игре(типа Quake или Doom) ты видел что-бы были окна как у блокнота?
программируй сразу в Win32.

Правка: 24 сен. 2004 19:54

C VS C++ Что лучше для игровых проектов22 сен. 200415:23#2
Mightimus
Я думаю С++ - язык с богатыми возможностями (при условии прямых рук программиста :) )
Зацените мой сайт и Новый MEAT WAR!!! - супер!!!22 сен. 200410:50#6
$noopy
ссылки не все работают
Раздел ОБУЧЕНИЕ проекта Almighty.22 сен. 20048:53#56
Zulus
Fly

Привет всем прочитал я урок 1.У меня предложение я пробую писать свой движок.Писал его 3 месяца.Там есть уже основные классы в том числе матрицы, кватернионы, вектора.Код хорошо комментируется.Сложился определенный стиль программирования.Может его скинуть вам?Вы посмотрите оцените что можно исправить,добавить задачи первого урока там в общем решены, как вы на это смотрите?

Правка: 22 сен. 2004 9:32

забыл сказать - Я ЖЕНЮСЬ21 сен. 200415:10#65
irek
:))
Вопрос по Perl + Microsoft SQL Server 200021 сен. 200414:38#1
Народ ну что никто не знает???????????????
Вопрос по Perl + Microsoft SQL Server 200021 сен. 200413:35#0
Привет всем.

В общем так есть сайт организации.В сайте есть прайс лист с ценами на услуги. Прайс лист
иногда обновляется.Один раз в сутки запускается скрипт написанный на Perl'е.Задача скрипта получить данные с Microsoft SQL Server 2000 для прайс листа.Обновленный прайс лист формируется ввиде html страницы которую потом можно просматривать из сайта организации.С формировании страницы я разобрался.

Кто нибудь знает как получить данные c Microsoft SQL Server 2000 с помощью Perl? может есть какие-то модули под Windows?

Спасибо всем заранее.
С уважением Андрей.

Правка: 21 сен. 2004 13:35

Проблема со столкновениями20 сен. 200415:28#29
Люди ну подскажите что-нибудь пожалуйста!!!!!

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

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