2013-03-07 6 views
6

Попытка получить хотя бы очень простой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% времени.

Чего мне недостает?

+0

Я считаю, что все _z_ координаты должны действовать одинаково. (например, v.z также должны быть зеркалированы.) –

+0

Что такое 'cam.Controller.dir' - линия прямой видимости (вектор, на который ориентирована камера)? Если это так, вы не хотите отрицать z. Предположим, что и ваша камера, и точка находятся в мировых координатах (т. Е. Со всеми преобразованиями (например, переводит, масштабирование и т. Д.), Применяемыми к ним), кроме отрицания Z, остальная часть вашей математики выглядит разумной. Реверсирование Z сделает ваш точечный продукт отрицательным, что, похоже, приведет к тому, что почти все ваши точки будут отобраны, если ваши близкие и дальние значения будут положительными. – radical7

ответ

1

Решено. Причина была в сбое в работе мозга ... учебник четко пишет о получении осей x/y/z вначале для описания усеченного конуса, как-то я пропустил это.

+0

Вы можете принять свой собственный ответ, чтобы отметить этот вопрос как разрешенный :) – nemo