如果我做对了:Object3D
一方面有一组属性(position, scale, rotation)
[*],另一方面有matrix
- 后面包含的信息基本相同,它是从Object3D.updateMatrix()
中的其他人计算出来的,并且是渲染器计算内部真正使用的那个。相反,集合(position, scale, rotation)
是通常由程序员操纵的集合(翻译,旋转......)。
然而,有时会直接操纵matrix
,而且,不是设置matrixAutoUpdate=false
而忘记(position, scale, rotation)
,而是想要保持属性同步,即做什么Object3D.updateMatrix()
但是在另一个方向。是否有一些实施/有效/推荐的程序来实现这一目标?
[*]警告:
1)如果useQuaternion=true
,则使用quaternion
代替rotation
2)rotation
由eulerOrder
补充
3)我不确定在这张照片中扮演up
的角色,我想这在这里并不重要。
答案 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
将从矩阵中计算position
,quaternion
和scale
向量。
(在第56条中,arg名称不幸被错误命名,并且已在r.57dev中修复。)
如果您想要rotation
向量,则必须从刚才计算的quaternion
计算它,如下所示:
rotation.setEulerFromQuaternion( quaternion, eulerOrder );
up
向量与您的问题无关。