XNA包含一个BoundingFrustum类,它定义了一个平截头体,并促进了与光线和其他对象的碰撞。但是,Frustum只能用Matrix构建。我有一个使用8个顶点以平截头体形状创建的特定对象;我应该从这些顶点创建什么样的Matrix才能创建Frustum来表示它?
有问题的物体是球体的一大块 - 球体表面上的4个点,呈正方形,向下延伸到球体的原点。
答案 0 :(得分:2)
通常使用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);
答案 1 :(得分:2)
感谢Nic的灵感和朋友的帮助,我能够写出这个代表由8个点组成的区域,这个区域有平坦的边,如平截头体或立方体。
重要的是要注意,在传递构造函数参数时,您可以选择一个有利位置来查看您的区域并坚持使用它。
希望这可以帮助任何可能遇到这个(模糊的)问题的人解决。