如何使用pymxs获取3ds Max中对象顶点的最小XYZ值?
3ds Max pymxs 获取网格对象最小坐标顶点方法
你之前获取的aSelect.min.x/y/z是3ds Max对象轴对齐包围盒的计算边界值,不属于真实存在的网格顶点,所以不符合需求。要获取真实顶点的对应数值,需要遍历对象的所有顶点后筛选,具体实现如下:
from pymxs import runtime as rt # 校验选中对象存在 if rt.selection.count > 0: aSelect = rt.selection[0] # 生成临时网格副本读取顶点,不会修改原对象属性 mesh_obj = rt.snapshotAsMesh(aSelect) # 读取所有顶点的世界坐标,需要局部坐标可加参数inWorldSpace=False all_vertices = [rt.getVert(mesh_obj, i, asInt=False) for i in range(1, mesh_obj.numverts + 1)] # 分别获取所有顶点各维度的最小值 min_x_verts = min(v.x for v in all_vertices) min_y_verts = min(v.y for v in all_vertices) min_z_verts = min(v.z for v in all_vertices) # 匹配X/Y/Z同时为最小值的顶点 target_vertices = [v for v in all_vertices if v.x == min_x_verts and v.y == min_y_verts and v.z == min_z_verts] if target_vertices: target_point = target_vertices[0] print(f"西南侧顶点坐标:X={target_point.x}, Y={target_point.y}, Z={target_point.z}") else: # 不存在三值同时最小的顶点时,按X→Y→Z优先级排序取首位 all_vertices.sort(key=lambda p: (p.x, p.y, p.z)) target_point = all_vertices[0] print(f"无三值同时最小顶点,按优先级取首项:X={target_point.x}, Y={target_point.y}, Z={target_point.z}") # 释放临时网格避免内存泄露 rt.delete(mesh_obj) else: print("未选中任何对象")
补充说明
- 如果需要获取局部坐标,把
rt.getVert(mesh_obj, i, asInt=False)修改为rt.getVert(mesh_obj, i, asInt=False, inWorldSpace=False)即可 - 如果你需要的是各维度单独的最小顶点值,直接取
min_x_verts/min_y_verts/min_z_verts即可
内容的提问来源于stack exchange,提问作者lionel_here
相关产品推荐
相关产品推荐

