Чт, 28 Мар 2024
Механоиды 3
Приветствую Вас Гость | RSS
Главная страница | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум "Механоиды 3" » Рабочий раздел. » Программирование » Программирование (Всё что НЕ относится к графике.)
Программирование
smt005Дата: Сб, 25 Июл 2009, 13:08 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Всё что НЕ относится к графике.
 
YandersenДата: Сб, 25 Июл 2009, 13:08 | Сообщение # 2
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
//---
Я встрял, по традиции, не в тему и не с темой...
//---
Я тут свои треугольнички решил покрутить, тенеобъёмные такие. Заметил попу - предполагаемо-универсальный общепринятый двухпроходный алгоритм наложения теней в моём исполнении оказался баговым как только треугольнички поворачиваются к свету попкой. Зацените в прикреплении, плиз. По-умолчанию там выставлен мой патентный однопроходный алгоритм, наёпывающийся лишь когда наблюдатель пихается внутрь тени. Смена алгоритма - на "S". Двигаться - на стрелки и колёсико мыши, вертеть камерой - мышкой, нажав левую кнопку.
Вот что хочу попросить (особенно обладателей видюх NVidia и GeForce): тестните мою прогу (не меняя алгоритма тенирования - на "S" не жмите). Я юзанул glHint(...), отключающий резанье сцены плоскостью камеры, и надеюсь, что на видюхах, эту фичу поддерживающих, мой патентный алгоритм станет работать даже если наблюдатель вперится в теневой объём. Короче: запустите прогу, юзая колёсико мыши пройдите вперёд, через треугольники, вплотную к теням, и гляньте, стала ли при этом некорректно отображаться тень? У большинства, думаю, начнут пропадать части тени, но, надеюсь, хоть у кого-нить сработает. sad
Прикрепления: 2198771.exe (483.0 Kb)


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:09 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
В первом варианте, без изменений, когда за полигоном, получается дырка в тени.

Второй вариант, всегда дырка в тени, когда полигон задом.

Видюха, GeForce 7600.

 
Ize_g0reДата: Сб, 25 Июл 2009, 13:09 | Сообщение # 4
1 Поколение
Группа: Доверенные
Сообщений: 35
Замечания: 0%
Статус: Offline
Не нравятся мне эти тени... размыть и не получится, а при 100к треугольников занутся нафиг


Deep inside... With stones in hand...
From the mind... ...he plays light's end
 
YandersenДата: Сб, 25 Июл 2009, 13:09 | Сообщение # 5
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (Ize_g0re)
Не нравятся мне эти тени...
Думаешь, я сам в восторге? Хочу дожить до времён всемирного распространения ray-tracing'а!!! happy Но, во всяком случае, мне такие чёткие тени нравятся больше, чем квадратично-смотрящиеся от теневой текстуры. Но можно подрегулировать настройки светильника для рисования тени, чтоб менее контрастно было.
Quote (Ize_g0re)
размыть и не получится
Получится, только тормознуто до неоправданности. И сложно. Да и не идеально...
Quote (Ize_g0re)
при 100к треугольников занутся нафиг
Эх, если бы только в OpenGL была хоть какая-нить встроенная возможность типа...
glEnable(GL_EXTRUDE);
glExtrudeVector(x,y,z);
...после чего рисование любого примитива (glBegin-glEnd) стало бы сопровождаться его выдавливанием в объёмную закрытую фигуру (теневой объём), то вопрос о быстродействии и удобности метода теневых объёмов не стоял бы так остро. А то ведь все алгоритмы рисования тени это делают в любом случае, так почему бы не реализовать это наконец, блин?! А если бы ещё сказочная функция glExtrudeVector допускалась внутри операторных скобок glBegin-glEnd, так вообще панацея была бы (для точечных и направленных источников работало бы). И ещё было бы круто стандартизировать и сделать обязательной возможность отключения передней плоскости отсечения - тогда мой достойный патента ОДНОпроходный метод не наёпывался бы вообще и стал бы панацеей.
Эх, мечты, блин... cry
Кто-нить NVidia имеет? Слышал, они умеют отключать переднюю плоскость отсечения. Что на этих видюхах? Плиз-плиз! surprised


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:09 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
чёткие тени нравятся больше, чем квадратично-смотрящиеся от теневой текстуры
Квадратичность у тебя в голове(уме). Специально запустил пару игрушек Mass Effect, Сталкер ЧН, даже при низком качестве нет никакой квадратитчности (не считая в СТАЛКЕРе внешнего света, который очень сильно размыт (для реалистичности!)).
Запускал X3: Угроза ( объёмные тени ), без тени FPS=60-120 а с тенью FPS < 30. DOOM3 не получилось протестить, у меня всегда FPS=60.

