You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动