带边界框的XNA碰撞检测

时间:2012-02-08 22:58:57

标签: c# collision-detection xna-4.0 raytracing

我们正在XNA中构建FPS,我们正在实施碰撞检测。我们的墙是矩形的,所以BoundingBox类似乎是一个不错的选择,但它的轴是对齐的。我们真的很想拥有非轴对齐墙。我们所看到的大部分讨论都说使用了BoundingSpheres,但这似乎不是最佳选择,因为墙壁实际上只是旋转的矩形。

我们设法将角色的运动建模为光线,我们知道我们应该能够使用旋转矩阵将这些光线从世界空间转换到轴对齐的框空间。不幸的是,我们认为这种转变有些不对劲,因为我们似乎与不可见(或不知何故更大)的墙壁相撞,而我们的光线生成适用于地板交叉点(无论如何都不旋转)。我们使用光线的唯一原因是因为它们易于生成,应该很容易转换到盒子的空间,我们可以使用XNA类,如Axis Aligned BoundingBoxes进行实际的碰撞检测。

我们已经实现了这样:

internal float? collide(Ray ray) {
  Matrix transform = Matrix.Invert(Transform);
  ray.Direction = Vector3.Transform(ray.Direction, transform);
  ray.Position = Vector3.Transform(ray.Position, transform);
  return new BoundingBox(new Vector3(-.5f, -.5f, -.5f), new Vector3(.5f, .5f, .5f)).Intersects(ray);
}
public Matrix Transform { get { return Matrix.CreateScale(size) * rotate * Matrix.CreateTranslation(pos); } }

Rotate在构造函数中传递,并通过调用Matrix.CreateRotationY(theta)形成。传入碰撞的光线位于世界空间。变换也是应用于我们的渲染模型的矩阵。这个模型是一个从(-.5,-.5,-.5)到(.5,.5,.5)的立方体。

无论如何,我们的问题归结为以下几点:是否有更好的方法对非轴对齐盒子进行碰撞检测?有没有比使用光线更好的方法呢?我们的代码显然是错误的,我们只是白痴吗?如果可能的话,我们希望尽可能多地依赖XNA的类(或者至少是已经编写过的代码),而不是写一个包装类。

1 个答案:

答案 0 :(得分:0)

好吧,如果你试图旋转矩形(2d)并保持碰撞检测,那么我有一个答案。当我学习Xna时,我使用了矩形。您可以在纹理矩形中包含许多小矩形,并检测每次碰撞的碰撞。