Quote (Yandersen)
А то ведь все алгоритмы рисования тени это делают в любом случае
Это какие всё алгоритмы? Вроде только в методе теневых объёмов.
В матричных тенях используется преобразование матриц. В методе теневых карт тоже нет этого алгоритма.
До ray-tracing'а ещё не дожили.

Quote (Yandersen)
glBegin-glEnd
Даже для "задрыпаного" движка это уже неприемлемый способ. Если в сцене хотябы несколько тысяч полигонов,
надо использовать VBO, если конечно поддерживается(но это вроде уже давно поддерживается всеми видюхами).

Quote (Yandersen)
отключать переднюю плоскость отсечения
Это как? Подробней поясни. Если я не ошибаюсь, это может далать любая видюха.

Добавлено (08 Июл 2009, 01:32)
---------------------------------------------

Quote (Yandersen)
Кто-нить NVidia имеет?

У меня Palit, но это не имеет значения - аналог NVidia.
 
YandersenДата: Сб, 25 Июл 2009, 13:09 | Сообщение # 7
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Это как? Подробней поясни. Если я не ошибаюсь, это может далать любая видюха.

glHint(GL_CLIP_VOLUME_CLIPPING_HINT_EXT, GL_FASTEST);
Как я выяснил, константа GL_CLIP_VOLUME_CLIPPING_HINT_EXT равна 0x000080f0. Странно, у меня на ноуте, вроде, начало работать, только результ вышел не тот, что я ожидал. Подробное изучение вопроса дало неожиданное открытие: оказывается, значения буфера глубины хранятся в формате беззнакового инта, а не флоата, как я привык считать. Вот почему разрешается иметь 8-битный, 16-битный z-буффера, и вот почему не дают переднюю плоскость отсечения сместить за наблюдателя (задать ей отрицательное значение). Так что если отрубить переднюю плоскость отсечения, отрицательные значения, пихаемые в буфер глубины, становятся огромно-положительными, т.к. знаковый бит у знакового инта находится на том же месте, где старший бит у беззнакового инта, а читается буфер глубины как беззнаковый инт. Такая вот байда. Нет то чтобы стандартизировать буфер глубины под 32 бита, считая его float'ом... dry
Quote (smt005)
Квадратичность у тебя в голове(уме).
Ай, да коммон... Это щас у тя квадратиков не видно, когда один полигон на весь экран что при рендере от светильника, что от наблюдателя. А как будет нормальная сцена, где в рендере от светильника вся сцена, где каждый объект ничтожно мал, по несколько пикселов на общей картине занимает, а перед наблюдателем на весь экран один полигон рафлюстрачен - посмотрим тогда, как твои тени превратятся в огромные квадраты! Кончишь тем, что каждый объект в свою теневую текстуру пихать будешь, и там начнутся фпсы в пару кадров в час...
Quote (smt005)
Quote (Yandersen)
А то ведь все алгоритмы рисования тени это делают в любом случае

Это какие всё алгоритмы? Вроде только в методе теневых объёмов.

Да, только их много разных. Отличаются настройками и количеством проходов (сколько раз теневой объём будет отрисован с разными настройками - один или два раза, больше не нужно), но все так или иначе требуют рисования теневого объёма.
Quote (smt005)
VBO
Это чё такое? Расскажи, а? wink


[Беженец со Скаев]
 
Ize_g0reДата: Сб, 25 Июл 2009, 13:09 | Сообщение # 8
1 Поколение
Группа: Доверенные
Сообщений: 35
Замечания: 0%
Статус: Offline
//матюкнулся
http://andreyogl-d3d.blogspot.com/2009....ap.html
Тени с PSSM (как в x3d) и просто параллельно-проецированые, сравни качество. Где ты там квадраты увидел?........
http://andreyogl-d3d.blogspot.com/2009/02/opengl.html
можете заодно сравнить качество простых параллельно-проецированных теней в ОГЛ и ДХ.



