作者介绍

读取metadata

函数metadata() 返回一个字典,包含了特点指定节点的metadata:

node = nuke.toNode( 'Read1' )

print node.metadata()

# Result:

{'exr/displayWindow': [0, 0, 2047, 1555], 'input/width': 2048, 'exr/nuke/camera/vaperture': '18.672', 'input/bitsperchannel': '16-bit half float', 'input/filereader': 'exr', 'nuke/node_hash': 'c82817f8e9526abe', 'input/mtime': '2011-04-11 16:47:54', 'exr/nuke/camera/haperture': '24.576', 'input/ctime': '2011-04-11 16:47:54', 'exr/nuke/camera/matrix': '[-0.30901703238487244, -0.16514922678470612, 0.93660777807235718, 9.5105648040771484, 0.0, 0.98480772972106934, 0.1736481785774231, 2.0, -0.95105648040771484, 0.05366024374961853, -0.30432236194610596, -3.0901703834533691, 0.0, 0.0, 0.0, 1.0]', 'input/filename': '/Volumes/ohufx/consulting/Foundry/PythonDevGuide/footage/metadata/renderWithMetadata.0003.exr', 'input/filesize': 193828, 'exr/screenWindowCenter': [0.0, 0.0], 'exr/dataWindow': [463, 417, 1518, 1435], 'exr/nuke/camera/focal': '50.0', 'exr/screenWindowWidth': 1.0, 'input/height': 1556, 'exr/pixelAspectRatio': 1.0}

打印出来的结果太长没有可读性,用下面的代码增加可读性:

node = nuke.toNode('Read1')

for k,v in node.metadata().iteritems():

print k,v

结果

# Result:

exr/displayWindow [0, 0, 2047, 1555]

input/width 2048

exr/nuke/camera/vaperture 18.672

input/bitsperchannel 16-bit half float

input/filereader exr

nuke/node_hash c82817f8e9526abe

input/mtime 2011-04-11 16:47:54

exr/nuke/camera/haperture 24.576

input/ctime 2011-04-11 16:47:54

exr/nuke/camera/matrix [-0.30901703238487244, -0.16514922678470612, 0.93660777807235718, 9.5105648040771484, 0.0, 0.98480772972106934, 0.1736481785774231, 2.0, -0.95105648040771484, 0.05366024374961853, -0.30432236194610596, -3.0901703834533691, 0.0, 0.0, 0.0, 1.0]

input/filename /Volumes/ohufx/consulting/Foundry/PythonDevGuide/footage/metadata/renderWithMetadata.0003.exr

input/filesize 193828

exr/screenWindowCenter [0.0, 0.0]

exr/dataWindow [463, 417, 1518, 1435]

exr/nuke/camera/focal 50.0

exr/screenWindowWidth 1.0

input/height 1556

exr/pixelAspectRatio 1.0

设置metadata

在流中创建自定义metadata,需要使用ModifyMetaData节点。想渲染自定义metadata,就要使用支持它的文件格式( 比如,exr)

ModifyMetaData 节点接收表达式语法,意味着你可以使用TCL,有限扩展,python。在这个例子中,我们想要将camrea的焦距和

光圈和其变换矩阵写入metadata。

在此例中,camera的两个光圈范围使用tcl表达式。camera的焦距使用python. 变换矩阵使用python设置,自定义函数叫getTransform。

写成代码就如下:

def getTransform( frame ):

cam = nuke.toNode( 'masterCam')

m = []

for i in range(16):

m.append( cam['world_matrix'].valueAt( frame, i ))

return m

将上面的代码加入init.py 或 menu.py ( 或者 import进来 ),你可以让其在knob里面可以用,然后所有自定义部分添加到

ModifyMetaData 节点。

例子:createMetaDatCam

此例中,先看一段代码,其根据exr文件中的metadata创建camera。

开始一个新的函数,检查节点的metadata,如果有足够的信息就创建camera。想在流中的任何地方读取节点的metadata,请使用

metadata方法:

def createMetaDatcam( node ):

mDat = node.metadata()

接下来,收集我们想要在metadata中找到的项目,冠以group名最为前缀( 在metadata中获取全名):

reqFields = ['exr/nuke/camera/%s' % i for i in ('focal', 'haperture', 'vaperture', 'matrix') ]

