Xna 从8个角创建边界平截头体

Xna 从8个角创建边界平截头体,xna,xna-4.0,Xna,Xna 4.0,XNA包含一个BoundingFrustum类,该类定义了一个平截头体,并促进了与光线和其他对象的碰撞。但是,平截头体只能用矩阵构造。我有一个特定的对象,它是用8个顶点创建的一个平截头体形状;我应该从这些顶点创建什么样的矩阵才能创建一个圆台来表示它 所讨论的对象是球体的一块——球体表面上的4个点以正方形的形式向下延伸到球体的原点。通常要使用边界平截头体向其传递一个矩阵,该矩阵是一个视图矩阵乘以投影矩阵: boundingtrustum-trustum=新的boundingtrustum(this

XNA包含一个BoundingFrustum类,该类定义了一个平截头体,并促进了与光线和其他对象的碰撞。但是,平截头体只能用矩阵构造。我有一个特定的对象,它是用8个顶点创建的一个平截头体形状;我应该从这些顶点创建什么样的矩阵才能创建一个圆台来表示它


所讨论的对象是球体的一块——球体表面上的4个点以正方形的形式向下延伸到球体的原点。

通常要使用
边界平截头体
向其传递一个矩阵,该矩阵是一个视图矩阵乘以投影矩阵:

boundingtrustum-trustum=新的boundingtrustum(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);

通常,要使用
边界平截头体
可以向其传递一个矩阵,该矩阵是视图矩阵乘以投影矩阵:

boundingtrustum-trustum=新的boundingtrustum(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);

多亏了Nic的灵感和一位朋友的帮助,我才能够编写这个类,它代表了一个由8个点定义的区域,这些点的边是平的,比如平截体或立方体

需要注意的是,在传递构造函数参数时,您选择了一个有利的位置来查看您的区域并坚持使用它


希望这能帮助其他可能遇到这个(模糊的)问题的人解决。

多亏了Nic的灵感和一位朋友的帮助,我能够编写这个类,它代表一个由8个点定义的区域,该点有平面,例如平台或立方体

需要注意的是,在传递构造函数参数时,您选择了一个有利的位置来查看您的区域并坚持使用它


希望这能帮助其他可能遇到这个(模糊的)问题的人解决。

您只是想检查球体表面和正方形内部是否有东西,还是需要检查球体内部?内部也是。球体是由平截头体块组成的,我试着按块拾取。你只是想检查球体表面和正方形内是否有东西,还是你也需要检查球体的内部?以及内部。球体是由平截体块组成的,我试着按块拾取。我不确定是否使用平面交点来定义区域。这似乎相当复杂。我试图用一条射线与这个区域相交,所以我不会得到一个IntersectionType,但我想我可以用点积。。。因为平面和光线都是无限的,所以我认为很难有效地计算。此外,我想知道我是否可以使用球体的属性来构造该区域的视图和投影矩阵。我希望我知道更多关于这些矩阵是如何构造的。我不确定用平面交集来定义区域。这似乎相当复杂。我试图用一条射线与这个区域相交,所以我不会得到一个IntersectionType,但我想我可以用点积。。。因为平面和光线都是无限的,所以我认为很难有效地计算。此外,我想知道我是否可以使用球体的属性来构造该区域的视图和投影矩阵。我希望我知道更多关于这些矩阵是如何构造的。