Приветствую!
Решаю задачу поиска ближней и дальней плоскости отсечения для сцены.
Дано:
- фрустум наблюдателя заданный шестью плоскостями;
- AABB объектов сцены (рассмотрим случай одного объекта).
Простое решение:
- Инициализирую фрустум с zNear = FLT_MAX, zFar = 0 (пустой фрустум)
- Для каждого AABB тупо нахожу nearestPoint и farestPoint относительно точки позиции камеры. Z координаты этих точек во ViewSpace будут расстояниями по которым можно расширить zNear и zFar фрустума, чтобы "ужать" сцену.
Требуется:
Данный алгоритм работает, если AABB находится внутри фрустума. Если AABB частично внутри фрустума, как на картинке (рассмотрен вариант с zNear)
то zNear будет не совсем корректным, и мы захватим больше пространства, чем хотелось бы. Хотелось бы найти точку обозначенную знаком ?.
Возможно ли это сделать, не пребегая к пересечению фрустума и AABB, ничего не разрезая, а более простым способом?
Кержаков ?
AMM1AK
> farestPoint
Far — это слово-исключение, его степени — это farther и farthest.
AMM1AK
> Возможно ли это сделать, не пребегая к пересечению фрустума и AABB, ничего не разрезая, а более простым способом?
Можно разбить AABB на более мелкие и проверять их. Только зачем все это?
Имбирная Ведьмочка
Thanks:) забыл
0xc0de
Так чтобы корректно считать near-far для камеры.
Иначе, если у меня под ногами пол (большой плоский меш), то near всегда получается 0, который потом отсекается до какого-то minZNear, конечно, хоты по факту во фрустуме до пикселей пола приличное расстояние.
В принципе, появилась идея протыкать каждую боковую плоскость фрустума рёбрами aabb, и среди интерсекшенов брать самый ближний и дальний. Ещё не заимлементил, но на бумаге вроде выглядит правильно.
AMM1AK
Фрустум может пересечь одну сторону бокса, не пересекая его вершины и ребра
AMM1AK
Можно отрендерить сцену в 1 пиксел и в вершинном шейдере записать min/max Z
Тут верно советовали использовать octree