0

如果我做对了:anObject3D一方面具有一组属性(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在这张图片中扮演什么角色,我想这在这里并不重要。

4

2 回答 2

1

applyMatrix(matrix)您可以在 3D 对象上调用该方法。要查看它的作用,请参见此处

任何一个:

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 ] );
于 2013-02-26T01:28:37.000 回答
1

例行公事

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

将从矩阵计算positionquaternionscale向量。

(不幸的是,在 r.56 中,arg 名称被错误地命名,这已在 r.57dev 中得到修复。)

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

rotation.setEulerFromQuaternion( quaternion, eulerOrder );

up向量与您的问题无关。

于 2013-02-26T01:38:31.857 回答