gpt4 book ai didi

javascript - Threejs 变换矩阵排序

转载 作者:行者123 更新时间:2023-11-30 17:35:19 35 4
gpt4 key购买 nike

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

例如,

......
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

那么,threejs如何组合三个矩阵呢?它会根据我的设置值顺序(在我的例子中,它是 TRS,所以最终矩阵应该是 T*R*S)或固定顺序(例如,它总是使用 SRT 排序,最终矩阵是 S*R*T) ?

最佳答案

只要网格属性“matrixAutoUpdate”为真,您就可以按照您所做的那样指定参数,并且您只希望它按比例、旋转然后平移(典型)的顺序排列。

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

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

1) 进行局部旋转(例如 ARM 向上/向下)

2) 相对于它的偏移移动肢体(把它放在它的关节处)

3)根据 body 旋转进行旋转

4) 移动到 body 偏移

实际的操作会逆向进行:

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)));

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

关于javascript - Threejs 变换矩阵排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22178476/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com