如何实现Trimesh平面网格对象的绕轴旋转变换?
嘿,刚接触Trimesh的话,旋转变换其实有几种很实用的方式,我结合你的平面例子一步步讲清楚~
方法一:直接用
rotate()方法(最直观) 这个是Trimesh网格对象自带的方法,专门处理旋转,默认绕网格的质心旋转。你只需要指定旋转轴和角度(注意:角度默认是弧度,要是习惯用角度的话,记得用numpy.radians()转一下)。
比如给你的平面绕Z轴旋转45度:
import trimesh import numpy as np # 创建你定义的平面 plane = trimesh.creation.box(extents=[20, 20, 0.01]) # 方式1:通过旋转矩阵调用rotate plane.rotate(trimesh.transformations.rotation_matrix(np.radians(45), [0, 0, 1])) # 方式2:更简洁的直接传轴和角度 plane.rotate([0, 0, 1], angle=np.radians(45))
方法二:用
apply_transform()自定义变换(更灵活) 如果需要组合旋转、平移等多种变换,或者要绕非质心的点旋转,这个方法更合适。核心是构造变换矩阵,再应用到网格上。
绕质心旋转的例子
比如绕Y轴旋转30度:
# 构造绕Y轴的旋转矩阵 rot_matrix = trimesh.transformations.rotation_matrix(np.radians(30), [0, 1, 0]) # 将矩阵应用到平面上 plane.apply_transform(rot_matrix)
绕自定义点旋转的例子
比如想绕平面的右上角点旋转90度,步骤是:先把目标点移到原点,旋转后再移回去:
# 获取平面的右上角点坐标(初始平面在原点,extents为[20,20,0.01],所以右上角是(10,10,0.005)) target_center = plane.vertices.max(axis=0) # 1. 构造平移矩阵:把目标点移到原点 translate_to_origin = trimesh.transformations.translation_matrix(-target_center) # 2. 构造旋转矩阵:绕Z轴转90度 rot_matrix = trimesh.transformations.rotation_matrix(np.radians(90), [0, 0, 1]) # 3. 构造平移回去的矩阵 translate_back = trimesh.transformations.translation_matrix(target_center) # 组合三个变换矩阵(顺序很重要!) combined_transform = trimesh.transformations.concatenate_matrices(translate_to_origin, rot_matrix, translate_back) # 应用组合变换 plane.apply_transform(combined_transform)
小提示
- 旋转后想预览效果,可以用
plane.show()打开3D视图查看。 - Trimesh的
transformations模块还有很多实用工具,比如平移、缩放矩阵,组合起来能实现各种复杂的空间变换。
内容的提问来源于stack exchange,提问作者Ghost




