Попытка получить хотя бы очень простойpart 1 of the Lighthouse3D Radar Frustum Culling tutorial для работы ... и я абсолютно сбит с толку, что я даже не могу заставить эту часть работать в моем рендерере.«Радарный подход» к Frustum Culling: сбой при первом простом тестировании?
Итак, первый шаг: вы проверяете, находится ли точка перед ближайшей плоскостью или за дальним планом, и ранним отбросом, если это так. (Если нет, вы затем проводите дополнительные тесты, но я застрял именно с этой первой частью.)
Я использую центр мира (x1y2z3) куба 2x2 и имею камеру, которую я могу перемещать и вращаться свободно. Весь мой векторный и матричный материал должен быть достаточно прочным, поскольку рендеринг в противном случае работает отлично. Так вот мой взять (в Go) из первой части, простой «Z против ближнего или дальнего-» тестирования:
func (cam *Camera) frustumHasPoint(point *Vec3) bool {
var pc Vec3
v := point.Sub(&cam.Controller.Pos) // point minus camPos
ref := cam.Controller.dir // take a copy of camDir
ref.Z = -ref.Z
ref.Normalize() // camDir was already normalized but anyway...
pc.Z = v.Dot(&ref)
if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
return false
}
return true
}
Теперь, почему я обратный Z реф? Потому что в учебнике они пишут: «Обратите внимание, что ссылочка на рисунке не является правой рукой (как в OpenGL), так как ориентация Z была отменена, чтобы сделать учебник более интуитивным» - ну, в учебнике GL конечно, это имеет противоположный эффект ...
Хорошо, если сделать обратный Z, как указано выше, он отбирает больше, чем должен около 50% времени; если я этого не сделаю, то он «перевыполняет» около 98% времени.
Чего мне недостает?
Я считаю, что все _z_ координаты должны действовать одинаково. (например, v.z также должны быть зеркалированы.) –
Что такое 'cam.Controller.dir' - линия прямой видимости (вектор, на который ориентирована камера)? Если это так, вы не хотите отрицать z. Предположим, что и ваша камера, и точка находятся в мировых координатах (т. Е. Со всеми преобразованиями (например, переводит, масштабирование и т. Д.), Применяемыми к ним), кроме отрицания Z, остальная часть вашей математики выглядит разумной. Реверсирование Z сделает ваш точечный продукт отрицательным, что, похоже, приведет к тому, что почти все ваши точки будут отобраны, если ваши близкие и дальние значения будут положительными. – radical7