Войти
ПрограммированиеФорумГрафика

PVS Расчёт.

#0
0:34, 19 июля 2010

Как расчитать PVS для секторов? Я пока вижу одно решение:

Трасируем от каждого портала сектора рекурсией луч из центра портала до центра других порталов - если луч нисчем не пересёкся то сектор виден из текущего портала, но тут конечно могут быть баги.
С вареантом трассировки из всех 4'х точек портала вобще не подходит так-как портал может быть внутри геометрии сектора( в большенстве случаев ).

Фейл при расчёте из центра порталов:
PVS_CenterCalculationFAIL | PVS Расчёт.
Фейл при расчёте из точек портала:
PVS_PointsCalculationFAIL | PVS Расчёт.

Как быть?
ЗЫ Сразу говорю еслиб была возможность это сделать с помощью GAPI, то я бы взял бы просто тест с помощью OcclusionQuery, но нужно обойтись без GAPI - в оффлайне, подручными средствами.


#1
8:09, 19 июля 2010

Ну рейкастами помоему точно фейл делать... Например с верхнего портала можно видеть и боковые ведь...

#2
9:55, 19 июля 2010

Executor, хотел в оффлайне всё расчитать, эх похоже придётся юзать без предрасчётов, через occlusion query отсекать...

#3
10:39, 19 июля 2010

Может попробовать строить фрустумы для каждого портала и по ним считать? или перебирать ВСЕ точки i-го портала и рейкастить ко ВСЕМ точкам j-го портала.

#4
11:19, 19 июля 2010

консервативный алгоритм может быть следующим:
1) строим вокруг текущего портала выпуклую 2D оболочку, например, прямоугольник (подойдёт и другая форма, для каждой грани которой можно определить противолежащую, в идеале - окружность);
2) проецируем оболочку на плоскость обрабатываемого портала, подгоняем масштаб, чтобы оболочка полностью покрывала портал;
3) строим frustum из плоскостей, проходящих через каждую грань оболочки текущего портала и противолежащую грань оболочки обрабатываемого портала - получается такой вывернутый наизнанку frustum - усекаем его плоскостью обрабатываемого портала;
3.1) в принципе, зная fov frustum'а, его форму можно оптимизировать по актуальной геометрии обрабатываемого портала, снизив, тем самым, консервативность;
4) всё, что попало в область видимости frustum'а, потенциально видимо через текущий портал;
5) рекурсивно повторяем алгоритм для всех порталов, попавших в область видимости frustum'а, с шага 2;
6) алгоритм повторяем для всех порталов текущего сектора с шага 1.

#5
11:46, 19 июля 2010

Igor'
> Executor, хотел в оффлайне всё расчитать, эх похоже придётся юзать без
> предрасчётов, через occlusion query отсекать...

А ты расчитай в оффлайне с помощью OQ... :)

#6
11:55, 19 июля 2010

Вообще-то классическим методом IMHO является использование anti-penumbrae и порталов. Именно так и рассчитывались PVS для Quake
anti-penumbrae - представьте, что комната вся залита светом - тогда через портал посчитаем какая часть сосденей команты будет освещена, потом попробуем "протащить" освещенность сразу через два портала и т.п.

ПрограммированиеФорумГрафика

Тема в архиве.