2012-11-08 30 views
1

我有一个使用四元数的对象。这个四元数在用户的按键上得到更新,以允许物体旋转它的内轴。旋转工作太棒了。当它处于默认状态(用户调整旋转之前)时,我的四元数读取w:1,x:0,y:0,z:0Threejs - 基于四元数旋转的对象翻译

我希望此对象始终在空间中通过它的内部z-轴 - THREE.Vector3(0,0,-1)。如何使用quat来知道z轴在哪里并将其向前移动?例如 - 当我的四元数读取w:0.7,x:0.7,y:0,z:0时 - 旋转对象使其z轴向上指向。有没有办法通过它的内部轴来移动对象?

这里有一个例子的jsfiddle:http://bitly.com/RXPy5w - 我想广场上总是向前相对于它的z轴

任何帮助将不胜感激。

回答

2

所有你需要做的就是添加下面一行在你的渲染循环:

airplane.translateZ(1); 

更新小提琴:http://jsfiddle.net/Lc8gH/21/享受!

顺便说一句,你不能“翻译四元数”。继续学习,直到你明白这段代码在做什么。

2

这里的四元数表示三空间的旋转。您需要首先指定您要旋转的初始方向。在你的开始方向上做一个单位矢量。

现在,要沿当前方向行进,可以通过当前四元数描述的旋转来旋转初始方向矢量。现在你有一个单位矢量指向正确的方向。

最后,当然,您可以缩放该单位矢量以表示非单位距离的运动,将其添加到当前位置,然后完成。

+0

感谢您花时间去看看。你能否更具体地说:“你可以通过当前四元数描述的旋转来旋转初始方向矢量。”如果我将矢量(0,0,-1)作为初始方向 - 我将如何根据四元数来旋转它?任何伪代码将不胜感激 – Robbie

+0

我特别不知道three.js,但浏览一下文档就会发现你想'quat.multiplyVector3(initialVec,currentVec)'。 –

+0

根据这个建议我创建了两个变量:var initialVec = new THREE.Vector3(0,0,-1); var matrix = new THREE.Matrix4();我正在做matrix.multiplyVector3(initialVec,object.quaternion) - 但我不明白如何得到的矩阵可以用作一个向量来翻译我的对象的位置。看起来multiplyVector3是Matrix4对象的一部分,不能通过Vector3对象完成......对不起,我在这里很新鲜,但我在想我并不理解这个实现。非常感谢您的帮助。 – Robbie