Javascript 那会是什么;“现实的”;cannon.js中重力、质量和接触材料的值?

Javascript 那会是什么;“现实的”;cannon.js中重力、质量和接触材料的值?,javascript,physics-engine,cannon.js,Javascript,Physics Engine,Cannon.js,我看了cannon.js的例子,它们似乎主要使用-10到-40之间的重力,以及1到10之间的物体质量(或它们被称为cannon.RigidBody),这些演示对象使用这些值“表现良好”,因为它们只是“重”到足以克服重力,而不是那么“重”他们让地面飞机看起来是假的。。我的意思是,我试着增加坠落物体的质量,它们的质量越大,落地时地板看起来就越像棉花糖(即海绵状)。 (顺便说一句:是的,我知道质量和重量不是一回事;-) 重力在数学上通常是9.8米/秒/秒,那么如何在CANNON.World.gravi

我看了cannon.js的例子,它们似乎主要使用-10到-40之间的重力,以及1到10之间的物体质量(或它们被称为cannon.RigidBody),这些演示对象使用这些值“表现良好”,因为它们只是“重”到足以克服重力,而不是那么“重”他们让地面飞机看起来是假的。。我的意思是,我试着增加坠落物体的质量,它们的质量越大,落地时地板看起来就越像棉花糖(即海绵状)。 (顺便说一句:是的,我知道质量和重量不是一回事;-)

重力在数学上通常是9.8米/秒/秒,那么如何在CANNON.World.gravity中实现呢

我在互联网上发现,石头的质量为2515千克/立方米,因此,如果我想扔下一个1x1x1米的石块,如何将其转化为质量:

var block = new CANNON.RigidBody(mass, shape, material);
然后是这个
材料
参数。。我是否需要2种材料(1种用于地板,1种用于石块),然后如何设置摩擦系数和恢复值,以便材料在碰撞时发生反应

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

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


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

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(目前的开发分支)。

你在做游戏吗?在这种情况下,拥有一个现实的世界可能不是最好的主意。在现实世界中,一块相当小的石头具有很大的加速度,你需要大画布或小物体才能显示现实生活中的重力。我不确定有多少球员会喜欢这样。在游戏中,大多数物体的重力比现实生活中的相同材料小得多。这可能更适合。下面是一个例子,小方块尺寸为100x100x100,单个大方块尺寸为200x200x200,我的玩家角色高度在100-200之间,如果我们接受100=1米,这似乎是准确的(平均男性身高1.75米),我不知道cannon.js内部使用什么单位来测量盒子的大小,我只是假设在屏幕上,与玩家的身高相比,较小的方块看起来大约是1米的立方,单个大方块是2米的立方。一个人可以轻易地移动一个1米的实心石块是不现实的,但他肯定不能移动2米的石块。答案很好,感谢@Schteppe使用如此高的密度会导致移动物体所需的质量非常高,力非常大(>1000个单位),而大炮的示例只使用小质量,如
5
。为什么会有差异?