Deep inside... With stones in hand...
From the mind... ...he plays light's end
 
smt005Дата: Сб, 25 Июл 2009, 13:10 | Сообщение # 9
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Ай, да коммон... Это щас у тя квадратиков не видно

Ошибаешся, как раз сейчас у меня мега квадратичность.

Убеждать тебя не буду, т.к. надоело. Аргументов привёл, а то что показа Ize_g0re вообще замечательно. Буду читать статьи.

Quote (Yandersen)
все так или иначе требуют рисования теневого объёма

"ShadowMap" не требует.

Quote (Yandersen)
Это чё такое? Расскажи, а?
МазаФака, ты ссылки которые я тебе даю, хотя бы просматриваеш ?
В "OpenGL суперкнига", главы "Всё о конвейере" и "Буферные объекты".

VBO, коротко говоря, это когда всё загружается в видюху и разом отрисовывается.

Quote (Пример)

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(CVertex3), GladerModel[countModel].Vert); // Указываем массив вершин. VectModels

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(CVertex2),GladerModel[countModel].Text); // Указываем массив текстурных координат

glColor3f(1.0f, 1.0f, 1.0f);
glDrawElements(GL_TRIANGLES, 3 * GladerModel[countModel].iFace, GL_UNSIGNED_INT, GladerModel[countModel].face); // Указываем массив индексов вершин и отрисовываем, 3 индекса - один полигон.

Прикрепления: 3625408.jpg (13.0 Kb)
 
YandersenДата: Сб, 25 Июл 2009, 13:10 | Сообщение # 10
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Ай, ёптыть, VBO==массивы! Я уж спугалси... dry

Добавлено (10 Июл 2009, 23:50)
---------------------------------------------

Quote (smt005)
Ошибаешся, как раз сейчас у меня мега квадратичность.
Ну, во всяком случае работает... smile Я тут запарился писать байду по рисованию объёмов, моска частично переключается на твой метод. Но это поганство с квадратиками и нестандартизованными расширениями... Должен же быть способ твоеподобным методом фигачить, но чтоб ровные тени получались?..

Кстати, насчёт мультитекстурирования. Всё оказалось просто - GL_TEXTURE_3D. Это не 3-хмерная текстура в натуре, а просто несколько слоёв двумерных текстур. Третья координата ( r ) в glTexCoord3f(s,t,r) - это слой. Поищи материалы в нете, если хошь - я случайно нарвался где-то, но не помню где. Гоголь легко находит по "GL_TEXTURE_3D".


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Пт, 10 Июл 2009, 23:51
 
smt005Дата: Сб, 25 Июл 2009, 13:10 | Сообщение # 11
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Должен же быть способ твоеподобным методом фигачить, но чтоб ровные тени получались?..
Жесть! Ты издеваешся над мной? :'( Есть способ!!! Ize_g0re двумя постами выше, даже "матюкнулся"!..

Quote (Yandersen)
и нестандартизованными расширениями.
cry Даже у GeForce3есть расширение "GL_ARB_shdow". И всё что с пометкой "ARB", это как раз стандарт.

Я тя прошу, почитай книку "OpenGL суперкнига".

Quote (Yandersen)
Кстати, насчёт мультитекстурирования.
Со смешиванием текстур используя Begin/end всё просто, я разобрался. Надо использовать расширение "GL_ARB_multitexture" (которое есть даже у RivaTNT). С VBO сложнее, в теории понял, но не практиковал, хучу сразу использовать шейдеры.

Quote (Прмер)

glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture[0]);

glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture[1]);

glBegin (GL_POLYGON);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
glVertex3f( -1.5f, 1.0f, 0.0f);

.......................

glEnd ();

Добавлено (11 Июл 2009, 01:06)
---------------------------------------------
Можно много текстур смешивать.

Добавлено (11 Июл 2009, 01:49)
---------------------------------------------
Yandersen, читал я учебники, копался в помойке, ой, в интернете, НЕ разобрался как записывать/читать переменные (например float) в бинарный файл. Прога просто не записывает инфу. sad
Находил англоязычные сайты, вроде всё описанно, но у меня англочитание хромает.

Короче, можеш написать простейший пример того как я могу записать а затем прочитать данные?

Например это.
float varF = 10,3;
int vari = 3;

