【Maya ngSkin Tool】批次輸出輸入skin

【Maya ngSkin Tool】批次輸出輸入skin

 



一直都覺得maya要在不同scene轉換skin很麻煩,內建的功能基本上就是陀屎,要安裝外掛又很麻煩,還要一個一個驗證好不好用,直到最近發現ngSkin tool其實早就已經把這個功能打包好了,順帶一提Maya 2026會直接內建ngSkin tool(沒錯,autodesk已經把他們買下來了)。


而且官網還提供API命令可以直接寫成工具,超好用。


首先先介紹手動操作,基本上就是安裝好之後,選到model然後initialize skinning layers。






然後輸出成json檔。








接著就可以準備import,這邊要注意的就是要確定model已經有bind到joints上了,否則會出現錯誤!

匯入選項我會選By VertexID,目前看起來是最準確的方式!







前面說過官網有提供api可以自己訂製功能,所以寫了個小工具可以批次輸出skin,這樣就不用一個一個選很費力。


總之就是指定要輸出的model,可以用cmds.ls(sl=True)也可以自己直接指定物件。

只要輸出的json檔案名稱跟匯入的model對得起來就可以了!

import os
import ngSkinTools2.api
from ngSkinTools2 import api as ngst_api
from ngSkinTools2.api import init_layers
from ngSkinTools2.api import InfluenceMappingConfig, VertexTransferMode

import maya.cmds as cmds



for i in["eyeshell_lod0_mesh","eyeEdge_lod0_mesh","head_lod0_mesh"]:
   
    #check if mesh has ngSkin node
   
    try:
       
        data_node = ngSkinTools2.api.target_info.get_related_data_node(i)
   
    except Exception as e: #if not create NgSkin node
       
        skin_clusters = cmds.ls(cmds.listHistory(i), type='skinCluster')
   
        layers = init_layers(skin_clusters[0])
        layer_base = layers.add("Base_weights")
       
        output_file_name = os.path.join("XXX/XXXX/XX", i+'_Skin.json')
        ngst_api.export_json(i, file=output_file_name)
        print(f"⚠️ {i} has no ngSkin data node,because:{e}")
       
    else: #if true export skin weight data
        output_file_name = os.path.join("XXXXXX", i+'_Skin.json')
        ngst_api.export_json(i, file=output_file_name)
       
       
        print(f"✅ {i} 's ngSkin data node: {data_node}")

   
#import skin weight
   
config = InfluenceMappingConfig()
config.use_distance_matching = True
config.use_name_matching = True


for i in["eyeshell_lod0_mesh","eyeEdge_lod0_mesh","head_lod0_mesh"]:
   
    #check if mesh has skin cluster
    skin_clusters = cmds.ls(cmds.listHistory(i), type='skinCluster')
   
   
   
    if  skin_clusters:
     
        #run the import
        ngst_api.import_json(i,file=os.path.join("XXXXXX", i+'_Skin.json'),vertex_transfer_mode=VertexTransferMode.vertexId,influences_mapping_config=config)
       
    else:
       
        print(f"❌ {i} has no skin cluster, please assign it first!")







張貼留言

0 留言