Python处理C4D中的DescID和动画

python中处理动画曲线最诡异的部分就是DescIDs。

整个c4d都在使用DescID,但动画环节尤其重要。DescID是一个多层级的ID,可以定义多层级数据,比如用户数据userdata,第一个元素的DescID永远是ID_USERDATA,第二个元素是每个userdata的索引。DescID的多层级也可以给子通道使用,比如position scale rotation或者颜色的子向量。

每个DescID的元素都是一个描述等级,描述等级也有三个元素,分别是id,数据类型,创建者。

给描述元素创建tracks

描述元素木有子通道,DescID就是描述元素的ID

# Track for Object Enabled Boolean
enabled =c4d.CTrack(op, c4d.DescID(c4d.ID_BASEOBJECT_GENERATOR_FLAG))
op.InsertTrackSorted(enabled)
# Track for Light Brightness Real
track =c4d.CTrack(op,c4d.DescID(c4d.LIGHT_BRIGHTNESS))
op.InsertTrackSorted(track)

创建点X,Y,Z的tracks

每个向量都有自己的动画曲线,就跟时间线一样。每个容器的DescID包含两个级别。第一级就是position track本身,其有一个vector 类型。这是你在时间线上看到的父position。第二级就是特殊的轨道,并是real类型

trackX =c4d.CTrack(op,             
                   c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION,c4d.DTYPE_VECTOR,0),
                   c4d.DescLevel(c4d.VECTOR_X,c4d.DTYPE_REAL,0)))

trackY =c4d.CTrack(op,                                   
                   c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION,c4d.DTYPE_VECTOR,0),
                   c4d.DescLevel(c4d.VECTOR_Y,c4d.DTYPE_REAL,0)))
trackZ =c4d.CTrack(op,
                    c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION,c4d.DTYPE_VECTOR,0),
                    c4d.DescLevel(c4d.VECTOR_Z,c4d.DTYPE_REAL,0)))

op.InsertTrackSorted(trackX)
op.InsertTrackSorted(trackY)
op.InsertTrackSorted(trackZ)

用户数据的tracks

创建或者遍历userdata时,获取的id就是DescID。对于有类似向量,颜色子通道的物体,还是需要给每个通道添加track。下面的代码描述了DescID和DescLevel,同时包含一些自定义的函数并创建userdata的track。仅考虑了部分类型。

importc4d
 
def CreateUDTrack(op,id):
    tracks =[]
    # element0 is always UD group
    # element1 is the UD itself
    ud =id[1]
    dtype =ud.dtype
    if dtype ==c4d.DTYPE_VECTOR or dtype ==c4d.DTYPE_COLOR:
        # get datatypes with subchannels and add multiple tracks
        for v in xrange(c4d.VECTOR_X, c4d.VECTOR_Z+1):
            descID =c4d.DescID(id[0],id[1],c4d.DescLevel(v,c4d.DTYPE_REAL))
            tracks.append(c4d.CTrack(op,descID))                                       
    else:
        # just add the single track
        tracks.append(c4d.CTrack(op,id))
 
    return tracks
 
def main():
    for id, bc in op.GetUserDataContainer():
        # id is the DescID, bc is the container
        print bc[c4d.DESC_NAME], id
         
        # look at each DescLevel
        # this isn't necessary, just instructive
        for level in xrange(id.GetDepth()):
            print "Level ", level, ": ", \
                  id[level].id, ",", \
                  id[level].dtype, ",", \
                  id[level].creator
                   
        # Create tracks using custom function
        tracks =CreateUDTrack(op,id)
        # Loop through returned tracks and insert
        for track in tracks:
            op.InsertTrackSorted(track)
 
 
if__name__=='__main__':
    main()

查找track

C4D 13之后就可以用FindCtrack用DescID找到已存在的动画曲线了。不确定曲线是否存在这绝对是个好方法。另外,c4d会直接用相同的参数创建曲线。

# Track for Light Brightness Real
dBrightness =c4d.DescID(c4d.LIGHT_BRIGHTNESS) #assign the DescID to a var for convenience
tBrightness =op.FindCTrack(dBrightness) #find the track
if not tBrightness:                      #if track isn't found, create it
    tBrightness =c4d.CTrack(op,dBrightness)
    op.InsertTrackSorted(tBrightness)

添加key

一旦有了track,添加关键帧就很简单。所有的关键帧都应用到了F-Curve,这是一个CCure对象。因此,需要先获取CCure,再使用AddKey或者InsertKey来添加。FillKey可以用默认值添加,设置合适的插值。同样,可以用浮点数来setValue。

#Get the curve
curve =track.GetCurve()
 
#Add keys using AddKey
#Creates the key at the proper time
#Then you modify the key
keyDict =curve.AddKey(c4d.BaseTime(0))
#keyDict is a dict with key=CKey and int=index
myKey =keyDict["key"]
#Use FillKey to fill the key with default values (interpolation)
trk.FillKey(doc,op,myKey)
#Use SetValue or SetGeData to set the key value
myKey.SetValue(curve,1)
#myKey.SetGeData(curve,1)
     
#Add keys using InsertKey
#Define the key first
key =c4d.CKey()
#Use FillKey to fill the key with default values (interpolation)
trk.FillKey(doc,op,key)
key.SetTime(curve,c4d.BaseTime(1))
key.SetValue(curve,.5)
#key.SetGeData(curve,1)
#Then insert it
curve.InsertKey(key)

设置关键帧选择

另一个有关DescID的例子就是设置选中物体的关键帧。可以和录制按钮一起使用来创建track,但是上面说的方法更加稳定。可以在特定的特殊物体上指定关键帧。

# Put the "Position" desclevel in a variable for convenience
pos =c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION, c4d.DA_VECTOR)
# Set Keyframe selection on each vector X,Y,Z
op.SetKeyframeSelection(c4d.DescID(pos,c4d.DescLevel(c4d.VECTOR_X, c4d.DA_REAL, c4d.DA_VECTOR)), True)
op.SetKeyframeSelection(c4d.DescID(pos,c4d.DescLevel(c4d.VECTOR_Y, c4d.DA_REAL, c4d.DA_VECTOR)), True)
op.SetKeyframeSelection(c4d.DescID(pos,c4d.DescLevel(c4d.VECTOR_Z, c4d.DA_REAL, c4d.DA_VECTOR)), True)
# Update the C4D Interface
c4d.EventAdd()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容