И прочитать так, чтобы я мог прочитать любую переменную не читая весь файл ( fseek(FileHandler,2,1); ).

 
YandersenДата: Сб, 25 Июл 2009, 13:10 | Сообщение # 12
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
БЛЯ!!! ESC нажал случайно, весь текст пропал!!! БЛЯ!!! Лана, в двух словах теперь.

Чтоб писать в бинарном режиме, открываешь файл функцией fopen (и сохраняешь указатель, который она возвращает) так:
FILE* MyFileHandler = fopen(“MyFile.fle”, “wb”);
А если читать файл, то открывай так:
FILE* MyFileHandler = fopen(“MyFile.fle”, “rb”);
Перемещаться по файлу можно юзая fseek:
fseek(MyFileHandler, offset, whence);
, где offset’ом задаёшь, на сколько байтов сместиться относительно начала_файла/конца_файла/текущего_положения. Эти три варианта «относительно чего» - последний аргумент ("whence"). Если относительно начала файла, то whence=0, относительно конца – whence=2, а если хочешь отъехать вперёд/назад относительно текущего положения чтения-записи, то whence=1.
Далее. Чтение/запись – функции fread/fwrite. Аргументы у них одинаковые:
fread(DataPointer, DataSizeInBytes, 1, MyFileHandler);
fwrite(DataPointer, DataSizeInBytes, 1, MyFileHandler);
«DataPointer» - адрес того, что ты хочешь записать в файл / адрес памяти, куда ты хочешь писать из файла; «DataSizeInBytes» - сколько байт записать в файл / сколько байт прочитать из файла; третий аргумент тупой, делай его 1; последний аргумент, ну стандартно – то, что fopen нам вернула когда-то.
Так что если у тя есть
float varF = 10.3;
, то писать / читать можно так:
fread(&varF, sizeof(float), 1, MyFileHandler);
fwrite(&varF, sizeof(float), 1, MyFileHandler);
Ну и под конец ОБЯЗАТЕЛЬНО закрой файл, иначе он зависнет, пока комп не перезагрузишь:
fclose(MyFileHandler);
//----
Итак, к примеру, у тебя есть файл "MyStupidFile.fle", у которого в начале 2 байта чего-то неважного, затем идут 4 байта твоего флоатового "varF", потом ещё 17 байт какой-то требухи, после чего 4 байта твоего инта "vari". Тебе нужно из этих данных выудить свои флоат с интом и записать в переменные, так? Код такой:

FILE* MyFileHandler = fopen(“MyStupidFile.fle”, “rb”); //Открываем файл
fseek(MyFileHandler, 2, 0); //Пропускаем 2 байта считая от начала файла
fread(&varF, 4, 1, MyFileHandler); //Читаем 4 байта и пишем их в varF, передавая адрес этой переменной
//Учти, при чтении/записи позиция чтения-записи смещается на столько байт, сколько было прочитано/записано
fseek(MyFileHandler, 17, 1); //Пропускаем 17 байт считая от текущего положения
fread(&vari, 4, 1, MyFileHandler); //Читаем 4 байта и пишем их в vari, передавая адрес этой переменной
fclose(MyFileHandler); //Обязательно закрываем файл!

Ну, если ты просто хочешь составить файл, тупо писнув туда 4-байтный флоат и за ним 4-байтный инт, то вот так пиши:

FILE* MyFileHandler = fopen(“MyStupidFile.fle”, “wb”);
fwrite(&varF, 4, 1, MyFileHandler);
fwrite(&vari, 4, 1, MyFileHandler);
fclose(MyFileHandler);

И получится у тя 8-байтный файл. Если его не было до этого - он создастся. Если был - сотрётся начисто и будет перезаписан.
Читать такой файл, соответственно, нуна также:

FILE* MyFileHandler = fopen(“MyStupidFile.fle”, “rb”);
fread(&varF, 4, 1, MyFileHandler);
fread(&vari, 4, 1, MyFileHandler);
fclose(MyFileHandler);

