Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 26.09.2012, 23:46   #1
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Вопрос Скрытие объектов за стенами

Народ, выручайте....
Пробовал браться за это, но выходит либо сущая говнота, либо просто знаний матана не хватает...
Может есть какие - нибудь либы для этого? Рад буду даже хоть самому алгоритму...
__________________


(Offline)
 
Ответить с цитированием
Старый 27.09.2012, 00:00   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Скрытие объектов за стенами

гугли по словам occlusion culling, способов много.
(Offline)
 
Ответить с цитированием
Старый 27.09.2012, 00:02   #3
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Скрытие объектов за стенами

Эм. "пик" встретит стену. И думаю тема не полностью раскрыта.
(Offline)
 
Ответить с цитированием
Старый 27.09.2012, 00:10   #4
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Скрытие объектов за стенами

Окей, раскрываю
У меня есть меш за стеной, и, допустим, баундинг бокс в виде куба.
Нужно сделать так, чтобы меш хайдился, если баундинг бокс полностью загорожен. EntityVisible - вообще убило меня, так как он проверяет на видимость ЦЕНТР ентити - бред...
__________________


(Offline)
 
Ответить с цитированием
Старый 27.09.2012, 07:32   #5
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Скрытие объектов за стенами

Сообщение от Кирпи4 Посмотреть сообщение
Окей, раскрываю
У меня есть меш за стеной, и, допустим, баундинг бокс в виде куба.
Нужно сделать так, чтобы меш хайдился, если баундинг бокс полностью загорожен. EntityVisible - вообще убило меня, так как он проверяет на видимость ЦЕНТР ентити - бред...
юзать порталы и\или антипорталы (оклудеры).

порталы, грубо говоря, это полигоны описывающие проемы в стенах.

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

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

соответственно как происходит кулинг сцены:
пробегаем по порталам по иерархии видимости
режем полигон портала фрустумом ( ибо он можнт быть виден только частично, и чтобы правильный фрустум через него построить, нужно определить видимую часть этого портала )
строим новый фрустум из урезанного полигона

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

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

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

антипорталами может выступать любая геометрия. Принцип тот же самый - строим через окклудер фрустум, и все что в него входит уже наоборот - скрывается. Если геометрия окклудера сложная ( т.е. не просто полигон, а например куб ), то сначала надо определить силуэтные вершины ( минимальные\максимальные по проекции на плоскость камеры ), и по ним уже построить фрустум так-же, как описал выше для портала.

ЗЫ
извиняюсь за этот поток сознания писал в спешке, попзжа подробнее опишу, если надо конечно.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Platon за это полезное сообщение:
Dzirt (27.09.2012), HolyDel (27.09.2012), Mr_F_ (28.09.2012), Черный крыс (28.09.2012)
Старый 27.09.2012, 18:40   #6
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Скрытие объектов за стенами

Надо, надо, конечно надо =)
__________________


(Offline)
 
Ответить с цитированием
Старый 28.09.2012, 02:46   #7
Черный крыс
 
Сообщений: n/a
Ответ: Скрытие объектов за стенами

Мне кажется, аффтар больше половины из сказаного не понял.
 
Ответить с цитированием
Старый 28.09.2012, 11:06   #8
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Скрытие объектов за стенами

"рисуем" геометрию в буфер глубины
"рисуем" другие порталы в буфер без записи, но с тестом и определяем виден он или нет
добавляем видимые порталы, соответственно стороне, в две ветки текущего портала
рисовать придётся видимо не 1 раз? т.к. даже если с огромным фовом отрендерить кадр в направлении портала, не факт что у нас в нём растеризуются другие порталы, которые очень по бокам.
наверное надо будет 5 раз рендерить, аля полукуб, чтобы со всех сторон потенциально видимые увидеть.
алсо, вместо софтварного растеризатора, эффективнее было бы юзать occlusion queries.
насчет "режем полигон"
хм, я тупо делал фрустум из позиции камеры и точек портала (их было всегда 4), в принципе достаточно получить описывающий прямоугольник портала в экране и поплющить направление/фов фрустума, чтобы через него шёл.
(Offline)
 
Ответить с цитированием
Старый 28.09.2012, 12:37   #9
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Скрытие объектов за стенами

Сообщение от Кирпи4 Посмотреть сообщение
Надо, надо, конечно надо =)
Я ожидал что будут какие-то вопросы направляющие, а то я вот даже незнаю что подробнее объяснить