检查所需数据是否为metadata的子集,如果不是,停止脚本:

if not set(reqFiedls).issubset(mDat):

print 'no metadata for camera found'

return

询问需要给camera的帧区间,将节点的帧区间作为默认值放入对话框:

first = node.firstFrame()

last = node.lastFrame()

ret = nuke.getFramesAndViews(' Create Camera from Metadata', '%s-%s' %(first, last))

nuke.getFramesAndViews返回一个列表,第一项为帧区间,第二项为所要求的视图。分离帧区间,并将其转换成帧区间对象。

现在可以忽略视图:

fRange = nuke.FrameRange( ret[0] )

创建一个camera节点,将其useMatrix knob设置为True:

cam = nuke.createNode( 'Camera2')

cam['useMatrix'].setValue( True)

遍历你所需的knob,并设置为动画:

for k in ('force', 'haperture', 'vaperture', 'matrix'):

cam[k].setAnimated()

在遍历frame range设置keyframes前,创建一个进度条,用户可以在UI中取消操作。

task = nuke.ProcessTask('Baking camera from meta data in %s' % node.name() )

用enumerate来循环。其返回当前迭代器的索引,用来更新进度条(这个例子中,名为curTask)。在使用进度条时,要检测用户使用

点击“取消”来停止循环:

for curTask, frame in enumerate( fRange ):

if task.isCancelled():

break

更新任务信息,告知我们进行到何处:

task.setMessage('process frame %s' % frame)

现在从metadata中抓取camera的当前帧的焦距和光圈值,转换成浮点值,就可以赋给knob了:

for k in ('focal', 'haperture', 'vaperture'):

val = float( node.metadata('exr/nuke/camera/%s', %k, frame))

给knob赋值:

cam[k].setValueAt( float(val), frame)

这会处理投影参数,现在需要处理camera的变换。这种情况下,metadata保存的字符串仅是python的list,可以使用evaluate转变成list。

matrixList = eval( node.metadata('exr/nuke/camera/matrix' ))

迭代整个list并给当前帧的摄像机matrix赋值:

for i,v in enumerate( matrixList ):

cam['matrix'].setValueAt( v, frame, i)

最后更新进度条,因此,我们就知道进行到哪了。

task.setProgress( int(float(curTask)/fRange.frames()*100))

全部代码如下:

import nuke

def createMetaDatCam( node ):

'''

create a camera node from meta data.

This assumes the following keys in the given nodes meta data stream: 'focal', 'haperture', 'vaperture' and 'matrix',

where 'matrix' carries the result of "[python nuke.toNode( 'Camera1' ).knob('world_matrix').valueAt( nuke.frame() )]"

args:

node - node to check for meta data

ask - prompt before creating camera

'''

mDat = node.metadata()

reqFields = ['exr/nuke/camera/%s' % i for i in ('focal', 'haperture', 'vaperture', 'matrix')]

if not set( reqFields ).issubset( mDat ):

print 'no metdata for camera found'

return

first = node.firstFrame()

last = node.lastFrame()

ret = nuke.getFramesAndViews( 'Create Camera from Metadata', '%s-%s' %( first, last ) )

fRange = nuke.FrameRange( ret[0] )

cam = nuke.createNode( 'Camera2' )

cam['useMatrix'].setValue( True )

for k in ( 'focal', 'haperture', 'vaperture', 'matrix'):

cam[k].setAnimated()

task = nuke.ProgressTask( 'Baking camera from meta data in %s' % node.name() )

for curTask, frame in enumerate( fRange ):

if task.isCancelled():

break

task.setMessage( 'processing frame %s' % frame )

# GET ALL FRAMES

for k in ( 'focal', 'haperture', 'vaperture' ):

val = float( node.metadata( 'exr/nuke/camera/%s' % k, frame ) )

cam[ k ].setValueAt( float( val ), frame )

# CONVERT STRING BACK TO LIST OBJECT AND ASSIGN

matrixList = eval( node.metadata('exr/nuke/camera/matrix') )

for i, v in enumerate( matrixList ):

cam[ 'matrix' ].setValueAt( v, frame, i)

# UPDATE PROGRESS BAR

task.setProgress( int( float(curTask) / fRange.frames() *100) )

