cannon.js中重力,质量和接触材料的“真实”值是什么?

时间:2013-05-07 16:52:37

标签: javascript physics-engine cannon.js

我查看了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)到目前为止所付出的辛勤劳动。

1 个答案:

答案 0 :(得分:11)

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来定义当这对材料相遇时会发生什么。以下是示例代码,但请参阅friction demo以获取完整示例。

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(目前为dev分支)。