Отбор Frustum, когда Bounding Box действительно большой

увидеть

Когда все 8 вершин ограничительной рамки находятся вне усеченного конуса, они не будут отображаться. Но если что-то случилось, как показано выше. Этот объект должен быть в списке отображения. Любая идея?

2 ответа

Решение

Потому что вы вычисляете пересечение, как если бы блок представлял собой группу точек, а не группу линий. Вот как я делаю это в псевдокоде:

inter = Inside
for ( plane : frustum ) {
    verts[2] = findOpposingPointsMostPerpendicularToPlane( box, plane )
    near = plane.signedDistance( verts[0] ) > 0.0
    far = plane.signedDistance( verts[1] ) > 0.0

    if ( !near && !far )
        inter = Outside
        break
    else ( near ^ far )
        inter = Intersecting
}

Если ваш ящик представляет собой AABB, вы создаете статический массив индексов вершин для findOpposingPointsMostPerpendicularToPlane() и затем сопоставьте их, используя знак нормальных компонентов плоскости.

Вычислите ограничивающую сферу из вашего bbox и проверьте расстояние от центра до каждой из 6 плоскостей усеченного конуса. Если один из них меньше радиуса сферы, включите ваш объект в список отображения.

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