为了学习这个过程,我一直在开发一个基本的游戏引擎,我的轮换功能也遇到了问题。
它的工作很好,除了物体收缩和似乎倒转。
这里有一个小提琴,它说明了我的观点。
我认为问题是在旋转代码中,它本身,但我不是积极的。
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);
}发布于 2015-04-08 15:11:50
几件事:
首先,旋转四元数是不归一化的,因此它的逆不等于它的共轭。四元数旋转的定义如下:

其中q是你旋转的矢量,p是你旋转的矢量,p'是最后旋转的矢量。
这是用q的逆来定义的,它被定义为conjugate(q) / magnitude(q)^2。在q被标准化的情况下,magnitude(q)^2 == 1,所以它和被共轭相乘一样。
还请注意这里的操作顺序。Quat乘法是non-commutative,所以它们的顺序很重要。
您可以通过规范化旋转四元数和修正操作顺序来解决这个问题:
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);第二,你想把你的旋转quat定义为与你想要旋转的平面一样正常。在这种情况下,你想绕着x-y平面旋转。Z轴对这个平面是正常的,所以我们要定义z轴上的旋转矢量:
function update(){
for(var i = 0; i < gameObjects.length; i++){
gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100));
}
}有了这些改变,我才能使盒子正确旋转。
(关于为什么它在上升/下降,我不能百分之百肯定。)仍在努力弄清楚这一点。
https://stackoverflow.com/questions/29482993
复制相似问题