Python trimesh使用x方向法向量生成截面结果异常如何解决
解决方案
你遇到的异常不是section方法取截面出错,而是to_planar默认自动拟合平面坐标系的逻辑不符合预期,导致投影后的2D坐标显示异常,x方向法向量的截面几何本身是正确的。
正确实现代码
import numpy as np import trimesh # 你原来的立方体创建代码 vert = np.array([[-200., -200., 0.], [-200., -200., 50.], [-200., 200., 0.], [-200., 200., 50.], [ 200., -200., 0.], [ 200., -200., 50.], [ 200., 200., 0.], [ 200., 200., 50.]]) fa = np.array([[6, 0, 4], [0, 6, 2], [4, 6, 5], [6, 7, 5], [6, 2, 7], [2, 3, 7], [2, 0, 3], [0, 1, 3], [0, 4, 1], [4, 5, 1], [7, 1, 5], [1, 7, 3]]) mesh = trimesh.Trimesh(vertices= vert, faces=fa) # 取x法向量的截面 slice_ = mesh.section(plane_origin=(0,0,0), plane_normal=[1,0,0]) # 先判断截面是否存在,避免空值报错 if slice_ is None: raise ValueError("当前平面与网格无交集") # 手动构造平面变换矩阵,指定3D空间的y/z轴对应2D投影的x/y轴,避免自动拟合出错 # 变换矩阵是4x4的齐次矩阵 transform = np.array([ [0, 1, 0, 0], # 2D的x轴对应3D的y轴 [0, 0, 1, 0], # 2D的y轴对应3D的z轴 [1, 0, 0, 0], # 法向量方向对应3D的x轴 [0, 0, 0, 1] ]) # 显式传入transform参数调用to_planar slice_2D, to_3D = slice_.to_planar(transform=transform) # 此时显示的2D截面就是预期的y从-200到200、z从0到50的矩形 slice_2D.show()
原旋转方案失效原因
你之前绕x轴旋转网格的方案逻辑上是可行的,但出错是因为旋转后网格的顶点z坐标范围不再是0-50,你依旧使用plane_origin=(0,0,0)取z法向量截面时,已经不在新网格的z轴范围内,要么取不到截面要么位置偏移,需要对应调整平面原点坐标。相比之下直接显式指定to_planar的变换矩阵是更简单、无额外计算开销的方案。
内容的提问来源于stack exchange,提问作者henry
相关产品推荐
相关产品推荐

