当前位置: 首页 > news >正文

[小脚本] maya 命令行常用操作

其实这些代码大部分是从 chatgpt 中生成的。

骨骼命名

import maya.cmds as cmdsdef rename_bones():selected_bones = cmds.ls(type="joint")  # 获取选中的骨骼for bone in selected_bones:if "_" in bone:new_name = bone.split("_")[0]  # 获取下划线前面的部分作为新的骨骼名称cmds.rename(bone, new_name)  # 重命名骨骼rename_bones()

层级 rename

import maya.cmds as cmdsdef rename_bones_with_suffix(bone, suffix):children = cmds.listRelatives(bone, children=True, type="joint") or []  # 获取骨骼的子骨骼for child in children:rename_bones_with_suffix(child, suffix)  # 递归调用,处理子骨骼new_name = bone + suffix  # 添加结尾字符串cmds.rename(bone, new_name)  # 重命名骨骼print("将骨骼 {} 重命名为 {}".format(bone, new_name))selected_bones = cmds.ls(selection=True, type="joint")  # 获取选中的骨骼for bone in selected_bones:rename_bones_with_suffix(bone, "_R")

属性赋值

左手旋转复制到右手上

import maya.cmds as cmdsdef flip_z_rotation(source_bone, target_bone):# 获取源骨骼的旋转值source_rotation = cmds.getAttr(source_bone + ".rotate")[0]# 翻转旋转值的Z轴flipped_rotation = [source_rotation[0], source_rotation[1], -source_rotation[2]]# 将翻转后的旋转值赋值给目标骨骼cmds.setAttr(target_bone + ".rotate", flipped_rotation[0], flipped_rotation[1], flipped_rotation[2], type="double3")print("将骨骼 {} 的旋转值翻转并赋值到骨骼 {}".format(source_bone, target_bone))all_bones = cmds.ls(type="joint")  # 获取所有骨骼for bone in all_bones:if "_L" in bone:# 替换"_L"为"_R"的骨骼target_bone = bone.replace("_L", "_R")# 检查替换后的骨骼是否存在if cmds.objExists(target_bone):flip_z_rotation(bone, target_bone)

控制台调用批量处理

自己的批量处理框架

