3

我查看了 cannon.js 示例,它们似乎主要使用 -10 到 -40 之间的重力和 1 到 10 之间的物体质量(或称为 CANNON.RigidBody),这些演示具有这些值的对象“表现良好”,因为它们只是“重”到足以克服重力,而不是“重”到使地平面看起来很假……我的意思是我已经尝试增加下落的质量物体和它们的质量越大,当它们着陆时,它们就越会使地板看起来像是由棉花糖(即海绵状)制成的。(顺便说一句:是的,我知道质量和重量不是一回事;-)

数学中的重力通常为 9.8 m/s/s,那么如何在 CANNON.World.gravity 中实现呢?

我在互联网上发现石头的质量是 2515 公斤/立方米,所以如果我想放下一个 1x1x1 米的石块,这将如何转化为质量:

var block = new CANNON.RigidBody(mass, shape, material);

然后是这个material参数..我需要2种材料(1种用于地板,1种用于石块)然后我将如何设置摩擦系数和恢复值以使材料在碰撞时做出反应?

我知道这似乎是很多问题,我的目标不是绝对准确,只是需要指导,因为 a)我缺乏物理知识,b)对于我们这些试图使用 cannon.js 的人来说没有太多文档物理学教授;-)

我猜真正的问题是“如何近似现实主义”。

cannon.js 很棒,工作得非常好,我非常感谢 Stefan Hedman ( schteppe ) 迄今为止所做的所有努力。

4

1 回答 1

15

Cannon.js 使用 MKS 单位制(米-千克-秒)。要将重力正确设置为 9.8 m/s/s,请执行以下操作:

world.gravity.set(0,-9.8,0);

(假设“向上”方向沿 Y 轴正方向。)

对于质量计算,您可以执行以下操作:

var density = 2515; // kg/m^3
var mass = density * shape.volume(); // M=p*V

然后在创建你的石体时使用这个质量。

如果您的目标是具有实时物理特性的游戏,您可能不得不放弃“正确”的物理属性来提高物理性能。你可以通过改变重力和质量、增加阻尼、限制物体的最大速度等来做到这一点。对此没有具体的指导方针,但有很多技巧。

关于材质:通常,您CANNON.Material为场景中的每种材质创建一个新的。然后,您创建一个CANNON.ContactMaterial定义当一对这些材料相遇时会发生什么的定义。这是示例代码,但请参阅摩擦演示以获取完整示例。

var slipperyMat = new CANNON.Material();
var friction = 0.0;
var restitution = 0.2;
var slipperyContact = new CANNON.ContactMaterial(slipperyMat,slipperyMat,friction,restitution);
world.addContactMaterial(slipperyContact);

如果您只打算拥有一种材料,则可以改为在世界上的默认接触材料上设置属性。看看world.defaultContactMaterial

海绵问题是一个很好的问题。如果您想保持物理上正确的质量、重力等,您可能需要稍微提高精度。您可以通过使用较小的时间步长(例如,尝试在每个渲染帧使用两个半步长)和/或调整接触求解设置来做到这一点:

world.solver.iterations = 20; // Increase solver iterations (default is 10)
world.solver.tolerance = 0;   // Force solver to use all iterations

// Adjust constraint equation parameters: use to tweak sponginess
slipperyContact.contactEquationStiffness = 1e8;
slipperyContact.contactEquationRegularizationTime = 3;

刚度和正则化控制触点的“海绵状”。如果您使用较大的刚度和较小的正则化,求解器将尝试为您减少海绵状接触。提供足够的求解器精度(小时间步和大量迭代),您将获得更好的解决方案。

在整个答案中,我假设 Cannon.js 0.6.0(目前是开发分支)。

于 2013-05-08T14:16:46.760 回答