У меня есть программа, которая вращает куб на основе некоторого последовательного ввода.Последовательный вход обеспечивает абсолютное вращение, в котором должен находиться куб (например, 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
вращение. Х - нежелательное вращение
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
cube.rotation.x = THREE.Math.degToRad(45);
Если вращение действительно было локальным, не приведет ли установка x к degToRad (45) повороту, как в первом примере, но нужно только изменить ось x?
Пример JS Fiddle
http://jsfiddle.net/jrj2211/m2cwvu0p/20/