Java与3D obj模型的碰撞检测

3
我找了很多资料,只发现如何检查2D物体的碰撞。对于我的当前项目,我想检测3D物体的碰撞(我正在使用OBJ模型)- 可能我可以自己解决问题,但问题是我只知道每个物体的中心点..。
有没有办法获取对象的边界,以便我可以检查它是否接触到另一个对象的边界?获取此信息的最佳方法是什么?
编辑:一些可能有用的信息:
我正在使用LWJGL 2.8,
我的对象是OBJ文件,
我可以获得对象的位置、缩放和旋转
编辑:这是我在Youtube上找到的东西: https://www.youtube.com/watch?v=Iu6nAXFm2Wo&list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0&index=4

你是否使用任何库或框架,还是只想要Java中的原始代码?答案在很大程度上取决于您如何表示您的3D对象。 - Sebastian
我正在使用lwjgl进行OpenGL编程。obj文件只是由顶点坐标组成的网格。如果这些信息不足够,请告诉我您需要了解什么其他信息。 - DisasterCoder
你的模型是否有顶点信息?如果有,你可以遍历所有顶点并找到每个维度的最小值和最大值,然后生成一个边界框,以便后续检测使用。 - Sebastian
我可以用Notepad++打开obj文件并在那里查看所有顶点坐标.. 但是不知道如何在代码中获取它们.. 我可以添加我的网格和obj类,也许您知道该怎么做..? - DisasterCoder
我在我的代码中看到了一些Obj index类(来自教程),还有一个GetVertexIndex方法,我能用它做些什么吗?哦,在我的objmodel类中还有一个读取obj文件的方法。 - DisasterCoder
1个回答

0
你所拥有的是一个三角形网格[1]:其中包含了顶点位置、纹理和法线信息,以及三角形信息。你可以对两个网格中的每个三角形进行相交测试。你可以通过暴力方法(每次测试所有其他三角形)或构建空间划分数据结构来加速相交测试。
例如,为每个网格构建一个八叉树,并在其中一个网格的叶子节点上进行迭代:对于这些叶子节点中的每一个,将其边界框与另一个树中的叶子节点进行碰撞检测,并对每个碰撞对中的三角形进行暴力测试,以确定它们是否相交(如果您不关心自相交,则只需测试网格A中的三角形与网格B中的三角形)。

有一些针对这种算法的库,例如OpenMeshBullet。但是我只知道一个Java移植版本:JBullet

编辑:如果您只对近似碰撞感兴趣,可以丢弃有关三角形的所有信息,并从顶点构建边界体积(例如,轴对齐盒只是所有顶点位置的最小值和最大值,定向盒类似地构建,但必须先找到足够好的方向,球体 稍微复杂,最后有一个凸网格,它使用与正常网格相同类型的交点测试,但比原始网格小而且是凸的,允许进行一些通用交点测试的优化)。

[1]: 还有其他类型的3D表示,记录三角形如何连接的信息。你可以想象在网格A和网格B中只找到两个相交的三角形,然后开始仅在初始交点附近搜索相交的三角形...这些算法要复杂得多,但对于变形的网格而言,它们具有优势,因为您不必像处理三角形组那样每次重新构建空间分割数据结构。


谢谢,您可以指向一些相关的教程吗?或者您自己能否给出一个示例,因为我肯定不知道如何独立编写代码来解决这个问题。 - DisasterCoder
@DisasterCoder 可以尝试使用JBullet,但是欢迎来到编程的难点:缺乏高质量的关于复杂算法的教程,这就是3D计算机图形学的精髓 ;) - BeyelerStudios
哦,谢谢。我找到了一个教程,可以帮助我做我想做的事情——其实并不难,只需要知道在哪里寻找;)感谢你的帮助! - DisasterCoder
@DisasterCoder 很酷,也许你可以在你的问题中附上教程链接,方便其他人查找 ;) - BeyelerStudios
是的,这更像是一个物理教程,但碰撞检测也在其中... 在这里:https://www.youtube.com/watch?v=Iu6nAXFm2Wo&list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0&index=4 它是cpp,但它也适用于java.. - DisasterCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接