大家好,我是cg怪咖,有一段時間沒有發微了,主要是趕項目流程,近期由于流程上對資料的一些需求,又開始折騰abc了,雖然abc流程從開發者維護上看,估計是快歇菜了,但由于項目的緊迫性,是以沒有冒進研究和使用當下火熱的usd,隻希望未來有時間去梳理和學習它了,話不多說,回到這次的課題上來,相信使用過maya導出abc的大大們都會遇到此類問題,或者說會遇到諸如以下訴求。
- 如何添加自定義屬性
- 多任務輸出
- 綁定添加的deforer會修改shape名
- 如何讀取frame range
- 如何添加自定義資訊(metadata)
- 不同層級同根組多任務輸出
這些是我們在實際dataflow開發中遇到幾個問題,最後通過測試和開發解決了這些問題,是以這裡分享給大大們,咱們一條一條捋吧:
- 自建屬性,這個一查幫助就知道,在導出指令裡添加使用-userAttr和-userAttrPrefix兩個flag,然後在相對于的shape節點下建立對應名稱的屬性即可,沒什麼難度
- 多任務輸出,其實沒什麼好說的,但有不少開發者并不知道,導緻反複讀取時間軸,隻需添加"-job"即可,有多少個導出任務就添加幾個
- 在實際生産中,我們都會遇到shape節點名被強行修改成字尾為*deform,處理這個問題,最簡單的辦法就是把名字改回來,不過這一點其實也挺笨的,其實可以在導出abc,建立shape primitive的時候,把名字截取掉即可,這裡說的方法需要修改maya導出abc指令的源碼,反正在devkit裡有,找到相應的方法,用字元串處理也好,用正則也罷
- 如何讀取abc緩存的幀範圍,這個問題,不少開發者問過本人或者在群裡問過,這裡就直接上源碼吧
其實,筆者并不提倡使用這種方法擷取framerange,如果了解abc資料格式的話,這樣擷取很可能是錯誤的,因為abc可以為每一個object(元類)添加sample,而上面的代碼隻讀取到了top層級下第一個元類物體(xform)我們預設它有多次采樣是以才能正常的擷取幀範圍,是以我們應該用更取巧的方式來擷取,我們往下看。import alembicdef get_frame_range(abc_file): if os.path.exists(abc_file): abc = alembic.Abc.IArchive(abc_file.encode("ascii", "ignore")) top = abc.getTop() for child in top.children: object_header = child.getHeader() sample_node = None if alembic.AbcGeom.IXform.matches(object_header): sample_node = alembic.AbcGeom.IXform(top, child.getName()) if sample_node: sample_schema = sample_node.getSchema() num = sample_schema.getNumSamples() time_smap = sample_schema.getTimeSampling() return (float(24*time_smap.getSampleTime(0)), float(24*time_smap.getSampleTime(num-1)))
- metadata,或者很多人都不知道吧,但就如exr格式一樣,abc也支援metadata,但maya裡好像并沒有提及如何建立,是以我們先通過python代碼來闡述一下如何添加metadata。
通過這段代碼,我們就給abc檔案建立了metadata,那麼frame range的問題是不是就可以通過這樣的方式傳遞喃,當然你還可以給abc建立userProperties來達到同樣的效果,話說回來,其實可以給每一個元類上建立不同的metadata,這就看使用者怎麼使用了。import alembic'''create'''md = alembic.AbcCoreAbstract.MetaData()md.set("mayaColorSet", "1")archive = alembic.Abc.CreateArchiveWithInfo(abc_file, 'xxx', 'xxx', md)'''read'''archive = alembic.Abc.IArchive(abc_file)top = archive.getTop()meta_data = top.getMetaData()meta_data.get('mayaColorSet')
- 這個其實比較難說明白,是以放在了最後,可能這樣的情況比較少出現在流程裡,比如我們定義一個資産的高低模,可能有些公司會放在兩個檔案來做,這裡我們讨論的情況是在一個檔案下來做,大綱的層級可能會是這樣。 如上圖所示,假設"Root"是定義的資産的根root,子集"Body"是我們定義的高模,"Proxy"是我們定義的代理模型或者低模。在動畫階段時導出abc,如果想分成2個abc檔案包含不同的層級呢,像"Root->Geo_grp->Body"和"Root->Geo_grp->Proxy"兩個不同的檔案,而且root是同一個。通過測試發現,沒辦法在一次輸出中同時寫兩個檔案,隻能多次輸出達到想要的結構,試想一下當一個鏡頭有多個角色的時候,會跑多少次,通常的情況可能會出現在解算環節,比如毛發,導出頭皮,導出引導線等等等,maya預設的abc導出隻有"root"和"sl"兩個flag,而且必須根據選擇的物體來導出,顯得就不那麼靈活,是以我們特别修改了maya的abc導出功能,重寫了一個方法來解決此類問題,并添加了一個flag來記錄所需的物體清單,實作一次輸出帶有不同層級,同一根組的需求,這樣去節省動畫或者解算環節跑cache的時間,當然其他的解決辦法也有,比如可以跑多任務去解決這類問題,隻是解決問題的思路、方法不同吧,咋看之下,結構相同,但調用的系統資源可大不一樣。有時候我們在面臨一些問題時,能否找到最佳的方法,能否刨根問底,精益求精呢希望以上的方法能幫助到各位!!!
maya怎麼導出abc格式_如此導出ABC緩存,當真是隐藏秘籍啊!!!(源碼+插件)
說了那麼多“廢話”,總要來點幹貨吧..........
插件:
連結:https://pan.baidu.com/s/1dsRsmNjekm8t6-0BE4WjIQ
提取碼:byrp
使用說明:
下載下傳檔案後,将解壓的檔案AbcExport.mll替換掉,如C:\Program Files\Autodesk\Maya2018\bin\plug-ins\AbcExport.mll
溫馨提示:替換有風險,小心留備份!
具體如何使用導出指令,可以通過AbcExport -h來檢視或者maya help(注意新增的flag不在幫助清單裡)此次補充在abc導出指令的基礎上使用以下flag:
- 添加metadata:使用"-meta frameStart=111;frameEnd=222;"
- 多檔案輸出同層級:使用"-obj |Root_grp|Geo_grp|Body"
注:此次因為需求原因,隻編譯了兩個版本(maya2018 和 maya2019),其他的版本,大家可以自行編譯,如果有需要的大大們,隻需分享本文到朋友圈後,截圖發送公衆号留言即可,望各位大大了解和支援。
最後,如果有對abc開發有研究或者疑問的朋友可以通過留言或者加入微信群的方式,進行交流學習。
可以在微信搜尋中搜尋微信号"witcg交流群",如遇問題可以在公衆号留言