Объект сжимается при повороте 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%. Все еще пытаюсь понять это.)

Другие вопросы по тегам