Отбор Frustum, когда Bounding Box действительно большой - PullRequest
3 голосов
/ 08 февраля 2012

see

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

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

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

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(), а затем сопоставляете их с использованием знака нормальных компонентов плоскости.

0 голосов
/ 09 февраля 2012

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

...