пару вещей:
Во-первых, вращение кватернионов не нормируется, так что обратное не совпадает с его конъюгату. Вращение на кватернионе определяется по формуле:
Где q
вектор вы вращаясь вокруг, p
вектора вы вращаясь, и p'
является окончательным повернутым вектором.
Таким образом, это определяется с использованием обратного из q, который определяется как conjugate(q)/magnitude(q)^2
. В случае, когда q нормируется, magnitude(q)^2 == 1
, так что это то же самое, что просто умножение на сопряжение.
Также обратите внимание на порядок операций здесь. Quat - это некоммутативный, поэтому их порядок имеет значение.
Вы можете исправить это путем нормализации вашего вращения кватернион, и фиксируя порядок операций:
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);
Во-вторых, вы хотите, чтобы определить ваше вращение кватернизованного как нормальный к плоскости вы хотите повернуть вокруг. В этом случае вы хотите повернуть вокруг плоскости x-y. Ось г перпендикулярна этой плоскости, поэтому мы хотим, чтобы определить вектор вращения вдоль оси:
function update(){
for(var i = 0; i < gameObjects.length; i++){
gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100));
}
}
С учетом этих изменений, я был в состоянии получить коробку вращающуюся правильно.
(С точки зрения того, почему она была масштабировании вверх/вниз, я не уверен на 100%. Тем не менее, пытаясь понять это.)
Awesome! Это помогает выделить. Я думаю, что текущее сокращение может быть связано с тем, что я не проецирую квадрат на плоскость камеры, но игнорирую ось z, когда рисую. – Devcon