python元数据相加函数_【Nuke教程】通过Python获取素材Metadata(元数据)相关推荐

  1. python 使用异常函数_您如何测试Python函数引发异常?

    python 使用异常函数 This article elaborates on how to implement a test case for a function that raises an ...

  2. python微信跳一跳_[小白教程] 用Python占领微信跳一跳排行榜

    文/帅朋 微信新版 6.6.1 加入了「跳一跳」这个游戏功能,并迅速在朋友圈之间火了起来.很多人为了能够跳到更高的分数而努力的奋斗着.那么今天我就来蹭一蹭「跳一跳」的热度,给大家提供一个方法让你快速的 ...

  3. python安卓app开发_[实例教程] 用python开发android应用

    Python是动态语言,比较简洁.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid提供了在android平台上对python语言的支持:CL ...

  4. python span.string函数_【转】python f-string

    主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法.与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今天 ...

  5. python内置函数open_Python学习教程:Python内置函数大总结(下篇)

    这里接着上次的 Python学习教程,给大家总结了Python 剩下的33个内置函数. 31 hash() 返回对象的哈希值 In [112]: hash(xiaoming)Out[112]: 613 ...

  6. python如何拟合函数_我们如何在Python中拟合一个sigmoid函数?(How do we fit a sigmoid function in Python?)...

    由于可重现性的原因,我正在共享我在这里工作的简单数据集. 为了弄清楚我在做什么--从第2列开始,我读取当前行并将其与前一行的值进行比较.如果它更大,我会不断比较.如果当前值小于前一行的值,我想用当前值 ...

  7. python线程延时函数_延迟队列的python实现

    方案思路 1.利用优先级队列实现 2.利用redis的zset实现 3.利用rabbitmq超时TTL后的死信机制实现 4.通过threading.Timer()使用多线程解决需求.注:这不是延迟队列 ...

  8. python多个函数_什么是在Python中使用多个构造函数的干净的、pythonic的方法?

    其实None对于"魔法"价值观来说要好得多:class Cheese(): def __init__(self, num_holes = None): if num_holes i ...

  9. python指数运算函数_分享Python中用于计算指数的exp()方法实例教程

    exp()方法返回指数x: ex. 语法 以下是exp()方法的语法:import math math.exp( x ) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math ...

最新文章

  1. 谷歌浏览器中文版_GitHub上最励志的计算机自学教程:8个月,从中年Web前端到亚马逊百万年薪软件工程师 | 中文版...
  2. 关于DOM操作的几个类型
  3. E: Sub-process /usr/bin/dpkg returned an error code (1) Ubuntu安装apt-get命令报错
  4. 计算机专业方面的论文,计算机专业毕业论文
  5. 【ASP.NET Web API教程】3.4 HttpClient消息处理器
  6. 男朋友花3000元买一块电脑显卡,他是怎么想的?
  7. 基于matlab的gmsk,基于matlab的gmsk
  8. hprose for java 教程_Hprose for Java怎么使用?Hprose for Java使用教程
  9. 《烈烈先秦》7、大秦的克星——侠将公子信陵君
  10. 关于VSCode编码:自动猜测编码字符集
  11. A micro Lie theory for state estimation in robotics005:The tangent spaces and the Lie algebra
  12. python之pyautogui实现鼠标键盘控制
  13. 魔兽争霸英雄英语名称
  14. html免费问答系统模板,tipask问答系统模板文件对照表详解
  15. HbuilderX 快捷键修改
  16. PHP判断字符串是否含有特殊字符(亲测有效)
  17. 机器视觉系列(一)——概述
  18. MyBatis-Plus——超详细讲解配置文件
  19. 地下暗管探测技术方案——探地雷达(暗管探测仪)
  20. 奥维尔号量子计算机,README.md

热门文章

  1. Windows10为什么打开IE自动跳转到Edge?
  2. mysql 遠端,遠端連線 GCE 的 MySQL 資料庫
  3. 离美归国因AI抢走饭碗?颜宁本人长文回应
  4. 跟着别人学设计模式-----(一)单例模式详解
  5. 一篇文章帮你搞定JVM中的堆
  6. 2018 1/28随笔
  7. OPERATING SYSTEM_Processes1
  8. 控制理论与应用 期刊LaTeX模板使用注意事项
  9. 移动端ios使用fixed定位,偶现元素不显示问题(百度浏览器)
  10. python秒表项目_上海python秒表课程作业