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

Quadtree mesh и корректный frustum culling

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
(Правка: 21:20) 13:28, 15 сен 2022

В большинстве проектов используется frustum culling на основе бесконечных plane.
Это выливается в следующую проблему (особенно при использовании quad mesh)
Изображение
То есть если объект достаточно большой, то будет ложное положительное срабатывание.
В случае использования quad tree mesh с огромной площадью (например 10 километров), отбраковка просто не работает, потому что почти все квадраты имеют ложное срабатывание и не отбрасываются.

Собственно вопрос, почему об этой проблеме нигде нет информации? По всем гайдам quad tree mesh пробежался и нигде подобного не видел. Кто как с этим борется или просто никто не замечал?
Усложнять код отсечения не сильно хочется, да и не смог найти нормальный код пересечения frustum planes VS AABB, везде какие-то усложнения с полярными координатами, OOBB преобразованиями и т.д.

#1
13:44, 15 сен 2022

https://gamedev.ru/code/forum/?id=187937

#2
(Правка: 14:07) 13:56, 15 сен 2022

AMM1AK
> https://gamedev.ru/code/forum/?id=187937
Ну ответа на самом деле там так и нет, почему в квад мешах эту проблему всё игнорят. Они же не работают корректно практически всегда?

ps по твоей ссылке уже читал статью, там предлагают такой код

int out;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].x > box.mMaxX)?1:0); if( out==8 ) return false;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].x < box.mMinX)?1:0); if( out==8 ) return false;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].y > box.mMaxY)?1:0); if( out==8 ) return false;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].y < box.mMinY)?1:0); if( out==8 ) return false;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].z > box.mMaxZ)?1:0); if( out==8 ) return false;
    out=0; for( int i=0; i<8; i++ ) out += ((fru.mPoints[i].z < box.mMinZ)?1:0); if( out==8 ) return false;

Не разобрался что это за mPoints, это позиция вершин фрустума?
Ну и в целом, 48 итераций и 96 if только что бы дополнительно уточнить ложное срабатывание?
При 10 километрах и например 9 уровнях разделения (по 20 метров на минимальный квадрат), мне надо порядка 50-100 проверок, это как-то расточительно.

#3
(Правка: 14:22) 14:21, 15 сен 2022

По ссылке есть все ответы, будь внимательнее!
У тебя два варианта, чтобы получить что ты хочешь.
1) Использовать честный алгоритм box vs frustum. В котором проверяется не только нахождение бокса за одной из плоскостью фрустума, но и нахождение фрустума за одной из плоскостей бокса. Да, он массивнее и более трудоемкий в плане вычислений, но зато честный!
2) Забить на точность в угоду скорости и оставить по сути тот вариант, который используется у тебя.

#4
16:52, 15 сен 2022

Kripto289
> на основе бесконечных plane
Масло масляное. Плоскость всегда бесконечна.
Но по точкам пересечения плоскостей можно создать геометрическую фигуру. Именно так фрустум и визуализируется.

#5
16:54, 15 сен 2022

Kripto289
> В случае использования quad mesh с огромной площадью (например 10 километров)
Так технически это два треугольника?

#6
17:07, 15 сен 2022

g-cont
> Масло масляное. Плоскость всегда бесконечна.
Спорь не со мной, а с более осведомленными людьми.

A finite plane radiating surface

https://www.researchgate.net/figure/A-finite-plane-radiating-surf… ig1_236663416
Изображение

g-cont
> Но по точкам пересечения плоскостей можно создать геометрическую фигуру. Именно
> так фрустум и визуализируется.
А я спрашивал как он визуализируется?


g-cont
> Так технически это два треугольника?
Технически это AABB. Что за ряд вопросов не по теме?

#7
(Правка: 17:48) 17:48, 15 сен 2022

Kripto289
> Технически это AABB.
Так тебе написали уже, что проверять нужно с двух сторон. Сначала проверяешь что все точки AABB лежат снаружи одной из плоскостей фрустума. Если дало положительный результат, то проверяешь уже вершины фрустума относительно плоскостей AABB. Такой вариант тебе не подходит?

#8
(Правка: 19:07) 19:06, 15 сен 2022

MrShoor
> Так тебе написали уже, что проверять нужно с двух сторон. Сначала проверяешь
> что все точки AABB лежат снаружи одной из плоскостей фрустума. Если дало
> положительный результат, то проверяешь уже вершины фрустума относительно
> плоскостей AABB. Такой вариант тебе не подходит?
Так я и не спорю что нужно проверять, но вопрос был не в этом, а в том, почему в пейперах quadmesh никто почти об этом не говорит, хотя из-за этой проблемы он не будет работать правильно.
Ну, а второй вопрос был в том, кто и как в своих проектах это решает.

#9
21:10, 15 сен 2022

Kripto289
> почему в пейперах quadmesh никто почти об этом не говорит, хотя из-за этой проблемы он не будет работать правильно.
Потому что ложное неотбрасывание — это не ошибка, ошибкой является только ложное отбрасывание. А дальше все очень просто — обычно эффективнее отбросить простой проверкой 95% невидимых объектов, чем 99% сложной. Если у тебя слишком неудобные объекты для простой проверки, обычно гораздо лучше порезать их на части, чем усложнять проверку.

#10
(Правка: 21:19) 21:16, 15 сен 2022

Kripto289
Тут еще вопрос, верно ли отсекать большие обьекты, вроде ландшафта, по дальности, лучше поставить far plane в бесконечность. Ну а если уж хочешь, то в чем проблема добавить лишнюю плоскость
В пэйперах могут не писать, чтоб не усложнять код. Проверка пересечения box через sat и так довольно громоздкая, но можно сильно ускорить для уровней octtree - например, если уже посчитал что куб лежит целиком по одну сторону плоскости, то и все его подузлы будут также, их можно не проверять и там еще много трюков

#11
21:35, 15 сен 2022

}:+()___ [Smile]
> Потому что ложное неотбрасывание — это не ошибка, ошибкой является только
> ложное отбрасывание. А дальше все очень просто — обычно эффективнее отбросить
> простой проверкой 95% невидимых объектов, чем 99% сложной. Если у тебя слишком
> неудобные объекты для простой проверки, обычно гораздо лучше порезать их на
> части, чем усложнять проверку.

Aslan
> Проверка пересечения box через sat и так довольно громоздкая, но можно сильно
> ускорить для уровней octtree - например, если уже посчитал что куб лежит
> целиком по одну сторону плоскости, то и все его подузлы будут также, их можно
> не проверять и там еще много трюков

Да это имеет смысл. Достаточно проверить огромные уровни с точной проверкой frustum, а мелкие уровни уже быстрой проверкой.

#12
(Правка: 21:47) 21:41, 15 сен 2022

Kripto289
С огромными уровнями полюбому требуется лод и разбиения, без октри не обойтись
Еще трюк - бокс против плоскость:
(c-p,n)<=(fabs(n.x)+fabs(n.y)+fabs(n.z))*size

#13
22:27, 15 сен 2022

Aslan
А еще clipDistance и fogDistance.

#14
22:32, 15 сен 2022

lookid
Технологии из 90х?
Сейчас уже целые планеты рисуют

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумГрафика