Отбор 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 плоскостей усеченного конуса. Если один из них меньше радиуса сферы, включите ваш объект в список отображения.