Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        6年前关闭。
                                                                                            
                
        
我看过cannon.js的例子,它们似乎主要用于重力的-10和-40之间,以及物体的质量(或称为CANNON.RigidBody)的质量在1和10之间,这些演示这些值具有“良好表现”的对象,因为它们“足够”足以克服重力,而又不“足够”以至于它们使地平面看起来是假的。物体和物体的质量越多,着陆时它们看起来就好像是由棉花糖(即海绵)制成的地板。
(顺便说一句:是的,我确实知道质量和重量不是一回事;-)

在数学中重力通常为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)到目前为止所做的所有辛勤工作。

最佳答案

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分支)。

关于javascript - cannon.js中的重力,质量和接触 Material 的“实际”值是什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16424500/

10-12 12:30