Nuke Python Metadata

这章介绍如何读写Metadata。

读取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) )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,059评论 25 707
  • 使用下文描述的nuke.add...()函数,当有变量事件(比如,创建节点,加载脚本)时就自动调用python函数...
    N景波阅读 2,675评论 0 1
  • 怎么创建roto 图形和 画笔当获取或者设置roto,rotopaint节点时,需要读取节点的curves kno...
    N景波阅读 1,558评论 0 1
  • 我回不到从前的岁月,再见也不到我的天蝎座姑娘。 若干年前,大学初见, 你站在台上,明亮的双眼看着我,修长的身材跳起...
    燚月仁心阅读 211评论 0 0
  • 写作是一件艰苦,孤独的事,当你把它当成朋友,细心维护友谊,并且坚持下去,也许就能成为一辈子的知己了! 记得年少时,...
    正好闲聊阅读 435评论 2 6