Добавлено (11 Июл 2009, 04:02)
---------------------------------------------
Кстати, если ты вдруг не в курсах, что делает закорючка "&", то расскажу.
Закорючка "&" берёт адрес переменной (возвращает указатель на переменную"). Т.к. переменная любого типа торчит где-то в оперативной памяти, то всегда можно узнать её адрес, что и делает "закорючка".
К примеру, есть у нас
float varF = 10.3;
Если интересно, где в оперативе в реале торчит твой флоат (а функциям fread и fwrite это исключительно интересно, чтоб знать, откуда байтики тягать), пишешь ... &varF ...


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:10 | Сообщение # 13
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Спассибо, работает. Вскоре можно будет сделать конвертос с OBJ в свой формат.

Quote (Yandersen)
ОБЯЗАТЕЛЬНО закрой файл, иначе он зависнет, пока комп не перезагрузишь:
Прога? Если да, то юзай Ctrl+Alt+Del, процессы, (ищеш свой процес)Завершить процес.
 
YandersenДата: Сб, 25 Июл 2009, 13:10 | Сообщение # 14
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Прога?
Не! Файл. Ну, в смысле, если файл не закроешь (fclose) то потом хер его удалишь или переименуешь, пока комп не перезагрузишь. И fopen тоже его открыть не сможет. Так что fopen-fclose воспринимай как операторные скобки glBegin-glEnd.
Quote (smt005)
Вскоре можно будет сделать конвертос с OBJ в свой формат.
Нас будешь в курсе держать? Авось, я чё-нить дельное смогу посоветовать вдруг... wink Ну, в смысле, насчёт твоего формата. happy
Quote (smt005)
Спассибо, работает.
И насчёт физики (геометрии, точнее - векторочки там и всё такое) тоже не стесняйся. Могу функциовины писать - ты только интерфейс функции объявляй (ну, типа, аргументы какие, что они значат, и что функция должна над ними делать или какой результ возвращать), а я тело напишу, если вдруг у тя траблы с векторной алгеброй. Я тут давненько этим не маялси, неплохо было бы вспомнить былые времена матры универовой. wacko


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Сб, 11 Июл 2009, 21:23
 
smt005Дата: Сб, 25 Июл 2009, 13:11 | Сообщение # 15
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Нас будешь в курсе держать?

Конечно.

Quote (Думаю сделать ПРИМЕРНО так:)

1. Название модели.

2. Кол-во индексов (3*int)
2.1. ...

3. Кол-во вершин (3*float)
3.1. ...

4. Кол-во нормалей (3*float)
4.1. ...

5. Кол-во текстурных МАССИВОВ (int), например два массива
5.1. Кол-во текстурных координат 1 (2*float)
5.1.1. ...

5.2. Кол-во текстурных координат 2 (2*float)
5.2.1. ...

6. Кол-во текстур
6.1.1. Путь/наименование файла текстуры (всё в один класс)
6.1.2. Индекс текстурной координаты (int), к нескольким текстурам можно применить одну т.коорд.
6.1.3. Материал..........

6.2.1. Путь/наименование файла текстуры (всё в один класс)
6.2.2. Индекс текстурной координаты (int), к нескольким текстурам можно применить одну т.коорд.
6.2.3. Материал..........

Quote (Yandersen)
И насчёт физики тоже не стесняйся.
Я же уже давно разобрался с физикой. А что ты можеш сказать про физику? Пиши всё что знаеш?
Quote (Yandersen)
Могу функциовины писать
Будет СУПЕР-ПУПЕР если ты с PhisX разберёшся. smile
 
smt005Дата: Сб, 25 Июл 2009, 13:11 | Сообщение # 16
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Yandersen, раз ты геометр, то есть для тебя задачка.

Есть полигон, в трёхмерном пространстве, есть некое пространство(плоскость XY).
Задача, надо определить, полигон пересекается с пространством или нет. Вершины треугольника находятся вне пространства.

Прикрепления: 5940406.gif (1.8 Kb)
 
YandersenДата: Сб, 25 Июл 2009, 13:11 | Сообщение # 17
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Хе-хе, чую, куда ты клонишь - тебе, наверное, нужно проверить, попадает ли примитив в область отображения? У меня где-то какие-то функциовины по этому поводу, вроде, есть, но:
1) Советую изучить FEEDBACK - буффера и функции OpenGL-евские, с этим связанные. Это намного более универсальное и удобное решение, чем просчитывать всё вручную. Я поверхностно проходился по этому поводу, но особо не вникал. Но там, вроде, не очень сложно. Если очень надо, пни мну сильно. Только если не собираешься через пару часов сказать, что, типа, уже не надо. dry
2) Если нужны мои геометрические познания и функциовина по просчёту, уточни и распиши задачу. Какие данные, что конкретно нужно просчитать. К примеру, как плоскость определена? Как проходящая через три точки с известными координатами, или через точку и перпендикулярно вектору? И т.д. Конкретнее, плиз. Решить-то не проблема, только нужно знать, что именно решать.


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:11 | Сообщение # 18
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Только если не собираешься через пару часов сказать, что, типа, уже не надо.
Откуда мне было знать, что ты так быстро среагируеш? И даже напишеш хидер.
Quote (Yandersen)
FEEDBACK
Что это такое, в двух словах, может я знаю что это, не знаю только название.

