Cannon.js - Как предотвратить обрезку объектов «пол» при обновлении - PullRequest
0 голосов
/ 29 октября 2018

Я использую Cannon.js с Three.js.

Я создал сцену, которая состоит из 1 поля высоты и 5 шаров. Я хочу, чтобы шары катались по полю высоты, используя физику cannon.js.

При перемещении мыши я поворачиваю поле высоты вдоль оси y, чтобы сферы вращались вперед и назад.

У меня есть цикл обновления, который копирует положение сферы и кватернион из cannon.js и применяется к визуальной сфере three.js. Поле высоты также обновляется одновременно с визуальным этажом three.js. Оба они выполняются в цикле for в requestAnimationFrame.

updateMeshPositions() {

    for (var i = 0; i !== this.meshes.length; i++) {
        this.meshes[i].position.copy(this.bodies[i].position);
        this.meshes[i].quaternion.copy(this.bodies[i].quaternion);

        this.hfBody.position.copy(this.mesh.position);
        this.hfBody.quaternion.copy(this.mesh.quaternion);
    }
}

Однако проблема в том, что когда «пол» вращается взад и вперед, сферы застревают и иногда даже падают сквозь пол. Вот пример на codepen - https://codepen.io/danlong/pen/qJwMBo

Переместите мышь вверх и вниз по экрану, чтобы увидеть это в действии.

Есть ли лучший или иной способ, которым я должен вращать «пол», сохраняя при этом движение сферы?

1 Ответ

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

Непосредственная (то есть «мгновенная») установка положения / поворота, вероятно, нарушит обработку столкновений во всех физических движках, включая cannon.js. По сути, вы телепортируете вещи в космос, заставляя объекты застрять или пройти друг через друга.

Что вы должны сделать, это

  • Установите скорость (.velocity и .angularVelocity) или примените силы к телам Cannon.js
  • Скопируйте преобразование этих тел в ваши визуальные сетки (обратите внимание, что это совсем наоборот по сравнению с тем, что вы сейчас делаете в коде)

Определение правильного количества силы, которое нужно приложить для получения желаемого визуального поведения, обычно является сложной задачей.

...