Maya中如何选中网格全部顶点并单独访问、操纵?
解决Maya中获取随机网格所有顶点并逐个操作的问题
我看你现在卡在了怎么把随机生成的球体顶点全部选中并存入列表,方便后续逐个处理——原代码里的polyEvaluate用法不对,最后还清空了选择,自然拿不到有效数据。下面给你梳理下正确的实现思路和代码:
问题分析
原代码里的几个关键问题:
cmds.polyEvaluate('mySphere*', vertex=True)只是执行了顶点评估操作,但并没有返回或存储顶点的选择状态/信息,等于白执行了- 最后调用的
cmds.select()会取消所有选中对象,所以vertices变量肯定是空的 - 没有用Maya标准的组件选择语法来直接选中球体的所有顶点
正确实现步骤
- 生成随机球体后,直接用组件选择语法选中它的所有顶点
- 将选中的顶点存入扁平化的列表(避免出现范围式的顶点条目)
- 就可以通过for循环逐个操纵每个顶点了
修正后的完整代码
import maya.cmds as cmds import random # 清理旧的球体对象 sphereList = cmds.ls('mySphere*') if sphereList: cmds.delete(sphereList) # 生成随机细分参数的球体 result = cmds.polySphere(r=50, sx=random.randrange(10, 100), sy=random.randrange(10, 100), name='mySphere#') sphere_name = result[0] # 提取生成的球体对象名(polySphere返回[物体名, 构造历史节点]) # 选中该球体的所有顶点 cmds.select(f"{sphere_name}.vtx[:]", replace=True) # 将选中的顶点存入扁平化列表(确保每个顶点都是独立条目) vertex_list = cmds.ls(sl=True, flatten=True) # 示例:逐个处理顶点,比如打印顶点名称或修改位置 for vtx in vertex_list: print(f"正在处理顶点: {vtx}") # 这里可以添加你的顶点操纵逻辑,比如随机移动顶点: # cmds.move(random.randint(-20, 20), random.randint(-20, 20), random.randint(-20, 20), vtx)
关键细节说明
{sphere_name}.vtx[:]是Maya选择组件的标准语法,vtx[:]代表选中该对象的所有顶点cmds.ls(sl=True, flatten=True)必须加上flatten=True,否则顶点可能会以范围形式返回(比如mySphere1.vtx[0:10]),无法逐个访问- 如果需要获取顶点的坐标数据,也可以结合
polyEvaluate使用:# 获取所有顶点的世界空间坐标,顺序和vertex_list一一对应 vertex_positions = cmds.polyEvaluate(sphere_name, vertex=True, position=True)
内容的提问来源于stack exchange,提问作者boomstick




