"Радарный подход" к Frustum Culling: провалиться с первого простого теста?
Пытаясь заставить по крайней мере очень простую часть 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% случаев..
Чего мне не хватает?
1 ответ
Решено. Причиной была неисправность мозга... в учебном пособии четко написано о том, как сначала получить оси x/y/z для описания усеченного конуса, почему-то я это упустил..