1

我不清楚如何设置它,在这种情况下我需要盒子而不是球体,因为我想知道激光是否在我的 3D 场景中击中了敌舰。这是我的球体代码,我将如何将其更改为边界框。因为如果我将球体用于激光,即使距离实际激光很远,球体也会很大并且会撞到一艘船。我要问的是如何以这种方式设置边界框。

private bool Cannonfire(Model model1, Vector3 world1, Model model2, Vector3 world2)
        {
            for (int meshIndex1 = 0; meshIndex1 < model1.Meshes.Count; meshIndex1++)
            {
                BoundingSphere sphere1 = model1.Meshes[meshIndex1].BoundingSphere;
                sphere1.Center = world1;
                for (int meshIndex2 = 0; meshIndex2 < model2.Meshes.Count; meshIndex2++)
                {        
                    BoundingSphere sphere2 = model2.Meshes[meshIndex2].BoundingSphere;
                    sphere2.Center = world2;
                    if (sphere1.Intersects(sphere2))
                        return true;
                }
            }
            return false;
        }   

那么我该怎么做谢谢你的帮助。

4

1 回答 1

1

听起来您需要的是可用于在 XNA 中与 BoundingSpheres 和 BoundingBoxes 相交的 Rays。它们本质上是一条直线或梁,您可以通过将起始位置和方向传递给构造函数来指定它。然后,您可以调用 Intersects 方法并传入 BoundingBox 或 Sphere。在您的示例中,它将是这样的。

Ray laserBeam = new Ray(startingPosition, direction);
laserBeam.Intersects(shipBoundingSphere);

请注意, intersects 返回一个可为空的浮点值。如果没有碰撞,则为 null,如果有碰撞,则为指示与 Rays startingPosition 的距离的浮点值。

此浮点值可用于计算出您的哪些潜在目标最接近射线,例如,您循环穿过您的船只,其中一艘船与浮动值 3 发生碰撞,而另一艘与浮动值 5 发生碰撞。您知道这艘船值 3 最接近激光束源,因此您可以忽略其他值。

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.ray.intersects.aspx

于 2013-03-04T15:38:38.253 回答