Quote (Yandersen)
нужно проверить, попадает ли примитив в область отображения?
Не совсем.
Только не надо сразу писать хидер!!!

Вид, всерху. Синим цветом обозначен обзор (поле зрения). Мозайка, это полигоны(на деле, треугольники).
Вся локация делится на квады. Индексты вершин полигонов записываются в трёхмерный массив, где первые два элементы это координаты а третий элемент это массив индексов вершин. Массив по сути является координатной сеткой, и зная координаты, можно без проблем определить какой квад требуется.

При рендере сцены, отображаются только те квады, которые в поле зрения.

Моя "физика" работает по похожему принципу (определяется над каким квадом глайдер и потом перебираются полигоны квада, для определания над каким полигоном он находится).

Проблема в том, что я реализовал определение того что полигон отноится к нужному кваду только если вершина(хотя бы одна) находится в области квада.

Прикрепления: 3579291.jpg (28.9 Kb)
 
YandersenДата: Сб, 25 Июл 2009, 13:11 | Сообщение # 19
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Что это такое, в двух словах, может я знаю что это, не знаю только название.
Не думаю. В общем, в OpenGL есть несколько режимов работы. Но не думаю, что тут тебе это щас нужно. Твоя задача действиетельно геометрией пахнет.
//---
Оки, стало яснее. Итак, задача - выбрать, какие части карты рисовать, чтобы не тратиться на отрисовку заведомо-невидимых кусков локации. Карту ты поделил на куски квадратной формы, и, как я понимаю, обще-говоря, мне доступны координаты 4-х углов каждого такого квадрата. Оки, тут чисто. А что насчёт математического определения "области зрения"? Как её можно охарактеризовать? В действительности, это усечённая пирамида. Правда, проще и не хуже будет её считать обычной 4-хугольной пирамидой с вершиной, координаты которой известны - положение наблюдателя. Можешь ли ты мне предоставить, к примеру, вектора, идущие вдоль рёбер этой пирамиды? Ну или хотя бы, как минимум, вектор направления взгляда и направление макушки (остальные нужные параметры, такие как AspectRatio и тангенс половинного угла перспективы, я могу выдрать из GL_PROJECTION_MATRIX - я знаю, как).
В общем, словами говоря, принцип намечается такой:
1) Пирамида зрения имеет 4 боковых грани, ограничивающих пространство, которое мы видим; эти грани - треугольники.
2) Зная координаты квадратов локации, мы можем легко посчитать уравнения 4-х линий, на которых лежат стороны этих квадратов.
3) Координаты точки пересечения линии и треугольника легко просчитываются. У нас 4 линии на каждый квадрат, и 4 треугольника, ограничивающих область видимости. Если квадрат попадает в пирамиду зрения, это значит, выполняются такие условия:
а. хотя бы одна из 4-х линий квадрата пересекает хотя бы один из треугов пирамиды зрения;
б. точка пересечения должна лежать между двумя вершинами квада, через которые линия проходит (линия ведь бесконечная!), а также внутри треуга (в действительности, мы найдём точку пересечения с плоскостью треугольника, а не с ним самим).

Т.е. ключ - не вершины проверять, а линии, через вершины проходящие. Мне нужно какое-то математическое определения области обзора. Какие данные можешь предоставить?

Добавлено (15 Июл 2009, 12:29)
---------------------------------------------
Стоп! А что если мы смотрим куда-то в середину области, т.е. границы пирамиды обзора не пересекают никаких граней квадрата вообще?