# -*- coding: utf-8 -*-import os
import json
import math
import errno
import numpy as np    import maya.cmds as cmds
import pymel.core as pm
import pymel.core.nodetypes as nt
import pymel.core.datatypes as dtfrom maya import mel def SetFPS(fps):unit = 'ntscf'if fps == 15:unit = 'game'elif fps == 24:unit = 'film'elif fps == 25:unit = 'pal'elif fps == 30:unit = 'ntsc'elif fps == 48:unit = 'show'elif fps == 50:unit = 'palf'elif fps == 60:unit = 'ntscf'else:unit = str(fps)+'fps'cmds.currentUnit( time=unit )fps = mel.eval('currentTimeUnitToFPS')# 等价的#mel.eval("currentUnit -time ntsc;")return fpsclass Cls_get_pure_bone:def __init__(self, bones, dstRoot=None, fps=30):self.use_joints = bonesself.dstRoot = dstRootself.fps = fps    def setup(self):cmds.file(new=True, force=True)if self.fps == 30:mel.eval("currentUnit -time ntsc;")self._import_fps = Falseelse:SetFPS(self.fps)self._import_fps = False#self._import_fps = Truedef run(self, animFbx, outFn, targetOnly=True):# import source animationpm.importFile(animFbx, type='FBX',importFrameRate=self._import_fps,importTimeRange='override')startFrame = pm.playbackOptions(animationStartTime=True, q=True)endFrame   = pm.playbackOptions(animationEndTime=True, q=True)def string_array_contains(array, string):for item in array:if item == string:return True  # 包含指定字符串return False  # 不包含指定字符串all_joints=cmds.ls(type="joint")# 遍历所有骨骼for joint in all_joints:# 检查当前骨骼是否在给定的骨骼列表中if not string_array_contains(self.use_joints, joint):# 检查当前骨骼是否在给, joint):# 删除不在列表中的骨骼if cmds.objExists(joint):print("删除骨骼 " + joint)cmds.delete(joint)else:print("骨骼 " + joint + " 不存在")pm.playbackOptions(animationStartTime=startFrame, e=True)pm.playbackOptions(minTime=startFrame, e=True)pm.playbackOptions(animationEndTime=endFrame, e=True)pm.playbackOptions(maxTime=endFrame, e=True)# export retargeted animif targetOnly:pm.select(self.dstRoot)pm.exportSelected(outFn, type='FBX export', force=True)else:pm.exportAll(outFn, type='FBX export', force=True) return outFn  if __name__ == '__main__':import argparseparser = argparse.ArgumentParser()parser.add_argument('--inputAnimFile', type=str, default=None, help='Input Anim Fbx')parser.add_argument('--inputFolder', type=str, default=None, help='Input Fbx Directory, batch mode')parser.add_argument('--outputFolder', type=str, default=None, help='Output Fbx Directory')parser.add_argument('--resume', action='store_true', help='skip exist or redo')parser.add_argument('--targetOnly', action='store_true', help='only keep target char')parser.add_argument('--dstRoot', type=str, default='')parser.add_argument('--fps', type=int, default=30)args = parser.parse_args()file_path = "scripts/data/coco_bone.txt"# 打开文件with open(file_path, "r") as file:# 按行读取文件内容bones = [ e.strip() for e in file.readlines() ]# list input filesif args.inputFolder is None:inputFiles = [args.inputAnimFile]inputFolder = os.path.dirname(args.inputAnimFile)else:from pathlib import Pathif not os.path.isdir(args.inputFolder):# regex pattern in argpattern = os.path.basename(args.inputFolder)inputFolder = os.path.dirname(args.inputFolder)else:# directoryinputFolder = args.inputFolder# pattern = r'**/*_anim.fbx'pattern = r'**/*.fbx'inputFiles = sorted([str(f) for f in Path(r'{0}'.format(inputFolder)).glob(pattern)])if args.outputFolder is None:outputFolder = inputFolderelse:outputFolder = args.outputFoldercls = Cls_get_pure_bone(bones,dstRoot=args.dstRoot,fps=args.fps)cls.setup()for inputFile in inputFiles:relpath  = os.path.relpath(os.path.dirname(inputFile), inputFolder)        fout  = os.path.join(outputFolder, relpath) + f"/{os.path.basename(inputFile)}"ddir=fout.rsplit("/",1)[0]if not os.path.exists(ddir):os.makedirs(ddir)print('-- work on file: {0}'.format(inputFile))if args.resume and os.path.exists(fout):print('-- skip {0}'.format(inputFile))continuecls.run(inputFile, fout)

调用方式

@echo off
setlocalrem "C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" /path/get_pure_bone.py ^--inputFolder  \path\fbx_org ^--dstRoot DeformationSystem ^--outputFolder \path\fbx_org_clear ^--targetOnly --fps 30

相关文章:

[小脚本] maya 命令行常用操作

其实这些代码大部分是从 chatgpt 中生成的。 骨骼命名 import maya.cmds as cmdsdef rename_bones():selected_bones cmds.ls(type"joint") # 获取选中的骨骼for bone in selected_bones:if "_" in bone:new_name bone.split("_")[0] # 获…...

数据结构·单链表

不可否认的是,前几节我们讲解的顺序表存在一下几点问题: 1. 中间、头部的插入和删除,需要移动一整串数据,时间复杂度O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…...

Redis(秒杀活动、持久化之RDB、AOF)

目录 秒杀活动 一、测压工具jmete的使用 二、java实现秒杀活动 1、myseckillcontroller 2、先启动pos请求添加商品,再启动jmeter进行压测 Redis持久化 一 、Redis持久化之RDB 1.RDB是什么 2. 备份是如何执行的 3.Fork 4. RDB持久化流程 5. dump.rdb文件 6…...

Window安装Python和开发Pycharm

准备: 1:安装Python环境 https://www.python.org/downloads/windows/ 2: 下载Pycharm https://www.jetbrains.com/pycharm/download/other.html...

技术驱动宠物健康:宠物在线问诊系统的高效搭建手册

在数字化时代,技术正在催生出许多创新的医疗服务,而宠物在线问诊系统便是其中一项引领潮流的创举。本文将为你提供一份高效搭建宠物在线问诊系统的手册,通过技术代码示例,让你轻松打造一套技术驱动的宠物健康管理系统。 1. 架构…...

玩转k8s:yaml介绍

