2015-04-07 2 views
1

Я разрабатываю базовый игровой движок, чтобы изучить процесс, и я столкнулся с проблемой с моей функцией вращения.Объект сжимается при повороте 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

пару вещей:

Во-первых, вращение кватернионов не нормируется, так что обратное не совпадает с его конъюгату. Вращение на кватернионе определяется по формуле:

formula

Где 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%. Тем не менее, пытаясь понять это.)

+0

Awesome! Это помогает выделить. Я думаю, что текущее сокращение может быть связано с тем, что я не проецирую квадрат на плоскость камеры, но игнорирую ось z, когда рисую. – Devcon

 Смежные вопросы

  • Нет связанных вопросов^_^