[小脚本] 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段ÿ…...
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可以在本地服务器上部署,也可以使用其提供…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
