2012-02-08 2 views

ответ

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

0

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

+0

Спасибо, это более легкое решение;) – sindney

+0

Он также даст ложные срабатывания. Если BB тощий, ограничивающая сфера может иметь объем в сотни раз больше BB. BB (в общем) приближение, теперь вы приближаетесь к приближению ... – cmannett85

+0

Да, вы правы, только что поняли неправильный результат при расчете как bbox, так и bsphere для Plane Mesh. – sindney

Смежные вопросы