Сушь, я тут почитал команды
glSelectBuffer
glRenderMode
glInitNames
glLoadName
Так давай просто эти большие области отрендерим как GL_QUADS в GL_SELECT моде, присваивая каждому своё unsigned int имя, затем посмотрим, что попало в область отображения (проверим содержимое буфера имён) и так решим, что рисовать. Почитай про вышеописанные функции. ИМХО, это ОЧЕНЬ важная байда, которую ещё много раз можно будет применить в совершенно разных ситуциях, например при вычислении попаданий в отдельные части глайдера без просчётов геометрии вручную; выборе объектов мышкой и т.д.

Кстати, вот уже первая мысль: рендерить нужно будет не как квадраты, а как параллелепипеды, растягивая их по высоте от минимального значения высоты самой низкой впадины, содержащейся в области, до максимального значения пика самого высокого холма, находящегося на этой части локации - надеюсь, сам поймёшь необходимость такого расфлюстрачивания до крайних значений высот локации.


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:11 | Сообщение # 20
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Какие данные можешь предоставить?

Наверно любые: координаты вершин квада, положение наблюдателя, вектор камеры, угол обзора(вертик/гориз), дальность прорисовки.

А что-то ещё надо ?

 
YandersenДата: Сб, 25 Июл 2009, 13:12 | Сообщение # 21
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Смотри, почему 3D геометрия не поможет:

Это твой кусок локации. Представь, что наблюдатель, задрав нос смотрит на верхний пик горы. Тогда пирамида зрения не пересекает ни линии квада, ни его плоскость, ничего, кроме отдельных полигонов, торчащих внутри локации. Так что такое однозначное решение выходит - планеметрию юзать, как бы проецируя пирамиду зрения в плоский треугольник на плоскость карты XZ. Итак, от наблюдателя нужно вот что: координаты векторов, являющихся боковыми гранями треуга. Сможешь добыть?
Прикрепления: 8001720.gif (3.8 Kb)


[Беженец со Скаев]
 
YandersenДата: Сб, 25 Июл 2009, 13:12 | Сообщение # 22
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Точнее, во:

Нужны координаты (X,Z) точек квада A,B,C,D и наблюдателя O,L,M. Доступны?
Прикрепления: 8367068.png (6.4 Kb)


[Беженец со Скаев]
 
smt005Дата: Сб, 25 Июл 2009, 13:12 | Сообщение # 23
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Смотри, почему 3D геометрия не поможет:

Объясни как определить что полигон в пространстве, а остальное я сам.

Quote (Yandersen)
Нужны координаты (X,Z)
У меня Z это вертикальная ось(снизу вверх).

Quote (Yandersen)
Доступны?
Да.

// - определение коэфицента деления локации
deltaMatrixX = (maxX2 - minX2) / kMatrix;
deltaMatrixY = (maxY2 - minY2) / kMatrix;

Где maxX2, minX2, maxY2, minY2 - это граници локации.
kMatrix - это на сколько требуется поделить локацию.
deltaMatrixX и deltaMatrixY - это длина и ширина одного квада.

Индекс квада вычисляется так.
indexCoordX = GLint((PointX - minX2) / deltaMatrixX) +1 ; // индекс квада по X координате

Где PointX координата точки, надо отнять minX2 чтобы индекс в результате не оказался в минусе (смещение координат).

Добавлено (15 Июл 2009, 18:41)
---------------------------------------------
O,L,M это координаты полигона. Кстате, уравнение плоскости расчитывается один раз после загрузки модели.
A,B,C,D можно вычислить...

 
YandersenДата: Пн, 24 Авг 2009, 14:06 | Сообщение # 24
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Есть решение. Итак, нужно проверить, не пересекает ли одна из сторон треуга зрения (OL или OM) хотя бы одну из сторон квада ABCD.
За раз мы можем проверить лишь ОДНУ сторону квада (AB / BC / CD / DA) на пересечение с OL или OM. Пусть, мы щас проверяем сторону PQ, где P и Q - это переобозванные для универсальности A и B, или B и C, или C и D или D и A:

1) Найдём координаты векторов
p = {P}-{O};
q = {Q}-{O};
l = {L}-{O};
m = {M}-{O};
2) Заявлю так: если хотя бы одна из линий, лежащих на векторах l или m, пересекает отрезок PQ, тогда хотя бы одно из следующих равенств будет верно:
a) (pz*lx-px*lz)*(qx*lz-qz*lx)>0
b) (pz*mx-px*mz)*(qx*mz-qz*mx)>0

Вроде, так...

