[小脚本] 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可以在本地服务器上部署,也可以使用其提供…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
