Maya&Python&Nuke的几点笔记
2011-10-08 22:50
591 查看
1.使用C++写的mll插件可以直接用Python调用,方法如同调用内置命令,但有时会遇到识别不了命令名的错误(name 'xxx' is not defined),即便是使用mel可以直接调用。
导致这个的原因,在于import maya.cmds在loadPlugin xxx之前,而loadPlugin之后python已经import的模块不会自己更新,所以需要重新import,如下:
2.虽然在此Blog中时不时呻吟Python很爽,但还是要再次的表达对Python的惊喜!
Nuke输出时write节点不会自动创建文件夹,所以如果输出图片序列到一个文件夹,如果这个文件夹不存在需要先创建好。如果上百个镜头,废话就是需要创建上百个文件夹,直接用Python一分钟搞定:(写好后如果以后再创建此类任务就是几秒钟了)
执行后1秒钟Python就会创建出87个文件夹,Nuke里直接指定就OK了。
另外,我现在手中每个镜头都需要做这么几件事:
创建一个设计好的gizmo“Framer”来显示timecode等
将Framer的镜头号改为当前镜头
创建Write节点
指定好Write的输出路径(按镜头号)
将此nk文件保存到指定路径(按镜头号)
这些每次都要自己手动做么……not fasion,让Python来吧~
下面就是上面任务的Python版:
很简单吧,需要注意的是,Python自带的input()在Nuke里不能直接使用,Nuke提供了一个getInput()来调出对话框获取输入。
这样执行finalizer()就可以一次执行了,但还是不够fasion,可以把这段def写到menu.py里,并且新建一个toolbar的command,这样在Nuke里直接点击命令就可以完成这些操作,如下图的图标
当然……创建文件夹和这个Finalizer是可以合并到一个的。
3. Python可以方便快速的完成一些简单数据的互导,比如Maya<=>Nuke。
在/article/8897955.html这个作品里火焰的亮度和地面的灯光强度肯定是要一致的,但地面灯光强度的变化是在Maya里使用表达式来控制的,想要后期让Nuke中辉光和火焰透明度、亮度等跟随变化(……当然道理上是地面跟着火焰变的),本来使用过tracker+sampler的Nuke表达式,但发现Nuke的py表达式和Maya不一样的地方在于,并不是完全执行完得到结果后再到下一帧,而是播放速度根本不受代码执行速度影响的,这就导致sampler在获取像素亮度结果出来之前nuke已经把非最终结果当成结果来用到效果里面并进入下一帧……十分纠结。
后来使用了一种很简单的方法解决了问题:在Maya里把灯光亮度使用表达式逐帧输出到一个序列,然后在Nuke中读入,一个for循环逐帧还原key帧,没有不同步的问题,所以完美解决~~
导致这个的原因,在于import maya.cmds在loadPlugin xxx之前,而loadPlugin之后python已经import的模块不会自己更新,所以需要重新import,如下:
def init(): global kCmd loaded = pluginInfo(kPluginName,q=1,l=1,command=1) if not loaded: loadPlugin(kPluginName) import maya.cmds # Reload! kCmd= maya.cmds.xxx
2.虽然在此Blog中时不时呻吟Python很爽,但还是要再次的表达对Python的惊喜!
Nuke输出时write节点不会自动创建文件夹,所以如果输出图片序列到一个文件夹,如果这个文件夹不存在需要先创建好。如果上百个镜头,废话就是需要创建上百个文件夹,直接用Python一分钟搞定:(写好后如果以后再创建此类任务就是几秒钟了)
import os path = r'X:\.....\cam' # Path for i in range(86): # 000~086 target_path = path+str(i).zfill(3) os.makedirs(target_path)
执行后1秒钟Python就会创建出87个文件夹,Nuke里直接指定就OK了。
另外,我现在手中每个镜头都需要做这么几件事:
创建一个设计好的gizmo“Framer”来显示timecode等
将Framer的镜头号改为当前镜头
创建Write节点
指定好Write的输出路径(按镜头号)
将此nk文件保存到指定路径(按镜头号)
这些每次都要自己手动做么……not fasion,让Python来吧~
下面就是上面任务的Python版:
import nuke def finalizer(): shoot = nuke.getInput('Cam Num:') if len(shoot)==0: return framer = nuke.createNode('Framer') framer['CamNum'].setValue(str(shoot)) print('Framer Done.') shoot_str = str(shoot).zfill(3) output_path = r'x:/....../cam'+shoot_str+r'/cam'+shoot_str+'_####.jpg' write = nuke.createNode('Write') write['file'].setValue(output_path) print('Writer Done.') file_path = r'X:/......../comp'+shoot_str+'.nk' nuke.scriptSaveAs(filename=file_path, overwrite=1) print('Save Done.')
很简单吧,需要注意的是,Python自带的input()在Nuke里不能直接使用,Nuke提供了一个getInput()来调出对话框获取输入。
这样执行finalizer()就可以一次执行了,但还是不够fasion,可以把这段def写到menu.py里,并且新建一个toolbar的command,这样在Nuke里直接点击命令就可以完成这些操作,如下图的图标
当然……创建文件夹和这个Finalizer是可以合并到一个的。
3. Python可以方便快速的完成一些简单数据的互导,比如Maya<=>Nuke。
在/article/8897955.html这个作品里火焰的亮度和地面的灯光强度肯定是要一致的,但地面灯光强度的变化是在Maya里使用表达式来控制的,想要后期让Nuke中辉光和火焰透明度、亮度等跟随变化(……当然道理上是地面跟着火焰变的),本来使用过tracker+sampler的Nuke表达式,但发现Nuke的py表达式和Maya不一样的地方在于,并不是完全执行完得到结果后再到下一帧,而是播放速度根本不受代码执行速度影响的,这就导致sampler在获取像素亮度结果出来之前nuke已经把非最终结果当成结果来用到效果里面并进入下一帧……十分纠结。
后来使用了一种很简单的方法解决了问题:在Maya里把灯光亮度使用表达式逐帧输出到一个序列,然后在Nuke中读入,一个for循环逐帧还原key帧,没有不同步的问题,所以完美解决~~
相关文章推荐
- <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
- <Test-Driven Development with Python>学习笔记 第一部分 测试驱动开发基础
- Python学习笔记——print&列表
- Python 笔记 #07# NumPy 文档地址 & Subsetting 2D Arrays
- python学习笔记 loop&&raw_input 7&& if
- [python笔记]switch&case in python
- Python学习笔记 set&&dict
- python基础学习笔记<函数式编程与模块>
- 【Python3 笔记】常用函数 & 语法
- python学习笔记(2)——list&tuple
- Python & Django 学习笔记
- 学习笔记【python】循环 zip and &
- Python学习笔记(3)用户输入&函数
- C++ & Python 多线程笔记
- python 核心编程学习笔记(第3章) 对应Let's-python视频第4集
- python学习笔记-语法基础(dict&set)
- Python笔记 - 循环&跳出循环
- 【Python笔记】python第三方库lxml源码安装&&使用笔记
- python 核心编程学习笔记(1, 2章) 对应Let's-python视频第1, 2, 3集