Threejs变换矩阵排序

时间:2014-03-04 17:11:52

标签: javascript matrix three.js

我想知道trijs如何排序多个矩阵?

例如,

......
var mesh = new THREE.Mesh( geometry, material );
mesh.position.set( 0, 20, 0 ); // T , transform matrix
mesh.rotation.set( 0, Math.PI, 0 );//R , rotation matrix
mesh.scale.set( 1, 1, 10 );//S , scale matrix
那么,三个矩阵如何结合三个矩阵?它将根据我的设定值顺序(在我的例子中,它是TRS,所以最终矩阵应该是T * R * S)或固定顺序(例如,它总是使用SRT排序,最终矩阵是S * R * T) ?

1 个答案:

答案 0 :(得分:2)

只要网格属性“matrixAutoUpdate”为true,您就可以指定参数,只需按比例缩放,旋转然后平移(典型值)。

如果您需要更复杂的内容,例如特定系列的翻译和旋转,那么您应该将matrixAutoUpdate设置为false并自行计算矩阵。

重要提示:使用矩阵乘法函数时,必须按“反向”顺序执行。例如,如果你想定位一个肢体,那么逻辑上你会:

1)进行局部旋转(例如手臂上/下)

2)相对于其偏移移动肢体(将其放在关节处)

3)根据身体旋转旋转

4)移动到身体偏移

实际操作将以相反的方式完成:

arm_mesh.matrixAutoUpdate = false;

var mat4: THREE.Matrix4 = new THREE.Matrix4();
var arm_matrix = arm_mesh.matrix;

arm_matrix.identity();  // reset

arm_matrix.multiply(mat4.makeTranslation(body_pos.x, body_pos.y, body_pos.z));
arm_matrix.multiply(mat4.makeRotationFromQuaternion(body_rotation));
arm_matrix.multiply(mat4.makeTranslation(arm_offset.x, arm_offset.y, arm_offset.z));
arm_matrix.multiply(mat4.makeRotationFromEuler(new THREE.Euler(arm_angle, 0, 0)));

当然,这并不利用或说明父母/子女关系。