在Three.js中反转Object3D.updateMatrix()?

时间:2013-02-26 00:38:47

标签: three.js

如果我做对了:Object3D一方面有一组属性(position, scale, rotation) [*],另一方面有matrix - 后面包含的信息基本相同,它是从Object3D.updateMatrix()中的其他人计算出来的,并且是渲染器计算内部真正使用的那个。相反,集合(position, scale, rotation)是通常由程序员操纵的集合(翻译,旋转......)。

然而,有时会直接操纵matrix,而且,不是设置matrixAutoUpdate=false而忘记(position, scale, rotation),而是想要保持属性同步,即做什么Object3D.updateMatrix()但是在另一个方向。是否有一些实施/有效/推荐的程序来实现这一目标?

[*]警告: 1)如果useQuaternion=true,则使用quaternion代替rotation 2)rotationeulerOrder补充 3)我不确定在这张照片中扮演up的角色,我想这在这里并不重要。

2 个答案:

答案 0 :(得分:1)

您可以在3D对象上调用applyMatrix(matrix)方法。要查看其功能,请参阅here

或者:

1)您可以为其提供单位矩阵,或

2)你可以复制该功能的作用:

this.scale.getScaleFromMatrix( this.matrix );
var mat = new THREE.Matrix4().extractRotation( this.matrix );
this.rotation.setEulerFromRotationMatrix( mat, this.eulerOrder );
this.position.getPositionFromMatrix( this.matrix );

如果您执行上述操作,我不确定四元数是如何相关的,我不知道useQuaternion标志设置为true的情况。但是在Object3D对象中默认为false。我有一种感觉,它只在计算某些旋转时使用四元数,以避免万向节锁定。

我认为从lookAt()方法获取的以下代码将更新四元数:

this.quaternion.copy( this.matrix.decompose()[ 1 ] );

答案 1 :(得分:1)

例程

Matrix4.decompose( position, quaternion, scale ) // revision 57dev

将从矩阵中计算positionquaternionscale向量。

(在第56条中,arg名称不幸被错误命名,并且已在r.57dev中修复。)

如果您想要rotation向量,则必须从刚才计算的quaternion计算它,如下所示:

rotation.setEulerFromQuaternion( quaternion, eulerOrder );

up向量与您的问题无关。