【问题标题】:Threejs - Translate object based on quaternion rotationThreejs - 基于四元数旋转翻译对象
【发布时间】:2013-12-14 02:28:13
【问题描述】:

我有一个使用四元数的对象。这个四元数在用户的按键上得到更新,以允许对象旋转它的内轴。旋转效果很好。当处于默认状态时(在用户调整旋转之前),我的四元数读取 w:1, x:0, y:0, z:0

我希望这个对象总是通过它的内部 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 轴向前移动

任何帮助将不胜感激。

【问题讨论】:

  • Three.js R55 及更高版本:重命名四元数方法:.multiply() 到 .multiplyQuaternions() .multiplySelf() 到 .multiply()

标签: javascript 3d webgl three.js


【解决方案1】:

您所要做的就是在渲染循环中添加以下行:

airplane.translateZ( 1 );

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

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

【讨论】:

    【解决方案2】:

    这里的四元数代表三个空间的旋转。您需要首先指定要旋转的初始方向。将其设为起始方向方向的单位向量。

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

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

    【讨论】:

    • 感谢您花时间看一看。您能否更具体地说明“您可以通过当前四元数描述的旋转来旋转初始方向向量”。如果我将向量 (0,0,-1) 作为初始方向 - 我将如何根据 quat 旋转它?任何伪代码将不胜感激
    • 我不是特别了解three.js,但是看一下文档表明你想要quat.multiplyVector3(initialVec, currentVec)
    • 根据这个建议,我创建了两个变量: var initialVec = new THREE.Vector3(0,0,-1); var matrix = new THREE.Matrix4();我正在做 matrix.multiplyVector3(initialVec, object.quaternion) - 但是我不明白如何将生成的矩阵用作向量来转换我的对象位置。似乎 multiplyVector3 是 Matrix4 对象的一部分,不能通过 Vector3 对象来完成......抱歉在这里很新手,但我想我不理解这个的实现。非常感谢您的帮助。
    • 我认为你弄错了 multiplyVector3?我对文档的阅读是在四元数对象上也有一个同名的函数。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2018-02-01
    • 2013-05-28
    • 2020-11-06
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多