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

Maya从CSV导入OBJ文件后位姿缩放未生效的技术求助

解决Maya导入OBJ后未按CSV配置移动缩放的问题

看起来你卡在了Maya脚本处理OBJ导入后变换不生效的问题上,我帮你梳理下核心问题和修复方案:

核心问题分析

你的脚本里有两个关键问题导致移动、缩放没生效:

  • 字符串未转换为数值:从CSV读取的位置、缩放值都是字符串类型,而Maya的cmds.movecmds.scale需要接收数值(int/float)参数,直接传字符串会被忽略或者报错。
  • 导入节点的返回值可能不准确:默认cmds.file(i=True)返回的是导入文件的引用节点,不是实际的变换节点,导致后续的变换命令找不到正确的操作对象。

修正后的完整脚本

import maya.cmds as cmds

# CSV路径与格式定义
pathOfFiles = "D:/environment/human/"  # 存放所有文件的文件夹
csv_path = "D:/environment/human/objectdata.csv"

# 读取CSV文件,跳过首行格式说明
with open(csv_path, "r") as fh:
    content = fh.readlines()[1:]

for line in content:
    # 清理行内容并分割参数
    line_clean = line.strip()
    if not line_clean:  # 跳过空行
        continue
    values = line_clean.split(";")
    
    # 确保参数数量正确(避免CSV行格式错误)
    if len(values) != 9:
        print(f"跳过格式错误的行: {line}")
        continue
    
    # 导入OBJ文件,指定返回新创建的变换节点
    # 使用returnNewNodes=True获取实际的变换节点,而不是文件引用
    imported_nodes = cmds.file(
        pathOfFiles + values[0],
        i=True,
        returnNewNodes=True,
        mergeNamespacesOnClash=False  # 避免命名空间冲突
    )
    
    # 过滤出变换节点(OBJ导入会生成transform和shape节点,我们需要操作transform)
    transform_nodes = [node for node in imported_nodes if cmds.objectType(node) == "transform"]
    if not transform_nodes:
        print(f"未找到{values[0]}的变换节点,跳过")
        continue
    
    target_obj = transform_nodes[0]
    
    # 将CSV字符串转换为数值类型,执行移动
    pos_x = float(values[1])
    pos_y = float(values[2])
    pos_z = float(values[3])
    cmds.move(pos_x, pos_y, pos_z, target_obj, absolute=True)
    
    # 执行统一缩放
    scale_val = float(values[8])
    cmds.scale(scale_val, scale_val, scale_val, target_obj, absolute=True)
    
    # 补充:WXYZ四元数转欧拉角并设置旋转
    # 这里帮你补上旋转的处理,直接用四元数设置更准确
    rot_w = float(values[4])
    rot_x = float(values[5])
    rot_y = float(values[6])
    rot_z = float(values[7])
    cmds.xform(target_obj, rotation=[rot_x, rot_y, rot_z, rot_w], rotationOrder="wxyz", absolute=True)

关键修复点说明

  • 数值类型转换:所有从CSV读取的参数都用float()转换成数值,确保Maya命令能正确解析。
  • 准确获取导入节点:使用returnNewNodes=True获取导入后新创建的所有节点,再过滤出变换节点(transform),这是我们需要操作的顶级节点。
  • 空行与格式校验:添加了空行跳过和参数数量校验,避免因CSV格式错误导致脚本崩溃。
  • 补充旋转功能:直接使用cmds.xform设置WXYZ四元数旋转,比转欧拉角更准确,避免旋转顺序带来的问题。

额外建议

  • 可以在脚本开头添加cmds.undoInfo(openChunk=True),结尾添加cmds.undoInfo(closeChunk=True),这样所有导入和变换操作可以一次性撤销。
  • 如果导入的OBJ有多个变换节点,可以根据需求调整transform_nodes的处理逻辑,比如全部应用变换或者选择特定节点。

内容的提问来源于stack exchange,提问作者kras

火山引擎 最新活动