我正在寻找一个3D Java物理库,该库对于复杂但局部排序的对象将是有效的:这意味着该对象是由局部轴对齐的框组成的(请参见屏幕截图)。这是一款游戏,玩家可以创建任意形状的块状宇宙飞船,并且游戏可以得出逼真的碰撞形状(允许您在其中走来走去等)。

我正在寻找的物理引擎会具有以下内容


有效地支持由多达100个子形状组成的对象(我已经有代码可以找到表示对象的最小框数,并且通常以100个长方体结尾大小不同)
允许那些复杂的形状相互碰撞(不仅是复杂的碰撞还是简单的碰撞)
是3D库
在Java中是
使用礼物包装纸的任何东西不允许内部空隙的方法或类似方法不适合。
我尝试过的以前的物理引擎使用复合形状,如果潜在碰撞通过了宽相,则它们只是简单地测试了每个子形状与每个其他子形状。 100个子形状与100个子形状很快就杀死了该方法(我在看JBullet)。



我知道这是可能的;在某种程度上,因为我已经写过它,但是我的版本是空洞的,如果有的话,我想换一个更专业的物理引擎。

我以前使用过JBullet(在JMonkey中),这是Bullet Physics的Java端口,尽管它支持它,但并没有对其进行优化并令人讨厌。当两个这样的物体彼此靠近时,研磨停止。

评论

不知道您如何使用JBullet,但这可能会有所帮助。

@ Byte56这很有趣,看起来它可能比复合碰撞形状方法提供更好的性能

@ Byte56我想起了我上次使用jbullet“ java.lang.IllegalStateException:动态刚体不能具有网格碰撞形状!”的许多问题。这是我遇到的一个问题,因为我不是在创造一个《我的世界》世界(尽管它有明显的相似之处),而是一个动态块与动态块。某些基于您未接受的答案的方法可能会奏效,但是临时多维数据集方法对我而言行不通(至少效率不高),因为没有一个地方可以知道多维数据集提前移到任何地方

是的,该方法仅真正适用于不移动的物体。可以即时修改网格,但移动效果不佳。如果图像中的物体四处移动和碰撞,则可能无法正常工作。动态,复杂的凹形物体的物理性质将变得非常困难。祝你好运。您最好的选择可能是找到某种方法来伪造它。

@ Byte56至少鼓舞了我,使我自己的实现变得不那么麻烦了。知道没有一个我可以忽略的“现成”解决方案

#1 楼

披露:我没有尝试过,但是我认为这符合您的标准:
https://github.com/tzaeschke/ode4j

这是ODE的Java端口,声称支持大多数网格组合之间的碰撞:
https://www.ode-wiki.org/wiki/index.php?title=Manual:_All&printable=yes

我在该领域的知识和有关您的用例的信息太有限,无法确定,但是此链接包含功能概述和冲突矩阵,可以帮助您确定是否满足您的需求。