Maya Python网格相交检测触发TypeError: Object is invalid问题求助
Maya网格相交检测代码报错修复方案
错误原因
报错# Error: TypeError: file <maya console> line 14: Object pSphere1 is invalid #的核心诱因有3个:
pmc.listRelatives返回的是PyNode类型对象,而原生cmds.polyCBoolOp接口只接收字符串格式的节点名称,直接传入PyNode会被识别为无效对象- 你没有给
polyCBoolOp开启保留原始网格的参数,布尔运算执行后会自动删除输入的两个原始网格,第一次循环结束后pSphere1已经被删除,第二次循环调用时自然报错无效 - 直接使用
undo回退操作风险高,很容易误删原始场景数据,也可能打断节点引用逻辑
修复后代码
import maya.cmds as cmds import pymel.core as pmc def check_mesh_intersection(): mesh_list = pmc.ls(type="mesh") # 过滤掉中间产物、隐藏网格,只取可见的可渲染网格 valid_meshes = [m for m in mesh_list if m.isVisible() and not m.isIntermediate()] char_transform = pmc.listRelatives(valid_meshes, parent=True) # 转成字符串名适配cmds接口 transform_names = [t.name() for t in char_transform] if len(transform_names) < 2: print("场景中有效网格不足2个,无需检测") return # 逐对检测所有网格的相交情况 for i in range(len(transform_names)): for j in range(i+1, len(transform_names)): mesh_a = transform_names[i] mesh_b = transform_names[j] # 执行交集布尔,保留原始网格 bool_result = cmds.polyCBoolOp(mesh_a, mesh_b, op=3, n="intersection_temp", ch=1, keepOriginalMeshes=1) if not bool_result: print(f"{mesh_a} 和 {mesh_b} 布尔运算失败,跳过检测") continue result_mesh = bool_result[0] # 取结果顶点数量 vtx_count = cmds.polyEvaluate(result_mesh, vertex=True) # 删除临时生成的交集网格 cmds.delete(result_mesh) # 输出结果 if vtx_count > 0: print(f"相交检测:{mesh_a} 和 {mesh_b} *存在相交*") else: print(f"相交检测:{mesh_a} 和 {mesh_b} 无相交") check_mesh_intersection()
修复点说明
- 统一把PyNode转成字符串名称传入cmds接口,避免类型不匹配报错
- 新增
keepOriginalMeshes=1参数,布尔运算后不会删除原始网格,避免原物体丢失报错 - 新增有效网格过滤逻辑,跳过隐藏、中间节点网格,减少无效运算
- 把循环逻辑改成逐对检测所有网格的组合,避免漏检
- 不再使用
undo回退,直接删除临时生成的交集节点,操作更安全 - 用
polyEvaluate直接取顶点数量,比调用getPoints更高效稳定
内容的提问来源于stack exchange,提问作者galaxy
相关产品推荐
相关产品推荐

