我应该如何处理物理引擎中的微小物体?


13

我正在制作用于掷骰子的3D物理引擎。到目前为止,骰子为1x1x1m,重力为9.82 m / s ^ 2。当然,这看起来并不现实,因为骰子会以看起来有点慢的方式响应所有内容。

为了解决这个问题,我尝试仅改变所有尺寸以使骰子沿侧面大约0.02m。反过来,这使我的反质量和反惯性矩阵获得了非常大的值,从而导致了数值不稳定。

处理此问题的最佳途径是什么?我可以保持规模扩大,以使骰子为1x1x1并仅改变作用力的质量或大小吗?还是应该调整其他内容?

我猜如果您使用大型宇宙飞船或类似物体制作游戏时,可能会遇到同样的问题,因此我希望有人遇到过类似的问题。


我不是专家,但是如果没有任何代码,我们怎么知道出了什么问题?不过,我可能错了,因为Box2D存在相同的问题。
jcora

1
(看到所有支持者,必须有一种常规的编码方式,人们似乎知道您的问题。我想我错了。)
jcora 2012年

1
是的,我认为可能会有一种常规的处理方法。如我所见,这不是代码问题,而是数字精度问题。我所追求的不是解决我的问题的代码片段,而是对解决问题方法的解释。
MikaelHögström'12年

您是指浮点精度吗?
jcora

从某种意义上说是的。我在碰撞处理中使用的惯性矩阵的逆得到非常大的值。由于枢轴元素获得较大的值,并且实际上没有很多条件,因此并没有太多问题,但是随着仿真迅速失控,以某种方式一定存在数值精度问题。
MikaelHögström2012年

Answers:


1

你可以

  • 增加重力常数?游戏通常使用2 * 9.81 m / s ^ 2。我不记得我在哪儿读过这篇文章,但游戏通常使用无意义的单位。任何常量都感觉正确(使游戏变得有趣)。使用一个现实常数会使物理看起来缓慢而浮空。
  • 以更快的速度运行模拟。如果您使用固定的时间步,这将增加动画的速度。
  • 使用精度更高的浮子?

第二点不会做任何事情,只能使模拟更加平滑,或者如果模拟运行得太快甚至会中断模拟(我不确定这是否是一个现实的问题,但是如果世界已经过去了毫秒,那么时间就过去了)差值始终为0,则无效)。他也可能不想在更高精度的浮点数上浪费内存。
jcora 2012年

1
游戏经常使用双引力吗?谁说的?
GameDev-er 2012年

我无法更改速度或准确性,但会尝试更改重力。
MikaelHögström,2012年

改变重力常数会使骰子通常移动得更快,给人的印象是一切都在较小的范围内。即使使用微碰撞来处理帧间加速,这也使行为更加不稳定。我想我只需要调整一下即可:)
MikaelHögström2012年

4

如果您在使用较小的数值时遇到麻烦,我建议您只是按比例缩小所有内容。您甚至可能不使用“真实”的测量单位,而只是使用一些仅在引擎内部有意义的“通用”单位。

第一种选择是按比例缩小,要求您使用毫米或厘米作为基本度量单位。这样,您的多维数据集的尺寸就不会受到精度损失的困扰。

第二种解决方案基本上是相同的事情,但是您无需考虑实际的单位。

另外,为什么不改变立方体的质量呢?


由于我仅有的力产生器是基于重力/加速度计的,因此改变质量不会改变行为。但是,您的建议可以用另一种方式使用(也许就是您的意思),使小物体具有更大的质量,使它们的逆质量更接近一个,从而减少数值的不稳定性。这带来了与仅增加重力常数相同的问题。
MikaelHögström'12年


0

我认为我应该分享对这个问题的最终解决方案。如建议的那样增加重力常数确实确实使骰子移动得更快,从而给人以正确比例的印象。但是,这增加了微弹跳的问题。我添加了微碰撞,尽管不能完美解决,但可以缓解该问题。请注意,这仅对“小”对象来说是个问题,如果您遇到了相反的问题,并且想要模拟非常大的对象(宇宙飞船或类似的东西),那么您根本不会遇到任何微弹问题,并且可以与之抗衡该解决方案。

因此,我找到了在没有太多“微弹跳”的情况下可以拥有的最高重力水平。然后,我在电话上使用了一个简单的震动检测,该震动检测响应了加速度计读数的巨大变化,并在检测到这种震动时对所有物体施加了脉冲。它不是完美的,但是当摇动电话时,它将使骰子快速移动,给人留下“微小”骰子的印象。这有点麻烦,但必须这样做:)这是运行中的引擎的片段

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.