Cannon.js - Как предотвратить дрожание / дрожание блоков? - PullRequest
0 голосов
/ 17 октября 2018

Я использую Cannon.js с Three.js.Я установил сцену, в которой 5 столбцов по 4 блока расположены друг над другом.

Я хочу, чтобы они были взаимодействующими с другими объектами, которые я планирую добавить в сцену.Тем не менее, блоки в столбцах, кажется, вызывают много микроколлизий, и со временем дрожание из позиции.Я хочу, чтобы они оставались ровно в очереди, пока с ними не будут взаимодействовать.

Если вы посмотрите на кодовую ручку и подождите около 20/30 секунд, вы увидите, что блоки начинают двигаться.Есть ли что-то конкретное, что мне нужно установить для этих блоков, чтобы не допустить этого?

Вот пример, который я собрал - https://codepen.io/danlong/pen/XxZROj

Кроме того, есть и довольнобольшое снижение производительности, когда на сцене есть эти блоки, которых я не ожидал.Я планирую добавить больше объектов на сцену и не уверен, почему производительность падает?

Это как-то связано с приведенным ниже в моем цикле animate ()?

this.world.step(1 / 30);

Код специально длянастроить мой «Мир пушек» и «столбцы» ниже:

Мир пушек:

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);
    }
}

1 Ответ

0 голосов
/ 17 октября 2018

Попробуйте это?body.sleepSpeedLimit = 1.0;

...