带有边界框的XNA碰撞检测
本文关键字:XNA 碰撞检测 边界 | 更新日期: 2023-09-27 18:23:54
我们正在XNA中构建FPS,并且正在实现碰撞检测。我们的墙是矩形的,所以BoundingBox类似乎是一个不错的选择,但它是轴对齐的。我们真的希望有非轴线对齐的墙。我们看到的大多数讨论都说使用BoundingSpheres,但这似乎不是最好的选择,因为墙实际上只是旋转的矩形。
我们已经成功地将角色的移动建模为光线,我们知道我们应该能够使用旋转矩阵将这些光线从世界空间转换到轴对齐的长方体空间。不幸的是,我们认为这种转换有问题,因为我们似乎与不可见(或更大)的墙发生了碰撞,而我们的光线生成适用于楼层交叉点(无论如何都不会旋转)。我们使用射线的唯一原因是,它们很容易生成,应该很容易转换到长方体的空间中,并且我们可以使用XNA类,如轴对齐的边界框,用于实际的碰撞检测。
我们是这样实现的:
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)形成。传递到碰撞中的光线在世界空间中。Transform也是应用于我们的模型进行渲染的矩阵。这个模型是一个从(-5,-5,-5)到(.5,.5,.5)的立方体
无论如何,我们的问题可以归结为几件事:是否有更好的方法来针对光线对非轴对齐的长方体进行碰撞检测?有比使用射线更好的方法吗?我们只是代码明显有问题的白痴吗?如果可能的话,我们希望尽可能多地依赖XNA的类(或者至少是已经编写的代码),而不必编写更多的包装类。
好吧,如果你试图旋转矩形(2d)并保持碰撞检测,那么我有一个答案。当我学习Xna时,我使用了矩形。你可以在你的纹理矩形中有很多小矩形,并为每次碰撞检测碰撞。