Сообщение от Mr_F_ Посмотреть сообщение
рисовать придётся видимо не 1 раз? т.к. даже если с огромным фовом отрендерить кадр в направлении портала, не факт что у нас в нём растеризуются другие порталы, которые очень по бокам.
наверное надо будет 5 раз рендерить, аля полукуб, чтобы со всех сторон потенциально видимые увидеть.
алсо, вместо софтварного растеризатора, эффективнее было бы юзать occlusion queries.
Рисовать 1 раз, ибо рисуем не через фрустум, а просто все что с одной стороны портала ( определяем чо с какой стороны находится относительно плоскости портала, как для BSP разделяющая плоскость короче ).
Насчет окклюжн квери - хороший вариант, но я предпочитаю велосипеды )

Сообщение от Mr_F_ Посмотреть сообщение
хм, я тупо делал фрустум из позиции камеры и точек портала (их было всегда 4)
Если портал виден чуть-чуть, то получишь оверхед, ибо фрустум будет через весь портал, и соответственно будет рисоваться то что не видно из камеры. Для маленьких порталов может и лучше будет, не надо будет тратить время на обрезку, и через такой портальчик видно мало. Но для больших порталов уже сомнительно.

Сообщение от Mr_F_ Посмотреть сообщение
в принципе достаточно получить описывающий прямоугольник портала в экране и поплющить направление/фов фрустума, чтобы через него шёл.
Ну можно и так, если портал не сильно сложный по форме, иначе такое огрубление прямоугольником может не окупится.

ЗЫ
Пока парочку картинок прикреплю для топикстартера, надеюсь они немного прояснят хрень в 5ой мессаге

На первой изображены некоторые варианты кулинга через порталы:
рис. 1 - порталов нет, обычный вариант кулинга через камеру
рис. 2 - один портал, полностью виден из камеры, темно-синим виден новый фрустум построеный через портал
рис. 3 - тот же вариант, только камеру немного повернули, портал теперь виден частично, ярко-красным - портал обрезаный фрустумом камеры
рис. 4 - вариант посложнее, тут уже проглядывается иерархия порталов

на второй схематично построение фрустума через полигон портала
p0 - точка камеры
p1 .. p6 - точки полигона портала
E1 .. E6 - ребра полигона, проходясь по которым строим плоскости фрустума
V1 .. V6 - вектора, построенные через точки портала от точки камеры
для каждой плоскости фрустума надо найти нормаль ( направление плоскости ) и смещение относительно центра координат.
внизу справа изображено что из себя представляет нормаль и смещение на примере треугольника ( которые и получаются по ходу расчета фрустума )
внизу слева - как считается

Ну а вообще всю эту тему можно долго мусолить, поэтому желательно чтобы были какие-то вопросы конкретные
Миниатюры
Нажмите на изображение для увеличения
Название: PortalCases.PNG
Просмотров: 778
Размер:	27.6 Кб
ID:	17690  Нажмите на изображение для увеличения
Название: PolygonFrustum.PNG
Просмотров: 833
Размер:	35.0 Кб
ID:	17691  
(Offline)
 
Ответить с цитированием
Старый 28.09.2012, 14:03   #10
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Скрытие объектов за стенами

чем ребристее фрустум - тем дольше будет проходить проверка на принадлежность ему. прилегких дипах может быть дешевле брать четырехугольные фрустумы.
(Offline)
 
Ответить с цитированием
Старый 28.09.2012, 18:15   #11
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Скрытие объектов за стенами

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

А, ещё вот: можно ли как-нибудь произвести пик из DLL на пуряке?
__________________


(Offline)
 
Ответить с цитированием
Старый 28.09.2012, 18:57   #12
Черный крыс
 
Сообщений: n/a
Ответ: Скрытие объектов за стенами

Сообщение от Кирпи4 Посмотреть сообщение
А, ещё вот: можно ли как-нибудь произвести пик из DLL на пуряке?
Вытащить адрес нужной функции с последующим вызовом.
 
Ответить с цитированием
Старый 28.09.2012, 21:28   #13
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Скрытие объектов за стенами

Ну что я могу сказать - технология охренительная, но не по блицевским меркам это.
да ну, я как раз первый раз делал их именно на блице)
прирост фпс - был (кроме блица участвовал ксорс, толстые шейдеры и слабая видюха).
(Offline)
 
Ответить с цитированием
Старый 30.09.2012, 08:57   #14
Черный крыс
 
Сообщений: n/a
Ответ: Скрытие объектов за стенами

На блице разумнее всего сделать секторную систему, библиотека есть где то, ее написал Мад-Медик.

А насчет остального - зачем обьяснять такие вещи если всеравно на блице этого не реализовать ? Остальное будет либо геморой либо в виду закрытости движка будет вообще нереализуемо.
 
Ответить с цитированием
Старый 30.09.2012, 17:34   #15
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Скрытие объектов за стенами

на блице этого не реализовать
если руки кривые, то да.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FREE MAN (30.09.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 05:20.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com