Объект сжимается при повороте JavaScript
Я разрабатывал базовый игровой движок только для того, чтобы изучить процесс, и у меня возникла проблема с функцией поворота.
Он работает нормально, за исключением того, что объект сжимается и кажется инвертированным.
Вот jsfiddle, который иллюстрирует мою точку зрения.
Я думаю, что проблема была бы в самом коде вращения, но я не уверен.
function Rotation(vec, rot){
if(Math.acos((vec.x + vec.y + vec.z -1)/2) === 0) { return vec; }
var qVec = new Quaternion(vec.x, vec.y, vec.z, 0);
qVec = Quaternions.multiply(qVec, rot);
qVec = Quaternions.multiply(qVec, rot.conjugate());
return new Vector3(qVec.x, qVec.y, qVec.z);
}
1 ответ
Пара вещей:
Во-первых, кватернион вращения не нормирован, поэтому его обратное не совпадает с сопряженным. Вращение кватернионом определяется:
куда q
вектор, вокруг которого вы вращаетесь, p
вектор, который вы вращаете, и p'
окончательный повернутый вектор.
Так что это определяется с использованием обратной от д, который определяется как conjugate(q) / magnitude(q)^2
, В случае, когда q нормализовано, magnitude(q)^2 == 1
, так же, как просто умножение на сопряжение.
Также обратите внимание на порядок операций здесь. Умножения кватов некоммутативны, поэтому их порядок имеет значение.
Вы можете исправить это, нормализовав кватернион вращения и установив порядок операций:
var qVec = new Quaternion(vec.x, vec.y, vec.z, 0);
qVec = Quaternions.multiply(rot.normalize(), qVec);
qVec = Quaternions.multiply(qVec, rot.conjugate());
return new Vector3(qVec.x, qVec.y, qVec.z);
Во-вторых, вы хотите определить кват вращения как нормальный к плоскости, вокруг которой вы хотите вращаться. В этом случае вы хотите вращаться вокруг плоскости XY. Ось z нормальна к этой плоскости, поэтому мы хотим определить вектор вращения вдоль оси z:
function update(){
for(var i = 0; i < gameObjects.length; i++){
gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100));
}
}
Благодаря этим изменениям я смог правильно вращать коробку.
(С точки зрения того, почему это увеличивалось / уменьшалось, я не уверен на 100%. Все еще пытаюсь понять это.)