3d边界框边界xna

所以,我正在尝试开发一款3d乒乓球游戏,而我在碰撞球和桌子时遇到了问题。 我有一个包围球的边界框,但是交叉点并不准确,我猜测边界框是不正确的,因为碰撞球和球拍是很好的。

我试图显示边界框,以便更容易看到错误的位置,但我似乎无法实现我的代码find的教程,或者只是不知道如何。 而且,因为我的桌子没有移动,所以我正确地创建了AABB? 如果有人能够帮助,那将是不胜感激,或者如果有人可以提出一个更好的方式来碰撞一个球(如果有的话)谢谢。 我粘贴了我的边界框检测,以及球体和框之间的碰撞。 如果需要更多的代码,我会发布它。 谢谢

http://pastebin.com/NDYmhXCh

http://pastebin.com/47vwJWSc

你创建边界框的代码是正确的,只要确保你进入了正确的世界变换,并通过创建它的时候设置的位置。 只要保持断点debugging,这可能是一个逻辑上的一个小错误。 你从哪里调用updateBoundingBox方法?

一个快速的提示,如果你想看看你是否正确创建了你的aabb而不渲染它,只需将你的球的位置设置为aabb.max.X或aabb.min.Y或更新方法中的类似的东西。 这将向您展示aabb的边界,而不需要为渲染创建代码。

那么,你在那里问几个不同的问题。 我将首先回答关于如何显示BoundingBox对象的debugging表示的主要问题。

如何呈现一个BoundingBox

我能想到的最简单的方法是获取边界框的角点并使用行列表原语来渲染它。 您可以使用BoundingBox.GetCorners()方法( 文档 )获取边界框的边角。 这个方法在世界空间中返回8个位置。 前四个代表边界框的前面,最后四个代表边界框的后面。

然后,只需为每个角落创建一个VertexPositionColor顶点,然后按照正确的顺序渲染它们之间的线条。 你是否使用索引取决于你。

不需要实现它,只需从教育目录中下载这个示例 ,将DebugShapeRenderer类添加到您的项目, Initialize它,最后使用提供的AddBoundingBox方法。 它几乎完成了我上面所描述的。

为表格创建BoundingBox

我是否正确地创建了一个AABB,因为我的桌子没有移动?

这是主观的。 如果使用上面的debugging绘图代码检查出边界框正在计算正确后,请随时使用它。

但就我个人而言,在这种情况下,我只是手动创建边界框,以便更好地控制碰撞区域。 类似下面的代码(使用1个游戏单位= 1厘米作为比例):

 class Table { Vector3 size = new Vector3(152.5f, 274f, 5f); float height = 76f; Vector3 position = Vector3.Zero; BoundingBox boundingBox; public Table() { Vector3 min = position + Vector3.Up * height - size / 2f; Vector3 max = position + Vector3.Up * height + size / 2f; boundingBox = new BoundingBox(min, max); } } 

我觉得这个方法总的来说简单得多。

更好的方式来执行碰撞

或者,如果有人可以提出一个更好的方法来碰撞一个球与一个盒子

我认为结合一个物理引擎如JigLibX( 链接 )会产生更好的结果,从长远来看为您提供更好的服务。 像这样的大多数应用程序的问题不是碰撞检测,而是碰撞响应,物理引擎真的让这个部门的生活变得更容易。