ПрограммированиеФорумОбщее

Поиск Z near far Фрустума

#0
1:06, 14 июля 2024

Приветствую!
Решаю задачу поиска ближней и дальней плоскости отсечения для сцены.
Дано:
  - фрустум наблюдателя заданный шестью плоскостями;
  - AABB объектов сцены (рассмотрим случай одного объекта).
Простое решение:
  - Инициализирую фрустум с zNear = FLT_MAX, zFar = 0 (пустой фрустум)
  - Для каждого AABB тупо нахожу nearestPoint и farestPoint относительно точки позиции камеры. Z координаты этих точек во ViewSpace будут расстояниями по которым можно расширить zNear и zFar фрустума, чтобы "ужать" сцену.
Требуется:
Данный алгоритм работает, если AABB находится внутри фрустума. Если AABB частично внутри фрустума, как на картинке (рассмотрен вариант с zNear)

+ Показать

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

#1
18:32, 15 июля 2024

Кержаков ?

#2
3:58, 16 июля 2024

AMM1AK
> farestPoint
Far — это слово-исключение, его степени — это farther и farthest.

#3
9:38, 16 июля 2024

AMM1AK
> Возможно ли это сделать, не пребегая к пересечению фрустума и AABB, ничего не разрезая, а более простым способом?

Можно разбить AABB на более мелкие и проверять их. Только зачем все это?

#4
15:41, 16 июля 2024

Имбирная Ведьмочка
Thanks:) забыл

#5
15:44, 16 июля 2024

0xc0de
Так чтобы корректно считать near-far для камеры.
Иначе, если у меня под ногами пол (большой плоский меш), то near всегда получается 0, который потом отсекается до какого-то minZNear, конечно, хоты по факту во фрустуме до пикселей пола приличное расстояние.

#6
15:47, 16 июля 2024

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

#7
20:13, 17 июля 2024

AMM1AK
Фрустум может пересечь одну сторону бокса, не пересекая его вершины и ребра

#8
(Правка: 7:44) 7:40, 18 июля 2024

AMM1AK
Можно отрендерить сцену в 1 пиксел и в вершинном шейдере записать min/max Z
Тут верно советовали использовать octree

ПрограммированиеФорумОбщее