Матричные преобразования

«Вердж3Д» использует матрицы для кодирования 3Д-трансформаций (положений), поворотов и масштабирования. Каждый экземпляр Object3D имеет матрицу matrix, которая хранит положение, ротацию и масштаб этого объекта. На этой странице описано, как обновить трансформацию объекта.

Свойства и matrixAutoUpdate

Существует два способа обновления трансформации объекта:
  1. Изменить свойства объекта position, quaternion и scale, и позволить «Вердж3Д» пересчитать матрицу объекта из этих свойств: object.position.copy(start_position); object.quaternion.copy(quaternion); По умолчанию свойство matrixAutoUpdate имеет значение true, и матрица будет автоматически пересчитываться. Если объект статичен или вы хотите вручную контролировать, когда происходит пересчет, для лучшей производительности установите свойство false: object.matrixAutoUpdate = false; А после изменения каких-либо свойств вручную обновите матрицу: object.updateMatrix();
  2. Модифицировать матрицу объекта напрямую. Класс Matrix4 имеет различные методы для модификации матрицы: object.matrix.setRotationFromQuaternion(quaternion); object.matrix.setPosition(start_position); object.matrixAutoUpdate = false; Обратите внимание, что matrixAutoUpdate должен иметь значение false в этом случае, и вы должны убедиться, что не обращаетесь к updateMatrix. Обращение к updateMatrix перечеркнет ручные изменения, внесенные в матрицу, пересчитав матрицу из position, scale и так далее.

Матрицы объектов и мира

Объект matrix хранит трансформацию объекта относительно к объекту parent; чтобы получить трансформацию объекта в мировых координатах, необходимо обратиться к объекту Object3D.matrixWorld.

Когда преобразование родительского или дочернего объекта изменяется, вы можете запросить обновление matrixWorld дочернего объекта, вызвав updateMatrixWorld().

Вращение и кватернионы

«Вердж3Д» предоставляет два способа трехмерных вращений: углы Эйлера и кватернионы, а также методы преобразования между ними. Эйлеровы углы подвержены проблеме, называемой "gimbal lock", когда определенные конфигурации могут потерять степень свободы (не позволяя объекту вращаться вокруг одной оси). По этой причине вращение объекта всегда хранится в кватернионах.

Предыдущие версии библиотеки включали свойство useQuaternion, которое имело значение false и заставляло matrix объекта вычисляться на основе эйлерова угла. Эта практика устарела - вместо нее следует использовать метод setRotationFromEuler, который обновляет кватернион.