2015-04-07 36 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'是最终旋转向量。

所以这是使用定义为conjugate(q)/magnitude(q)^2的q的的逆定义的。在q被归一化的情况下,所以它与乘以共轭相同。

另请注意这里的操作顺序。四倍乘法是非交换所以他们的顺序很重要。

您可以通过标准化的旋转四元数,和固定操作顺序解决这个问题:

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平面旋转。 z轴垂直于这个平面,所以我们要沿Z轴定义旋转向量:

function update(){ 
    for(var i = 0; i < gameObjects.length; i++){ 
     gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100)); 
    } 
} 

有了这些变化,我能得到正确的盒子旋转。

(在它为什么被扩大的条款/下,我不是100%肯定,仍在试图找出答案。)

+0

真棒!这有助于分配。我认为目前的缩小可能是因为我没有将方块投影到相机的平面上,当我绘制时基本上忽略了z轴。 – Devcon