一.Yaml文件详解 1.Yaml文件格式 (1)Kubernetes 支持 YAML 和 JSON 格式管理资源对象 (2)JSON 格式:主要用于 api 接口之间消息的传递 (3)YAML 格式:用于配置和管理,…...

【spdk】spdk compressdev测试

spdk-23.09\go\rpc\README.md go client 启应用 启哪个应用? ./build/bin/iscsi_tgt --wait-for-rpc & /usr/local/daos-2.4/prereq/release/spdk/share/spdk/scripts/rpc.py bdev_malloc_create -b Malloc0 1024 4096 #1G bs4k /usr/local/daos-2.4/prereq…...

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注:进程是存在RAM中,程序是存放在ROM(flash)中的进程内容 BSS段&#xff…...

2023年DevOps国际峰会暨 BizDevOps 企业峰会(DOIS北京站):核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展,软件开发的模式和流程也在不断地演变。在众多软件开发方法中,DevOps已成为当下热门的软件开发运维一体化模式。特别是在中国,随着越来越多的企业开始认识到DevOps的价值,这一领域的研究与实践活动日益活跃。本…...

pdf 转html 在线预览和查询

方案一:pdf2htmlex package com.realize.controller;import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.realize.util.MsgUtil; import com.realize.util.OssUtil; import com.realize.util.PdfConvertUtil; import com.reali…...

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟,可以在网页上玩fc游戏 (gitee.com)...

JS中判断数据类型总结以及方法封装

判断数据类型封装方法: 1)type返回字符串类型 2)is开头返回Boolean类型 测试实例: JavaScript 判断数据类型的方式共有四种 typeofinstanceofconstructorObject.prototype.toString typeof typeof 操作符返回一个字符串,表示操…...

【Midjourney】绘画风格关键词

1.松散素描(Loose Sketch) "Loose sketch"(松散素描)通常指的是一种艺术或设计中的手绘风格,其特点是线条和形状的表现相对宽松、自由,没有过多的细节和精确度。这样的素描通常用于表达创意、捕捉概念或者作为设计的初步…...

教你如何低成本自建「幻兽帕鲁」服务器,快速一键部署

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…...

拥抱社交电商浪潮:微信小程序商城崛起引领电商新风向-亿发

在经过多年的发展后,各大传统电商平台的流量增速基本上已经见顶。同时,新兴的带有社交性质的电商平台,如抖音、小红书和微信商城(小程序商城)等,使得传统中心化平台的流量关注度逐渐分散。由于中心化平台需…...

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复,这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…...

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…...

邦芒忠告:职场新人最需要避开的十大雷坑

职场人最害怕的就是踩雷进坑,很多新入职场的小白都会战战兢兢,生怕哪里不对,冒犯了哪一位,或者触犯了哪一条潜规则。害怕自己踩到雷,没有走好职场第一步。最近,单位进了几个新人,看到他们就想起…...

MySQL-进阶-索引

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree(多路平衡查找树) 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain...

GitLab入门指南:上传与下载操作一网打尽

GitLab简介: GitLab是一个基于Git的开源仓库管理系统,提供了一个Web界面的Git存储库管理器,并集成了多种开发工具的功能,如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署,也可以使用其提供…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...

个人电脑部署本地大模型+UI

在这个AI飞速进步的时代,越来越多的大模型出现在市面上 本地大模型也越来越火爆! 它完全免费,随时可以访问,数据仅存在本地,还可以自己微调,训练! 今天我来教大家,如何在一台普通…...

Vue3项目实现WPS文件预览和内容回填功能

技术方案背景:根据项目需要,要实现在线查看、在线编辑文档,并且进行内容的快速回填,根据这一项目背景,最终采用WPS的API来实现,接下来我们一起来实现项目功能。 1.首先需要先准备好测试使用的文档&#xf…...

IDEA中微服务指定端口启动

在使用IDEA开发SpringBoot微服务时,经常需要开启多个服务实例以测试负载均衡,以下几种方法开启不同端口。 直接在配置文件中指定 # application.propertiesserver.port8001指定VM参数 点击Modify options,选择Add VM options,值…...

vb监测Excel两个单元格变化,达到阈值响铃

需求 在Excel中实现监控两个单元格之间的变化范围,当达到某个设定的值的范围内时,实现自动响铃提示。 实现: 首先设置Excel,开启宏、打开开发者工具,点击visual Basic按钮,然后在左侧双击需要监测的shee…...