Three.js - 轮换不尊重当地的方向

时间:2014-02-03 23:05:41

标签: javascript 3d rotation three.js

我正在使用围绕场景中心点构建的大量对象,并且需要围绕局部轴操纵它们。他们都使用空白对象和lookAt()面向原点,然后我使用this method to align the other axes correctly。以这种方式获得初始旋转效果很好,不幸的是,当我尝试使用object.rotation.x = <amount>动态旋转这些对象时,它不会尊重对象的局部轴。

令人困惑的部分是,它甚至不使用全局轴,它使用的轴几乎完全是任意的。 I set up a JSFiddle to demonstrate this here。正如您在第129行所见,looker.rotation.z正常工作,它正确地沿Z轴旋转,但如果它改为X或Y,则它不会沿局部轴或全局轴旋转。如果有人能揭开导致这种情况发生的事情的神秘面纱,那就太棒了。

1 个答案:

答案 0 :(得分:8)

发生的事情是你想为当前方向添加一些旋转,设置变量looker.rotation.z意味着其他方面。

最后,为了计算外观的旋转矩阵,会有类似的东西(伪代码:函数不是这些,但你明白了):

this.matrix.multiply( makeXRotationMatrix(this.rotation.x) )
this.matrix.multiply( makeYRotationMatrix(this.rotation.y) )
this.matrix.multiply( makeZRotationMatrix(this.rotation.z) )
DrawGeometry(this.geom, this.matrix)

旋转的组成并不直观。这就是为什么它似乎不遵循任何轴系统。

如果要将某个轴的旋转应用于现有矩阵,可以使用rotateX (angle)rotateY (angle)rotateZ (angle)rotateOnAxis (axis, angle)这些函数进行旋转。 axis可以是THREE.Vector3

直接更改looker.rotation.z是有效的,因为它是几何体最近的旋转,并且不受其他旋转的影响(请记住,转换矩阵以相反的顺序应用,例如T*R*G是{{ 1}}} {}} {}} {}} {}} {}} {}} {}

摘要

在这种情况下,我建议不要使用该行:

R

使用

G

T

代替。希望这会有所帮助:)