Создание BoundingFrustum из 8 углов - PullRequest
2 голосов
/ 20 января 2012

XNA содержит класс BoundingFrustum, который определяет усеченный контур и облегчает столкновения с лучами и другими объектами.Тем не менее, Frustum может быть построен только с матрицей.У меня есть определенный объект, который создан в форме усеченного конуса с использованием 8 вершин;какую Матрицу я должен создать из этих вершин, чтобы создать Frustum для ее представления?

Рассматриваемый объект - это кусок сферы - 4 точки на поверхности сферы в форме квадрата, простираясь вниз в начало сферы.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Благодаря вдохновению Ника и помощи друга, я смог написать этот класс, представляющий область, определяемую 8 точками с плоскими сторонами, например усеченный или куб.

Вот класс .

Важно отметить, что при передаче параметров конструктора вы выбираете точку обзора, из которой вы можете просмотреть свой регион и придерживаться его.

Надеюсь, что это поможет любому другому, кто может столкнуться с этой (неясной) проблемой, решить.

2 голосов
/ 21 января 2012

Обычно для использования BoundingFrustum вы передаете ему матрицу, которая является матрицей вида, умноженной на матрицу проекции:

BoundingFrustum frustum = new BoundingFrustum(this.viewMatrix * this.projectionMatrix);

Нет простого способа использовать этот класс для выполнения того, что вы описываете, если только вы не обладаете особыми навыками создания матрицы вручную, которая объединяет то, что обычно находится в матрице вида и матрице проекции, в нечто, представляющее ваши 8 углов.

Я бы порекомендовал написать алгоритм для решения вашей проблемы.

// Do something like this for all 8 sides of the frustum, if the sphere lies outside
// of any of the 8 sides then it isn't in the frustum.

// Each plane will have a normal direction (the direction the inside is facing)
Vector3 normal = Vector3.UnitY;

// Creates a plane
Plane plane = new Plane(normal, 20.0f);

BoundingSphere sphere = new BoundingSphere(Vector3.Zero, 10.0f);

// This type is an enum that will tell you which side the intersection is on
PlaneIntersectionType type = sphere.Intersects(plane);
...