"Радарный подход" к 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 для описания усеченного конуса, почему-то я это упустил..

Другие вопросы по тегам