Попытка получить хотя бы очень простую часть 1 учебника Lighthouse3D Radar 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 ссылки ref? Потому что в учебнике они пишут: «Обратите внимание, что ссылка на рисунке - это не правая система (как в OpenGL), потому что ориентация Z была изменена, чтобы сделать учебник более интуитивным» - ну, в учебнике GL конечно, это имеет обратный эффект ...
Что ж, если перевернуть Z, как указано выше, он будет отбраковывать больше, чем нужно, примерно в 50% случаев; если я этого не сделаю, то в 98% случаев он "перебраковывает" ..
Что мне не хватает?
cam.Controller.dir
- линия прямой видимости (вектор, по которому ориентируется камера)? Если это так, вы не хотите отрицать z. Предполагая, что и ваша камера, и точка находятся в мировых координатах (то есть со всеми примененными к ним преобразованиями [например, переводы, шкалы и т. Д.]), За исключением отрицания Z, остальная часть вашей математики выглядит разумной. Переворачивание Z сделает ваш скалярный продукт отрицательным, что, похоже, приведет к отбраковке почти всех ваших очков, если ваши ближние и дальние значения положительны. - person radical7   schedule 08.03.2013