Three.js Установить абсолютное локальное вращение - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть программа, которая вращает куб на основе некоторого последовательного ввода.Последовательный вход обеспечивает абсолютное вращение, в котором должен находиться куб (например, 20 градусов).У меня есть ограничения на вращение куба, такие как X от -45 до 45 градусов.

В настоящее время я сохраняю текущее вращение для X, Y, Z, вычисляю разницу между текущим вращением и новым вращением, а затем использую .rotateX () .rotateY () и .rotateZ () длявращайте куб в зависимости от его локальной позиции.

curX = 0; // Global variable

function updateCubeRotation(newX) {
    // Limit X
    if(newX < 45 && newX > -45) {
        cube.rotateX(THREE.Math.degToRad(newX - curX));
        curX = newX;
    }
}

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

Мне любопытно, есть ли способ сделать SET (а не добавить) абсолютным локальным вращением для оси вместо вычисления разницы.Это также позволило бы мне не отслеживать последнее значение локального вращения для каждой оси.Что-то вроде:

// Sets the cubes local rotation to 45, no matter what the current angle is 
cube.setRotateX(45); 

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

.quaternion : Quaternion
Object's local rotation as a Quaternion.

Первоначально я использовал cube.rotation.x = 45, но он вращается в мировом пространстве.Сравнивая это с Unity, у них есть свойство cube.localRotation.x, которое я пытаюсь эмулировать.


Обновление

Я вижу, чтоВ документации сказано, что .rotation локально, но я все еще не совсем понимаю, потому что по тому, что я могу сказать, это вращение через мировые координаты.В чем разница между .rotateX и .rotation.x?

Регистрация как rotateX, так и translation.x. Я вижу, что rotateX изменяет такие объекты, какtate.x, вращение.y и вращение.z, чтобы правильно вращаться на локальной оси.Поскольку необходимо изменить более 1 оси, это означает, что она относительно мировой оси, что противоречит документации?

Вот примеры rotateX и вращение. X:

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

 console.log(cube.rotation.x)

 x       y       z
 0.1011 -0.6073 -0.5624
-0.0143 -0.5418 -0.6252
-0.1162 -0.4741 -0.6748
-0.2075 -0.4053 -0.7137
-0.2875 -0.3387 -0.7428
-0.3572 -0.2764 -0.7640
-0.4148 -0.2221 -0.7782
-0.4616 -0.1764 -0.7875
-0.4983 -0.1398 -0.7932
-0.5289 -0.1088 -0.7970

enter image description here

вращение. Х - нежелательное вращение

 console.log(cube.rotation.x)

 x       y       z
 0.6109 -0.0298 -0.7854
 0.6051 -0.0298 -0.7854
 0.4279 -0.0298 -0.7854
 0.2683 -0.0298 -0.7854
 0.1125 -0.0298 -0.7854
-0.0346 -0.0298 -0.7854
-0.1684 -0.0298 -0.7854
-0.3198 -0.0298 -0.7854
-0.5058 -0.0298 -0.7854
-0.6109 -0.0298 -0.7854

enter image description here


cube.rotation.x = THREE.Math.degToRad(45);

Если вращение действительно было локальным, не приведет ли установка x к degToRad (45) повороту, как в первом примере, но нужно только изменить ось x?


Пример JS Fiddle

http://jsfiddle.net/jrj2211/m2cwvu0p/20/

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете легко использовать свойство cube.rotation.x для установки абсолютного значения (вместо изменения значения)

// Sets absolute rotation
setRotation(newRot) {
    // Clamps value so it does not exceed +/- 45
    var clampedRot = THREE.Math.clamp(newRot, -45, 45);

    // Assigns new rotation in radians
    cube.rotation.x = THREE.Math.degToRad(clampedRot);
}

Я изначально использовал cube.rotation.x = 45, ноэто вращается в мировом пространстве.

Я не верю, что это правда.Я думаю, что проблема в том, что если вы используете cube.rotation.x = 45, вы получите нежелательные результаты, потому что вращение рассчитывается в радиан , а не в градусах.Использование литерала 45 дает вам около 7 полных вращений, вы должны использовать THREE.Math.degToRad(45);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...