Добавлено (15 Июл 2009, 19:53)
---------------------------------------------
Но что если все четыре вершины квада внутри треуга зрения? Т.е. все четыре отрезка AB,BC,CD,DA не пересекают грани треуга, а находятся между ними? Вершины P и Q тоже нужно проверять! Т.е. ещё два неравенства нужны, проверяющие, не попадают ли вершины внутрь треуга. Для этого вот ещё два неравенства, верность хотя бы одного из которых покажет попадание одной из вершин:
c) (px*lz-pz*lx)*(pz*mx-px*mz)>0 //Проверка вершины P
d) (qx*lz-qz*lx)*(qz*mx-qx*mz)>0 //Проверка вершины Q

Добавлено (25 Июл 2009, 06:18)
---------------------------------------------

Quote (smt005)
Quote (Yandersen)
Узнал, как спирать из видеопамяти текстуру
Уже забываеш язык, не "спирать" а "спереть"! Шучу...
Что значит тз видеопамяти? Это как?
Quote (Yandersen)
Загружает в видеопамять текстуру из *.bmp файла:

Что, сразу делает текстуру резидентной (вроде так называется) ? Видюха не треснит если много/большие текстур будет ?

[Блин, хотелось, чтобы топик "Наши классы" вёлся как библиотека - документации да хеадеры - надо что-то - лезешь туда, быстро находишь нужный материал и вперёд. Но пошли комментарии, вопросы там же и т.д. smt005, может, почистишь, пока не слишком много нафлужено, и будем там в строгом виде постить? wink ]
"Что значит из видеопамяти?" Есть два типа текстур каждого вида: GL_TEXTURE_...D и GL_PROXY_TEXTURE_...D. Обычная текстура копируется в память видеокарты и сидит там. Т.е. ты можешь загрузить в обычную память текстуру из файла, затем послать её на видюху (glTexImage...D/gluBuild...DMipmaps) и удалить временное хранилище, куда загружал из файла. Прокси-текстуры не копируются в видюху, а сидят в обычной памяти, так что удалять хранилище в памяти ты не можешь. Однако так работать будет медленнее, поскольку каждый раз при обращении к текстуре она будет тягаться в видюху.
"Видюха не треснит если много/большие текстур будет ?" Не треснет физически, но что-то да случится. smile Возможно, видюха самостоятельно разместит не влазящие текстуры как прокси, и всё ограничится простым подтормаживанием. Нужно рационально рассчитывать размеры текстур - в видепамяти они хранится в несжатом виде, и размер текстуры примерно равен размеру bmpшки с картинкой. А для чего, по-твоему, видюхе n мегов видеопамяти? Это скоростная память, там хранятся дисплей-листы, текстуры, видеобуффера и многая другая видюшная байда, которая тасуется видюхой много тышч разов в секунду. wink
Прикрепления: 4925909.png (7.0 Kb)


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Пн, 24 Авг 2009, 14:08
 
YandersenДата: Пн, 24 Авг 2009, 14:08 | Сообщение # 25
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Народ, как Вы в Вижуалке арксинусы и арккосинусы вычисляете? В смысле, какой в ней инклюд прописываете и как функциовины называются?
У меня в Борланде заголовок <math.h> и функции называются "asin" и "acos", и возвращают угол измеренный в радианах. Надеюсь, в вижуалке также?
А, и заодно, функция вычисления квадратного корня там тоже также называется ("sqrt")?

З.Ы.:
Две недели векторочки крутил - нашёл наконец способ находить вектора переноса, поворота и угол поворота, необходимые для перехода от одной модельновидовой матрицы к другой. wacko Скоро смогу детальную анимацию фигнуть. happy


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Пн, 24 Авг 2009, 14:09
 
smt005Дата: Вт, 25 Авг 2009, 00:54 | Сообщение # 26
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Надеюсь, в вижуалке также?

Должно быть одинаково.
 
PA3UJIbДата: Ср, 26 Авг 2009, 15:34 | Сообщение # 27
1 Поколение
Группа: Основной состав
Сообщений: 105
Замечания: 0%
Статус: Offline
Quote (smt005)
Должно быть одинаково.

Так и есть, инклюд и все пучком
 
Форум "Механоиды 3" » Рабочий раздел. » Программирование » Программирование (Всё что НЕ относится к графике.)
  • Страница 1 из 1
  • 1
Поиск:


Хостинг от uCoz