Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js Cannon.js-如何防止抖动/摇晃的块?_Three.js_Game Physics_Cannon.js - Fatal编程技术网

Three.js Cannon.js-如何防止抖动/摇晃的块?

Three.js Cannon.js-如何防止抖动/摇晃的块?,three.js,game-physics,cannon.js,Three.js,Game Physics,Cannon.js,我将Cannon.js与Three.js一起使用。我已经设置了一个场景,其中有5列4个区块堆叠在一起 我希望这些可以与我计划添加到场景中的其他对象交互。然而,列中的块似乎引起了许多微碰撞,随着时间的推移,抖动偏离了位置。我希望他们在与我互动之前保持一致 如果您查看代码笔并等待大约20/30秒,您将看到块开始移动。我需要在这些块上设置一些特定的设置来防止这种情况发生吗 这是我举的一个例子- 顺便说一句,当场景中出现我没有预料到的这些块时,性能也会有相当大的下降。我计划向场景中添加更多对象,但不确定

我将Cannon.js与Three.js一起使用。我已经设置了一个场景,其中有5列4个区块堆叠在一起

我希望这些可以与我计划添加到场景中的其他对象交互。然而,列中的块似乎引起了许多微碰撞,随着时间的推移,抖动偏离了位置。我希望他们在与我互动之前保持一致

如果您查看代码笔并等待大约20/30秒,您将看到块开始移动。我需要在这些块上设置一些特定的设置来防止这种情况发生吗

这是我举的一个例子-

顺便说一句,当场景中出现我没有预料到的这些块时,性能也会有相当大的下降。我计划向场景中添加更多对象,但不确定性能下降的原因

这与我的animate()循环中的以下内容有关吗

专门设置我的“Cannon world”和“columns”的代码如下:

加农炮世界:

this.world = new CANNON.World();

this.world.defaultContactMaterial.contactEquationStiffness = 1e6;    
this.world.defaultContactMaterial.contactEquationRegularizationTime = 3;

this.world.solver.iterations = 20;

this.world.gravity.set(0,-25,0);

this.world.allowSleep = true;

this.world.broadphase = new CANNON.SAPBroadphase(this.world);
var geometry = new THREE.BoxBufferGeometry(5,5,5);
var material = new THREE.MeshNormalMaterial();
var shape = new CANNON.Box(new CANNON.Vec3(5/2, 5/2, 5/2));

for (var rows = 0, yPos = 2.5; rows < 4; rows++, yPos+=5) {

    for (var i = -20; i <= 20; i+=10) {

        // physics
        var body = new CANNON.Body({
            mass: 0.5,
            position: new CANNON.Vec3(i, yPos, 0),
            friction: 0.1,
            restitution: 0.3
        });

        body.allowSleep = true;
        body.sleepSpeedLimit = 0.01;
        body.sleepTimeLimit = 1.0;

        body.addShape(shape);

        this.world.addBody(body);
        this.bodies.push(body);

        // material
        var mesh = new THREE.Mesh(geometry, material);

        this.scene.add(mesh);
        this.meshes.push(mesh);
    }
}
列:

this.world = new CANNON.World();

this.world.defaultContactMaterial.contactEquationStiffness = 1e6;    
this.world.defaultContactMaterial.contactEquationRegularizationTime = 3;

this.world.solver.iterations = 20;

this.world.gravity.set(0,-25,0);

this.world.allowSleep = true;

this.world.broadphase = new CANNON.SAPBroadphase(this.world);
var geometry = new THREE.BoxBufferGeometry(5,5,5);
var material = new THREE.MeshNormalMaterial();
var shape = new CANNON.Box(new CANNON.Vec3(5/2, 5/2, 5/2));

for (var rows = 0, yPos = 2.5; rows < 4; rows++, yPos+=5) {

    for (var i = -20; i <= 20; i+=10) {

        // physics
        var body = new CANNON.Body({
            mass: 0.5,
            position: new CANNON.Vec3(i, yPos, 0),
            friction: 0.1,
            restitution: 0.3
        });

        body.allowSleep = true;
        body.sleepSpeedLimit = 0.01;
        body.sleepTimeLimit = 1.0;

        body.addShape(shape);

        this.world.addBody(body);
        this.bodies.push(body);

        // material
        var mesh = new THREE.Mesh(geometry, material);

        this.scene.add(mesh);
        this.meshes.push(mesh);
    }
}
var-geometry=new-THREE.BoxBufferGeometry(5,5,5);
var material=新的三个.MeshNormalMaterial();
var形状=新加农炮.Box(新加农炮.Vec3(5/2,5/2,5/2));
对于(变量行=0,yPos=2.5;行<4;行++,yPos+=5){
对于(var i=-20;i试试这个?

body.sleepSpeedLimit=1.0;

谢谢你的回答-效果非常好。它似乎也提高了性能,所以谢谢!我确实在我的场景中将其更改为0.5,但它确实有效!酷:)Sleep参数告诉物理引擎,sim中对象的总速度已降至阈值以下,因此可以停止模拟…一旦有足够大的物体再次碰撞,导致速度在该阈值以上出现峰值,sim将再次启动。这一机制就是我们如何使用我们必须在每一帧更新每个对象。如果阈值太高,您将开始看到这样的问题..当站在边缘或类似位置时,对象停止移动..对于检查代码笔的任何人,已在第125行实施批准的解决方案。