skinWeight Mesh Combine
mesh> combine option
MELだと
string $combine[] = `polyUniteSkinned -constructionHistory 0 -mergeUVSets 1`;
参考URL
https://help.autodesk.com/cloudhelp/2023/JPN/Maya-Tech-Docs/Commands/polyUniteSkinned.html
skinWeight Mesh Combine
mesh> combine option
MELだと
string $combine[] = `polyUniteSkinned -constructionHistory 0 -mergeUVSets 1`;
参考URL
https://help.autodesk.com/cloudhelp/2023/JPN/Maya-Tech-Docs/Commands/polyUniteSkinned.html
get SkinCluster from mesh
string $SkinSkinCluster = `findRelatedSkinCluster $mesh`;
応用例
print(">>>>>>>>>>>>>SkinWeightCheck Start>>>>>>>>>>\n");
select "|parts_low";
string $selected[] = `ls -sl -long -absoluteName`;
string $selectedStr = stringArrayToString($selected, ","); // ","を区切り文字として結合する
print("SkinWeightCheckの 選択したもの $selected= "+$selectedStr+"\n");
string $mesh[];
for ($sel in $selected) {
string $allMesh[] = `listRelatives -ni -pa -ad -typ "mesh" $sel`;
for ($am in $allMesh) {
string $trans[] = `listRelatives -ni -pa -p $am`;
$mesh[size($mesh)] = $trans[0];
}
}
$mesh = stringArrayRemoveDuplicates($mesh);
string $meshStr = stringArrayToString($mesh, ","); // ","を区切り文字として結合する
print("SkinWeightCheckの メッシュのみ選別したもの $mesh= "+$meshStr+"\n");
for ($mesh_i in $mesh){
//print("$mesh_i= "+$mesh_i+"\n");
string $SkinCluster = `findRelatedSkinCluster $mesh_i`;
print("メッシュ : "+$mesh_i+" SkinCluster : "+$SkinCluster+" \n");
//string $influenceJoint[] = `skinCluster -q -influence $mesh_i`;
string $influenceJoint[];
int $inflenceJointBool=0;
if ( catch ($influenceJoint=`skinCluster -q -influence $mesh_i`)) {
print("B ------------------------------------------------------------------------------->>>>>メッシュ : "+$mesh_i+" のインフルエンスジョイントがありません!!NG \n");
$inflenceJointBool=1;
$AllWeightMeshBool=1;
}else{
print("A OK \n");
$inflenceJointBool=0;
}
int $WeightMeshBool=0;
if($inflenceJointBool==0){
print("メッシュ : "+$mesh_i+" influenceJoint : "+$influenceJoint[0]+" \n");
//vtx[100] の joint1 の weight を取得
//skinPercent( 'skinCluster1', 'pPlane1.vtx[100]', t='joint1', query=True, value=True)
//string $weight[] = `skinPercent -query -value -t $influence[0] $SkinCluster $mesh `;
string $vertex = $mesh_i+".vtx[0]" ;
//string $weight[] = `skinPercent -query -value $vertex $SkinCluster`;
float $weightFloatArr[] = `skinPercent -query -value $SkinCluster $vertex`;
print("$weightFloatArr= "+floatArrayToString($weightFloatArr, ", ")+"\n");
//skinPercent -query -value skinCluster1 pPlane1.vtx[100];
float $weightAll=0;
for ($val in $weightFloatArr){
$weightAll=$weightAll + $val;
}
print("$weightAll= "+$weightAll+"\n");
if($weightAll>0){
print("SkinWeight OK !!! $mesh_i= "+$mesh_i+" OK!!!!!\n");
}else{
$WeightMeshBool=1;
print("SkinWeight -----------------------------------------------------------スキンウェイトがありません--Attention !!! $mesh_i= "+$mesh_i+" NG!!!!!\n");
}
$AllWeightMeshBool=$AllWeightMeshBool+$WeightMeshBool;
}
}//for
参考
[maya][python] findRelatedskinCLuster
https://discourse.techart.online/t/maya-python-findrelatedskincluster/2673
あるようで知らない特殊な複製。
// 選択したノードに至る上流ノード (およびその接続) も複製されます。
// スキンウェイトなどもコピーされます。
duplicate -upstreamNodes;
上記の場合
duplicate -returnRootsOnly -upstreamNodes;
group root1 parts_low1;
カスタムした例
global proc skinWeightCopy_JointMeshGroup(){
//選択
select root parts_low;
//スキンウェイトモデルのスキンウェイトごとコピー
duplicate -returnRootsOnly -upstreamNodes;
//グループ化
group -name "group_dup" root1 parts_low1;
//元の名前にリネーム
rename "group_dup|root1" "root";
rename "group_dup|parts_low1" "parts_low";
}
skinWeightCopy_JointMeshGroup();
combine しながらエクスポート
global proc skinWeightCopy_JointMeshGroup(){
//選択
select "|root" "|parts_low";
//スキンウェイトモデルのスキンウェイトごとコピー
duplicate -returnRootsOnly -upstreamNodes;
//グループ化
group -name "group_dup" root1 parts_low1;
//元の名前にリネーム
rename "group_dup|root1" "root";
rename "group_dup|parts_low1" "parts_low";
}
global proc group_dup_parts_low_combine(){
string $selected[] = `ls -sl -long -absoluteName`;
//string $selectedStr = stringArrayToString($selected, ","); // ","を区切り文字として結合する
//print("選択したもの $selected= "+$selectedStr+"\n");
string $mesh[];
for ($sel in $selected) {
string $allMesh[] = `listRelatives -ni -pa -ad -typ "mesh" $sel`;
for ($am in $allMesh) {
string $trans[] = `listRelatives -ni -pa -p $am`;
$mesh[size($mesh)] = $trans[0];
}
}
$mesh = stringArrayRemoveDuplicates($mesh);
string $meshStr = stringArrayToString($mesh, ","); // ","を区切り文字として結合する
print(" メッシュのみ選別したもの $mesh= "+$meshStr+"\n");
select -r $mesh; // <メッシュのみ選択
// Combine実行
// Skeletalだった場合
string $combine[] = `polyUniteSkinned -ch 0 -muv 1`;
rename $combine[0] "MeshGP";
//よけておくグループ化
select "|root" "parts_low";
string $group_root;
$group_root =`group -world -name "group_root"`;
//MeshGPをparts_lowへ入れる
select "MeshGP";
string $group_parts_low;
$group_parts_low =`group -world -name "parts_low"`;
//worldへ移動
parent -world "group_dup|root";
//出力用選択
select "|root" "|parts_low";
// Export
// --------------------------------------------------------------------------
simple_model_common_Export(2, "D:/MOSADesign/WorkData/Avatar/008/001/PL_008_001_001/Game/SK_PL_008_001_001_Body.fbx", 0);
//おかたずけ partslow|MeshGP rootを削除
delete "|parts_low" "|root" "|group_dup";
//worldへ移動
parent -world "group_root|root";
//worldへ移動
parent -world "group_root|parts_low";
//group_root 削除
delete "|group_root";
}
// Export
//--------------------------------------------------------------------------
global proc simple_model_common_Export(int $type, string $expName, int $modelType) {
showHidden -a;
// if($type == 2) {
if ($type == 1) {
FBXExportSmoothMesh -v 0;
} else {
FBXExportSmoothMesh -v 1;
}
FBXExportAnimationOnly -v 0;
FBXExportInAscii -v 0 ;
FBXExportConvertUnitString cm;
FBXExportTriangulate -v 0;
FBXExportSmoothingGroups -v 1;
FBXExportConstraints -v 0;
FBXExport -f $expName -s;
}
参考URL
https://help.autodesk.com/cloudhelp/2025/ENU/Maya-Tech-Docs/Commands/duplicate.html
http://me.autodesk.jp/wam/maya/docs/Maya2010/Commands/duplicate.html
このノード状態がキレイなので「bindPose1が一つだけ」キープしながらモデリング編集すること。
Genesis9 やったこと
—————————————-ここからはモデリングとする。——————————————–
Das3D 4.22 のGenesis9を
Maya2022に持ってきて
duplicateでスキンバインド外し=複製して
meshGroupのグループに
・genesis9のまつ毛や口のレイヤーも入れる(skinCluster初めから無いので)
・Marvelous Designerの服レイヤーも入れる
・highheelレイヤーも入れる
highheelの高さにhipとmeshGroupをmoveする。(オプション)
↑高さはBluePrintで変更可能
—————————————-ここまではモデリングとする。——————————————–
新しい方の骨とmeshGroupでバインド
↑ちゃんとしたバインドオプションが重要
cmds.skinBind()引数なしじゃclusterがダメ
genesis9からcopySkinWeightした
モデル編集後ファイル (自分用リンク)」
jennie9_6_v12z_v00122_dupGen9_Kihon.zip
#jennie9_6_v12z_v00122_dupGen9_Kihon__ModelEnd_SkinBindSkinWeight.py
def startSelectionToNewSkinCluster():
selectList=cmds.ls(sl=1,long=1)
print("selectList= "+str(selectList))
# 全部必要だから引数にした
Genesis9 = selectList[0]
Genesis9_Mesh = selectList[1]
Genesis9s = selectList[2]
MeshGroup = selectList[3]
#------------------------------------------------------------------------
ModelEnd_SkinBind(Genesis9s,MeshGroup)
ModelEnd_SkinWeight(Genesis9,Genesis9_Mesh,Genesis9s,MeshGroup)
#------------------------------------------------------------------------
def ModelEnd_SkinBind(Genesis9s,MeshGroup):
cmds.select(Genesis9s,MeshGroup)
#MEL (Script found in: C:/Program Files/Autodesk/Maya2022/scripts/others/newSkinCluster.mel)
#newSkinCluster " -bindMethod 0 -normalizeWeights 1 -weightDistribution 0 -mi 3 -dr 4 -rui false -ihs , multipleBindPose, 0";
#Python でMEL実行
import maya.mel
maya.mel.eval('newSkinCluster " -bindMethod 0 -normalizeWeights 1 -weightDistribution 0 -mi 3 -dr 4 -rui false -ihs , multipleBindPose, 0";')
#Python NG 'maya.cmds' has no attribute 'newSkinCluster' #
#cmds.newSkinCluster(" -bindMethod 0 -normalizeWeights 1 -weightDistribution 0 -mi 3 -dr 4 -rui false -ihs , multipleBindPose, 0")
#import pymel.core as pm #OK
#pm.mel.newSkinCluster(" -bindMethod 0 -normalizeWeights 1 -weightDistribution 0 -mi 3 -dr 4 -rui false -ihs , multipleBindPose, 0")
def ModelEnd_SkinWeight(Genesis9,Genesis9_Mesh,Genesis9s,MeshGroup):
Genesis9_Low_skincluster = Get_SkinCluster(Genesis9_Mesh)
print("Genesis9_Low_skincluster= "+str(Genesis9_Low_skincluster))
MeshList = cmds.listRelatives(MeshGroup,shapes=0,fullPath=1)
print("MeshList= "+str(MeshList))
for closet_mesh in MeshList:
closet_skinCluster = Get_SkinCluster(closet_mesh)
print("closet_skinCluster= "+str(closet_skinCluster))
# 元のスキンクラスターを服のスキンクラスターへコピースキンウェイト
cmds.copySkinWeights(
sourceSkin = Genesis9_Low_skincluster,
destinationSkin = closet_skinCluster,
noMirror=True,
influenceAssociation="oneToOne",
surfaceAssociation="closestPoint"
)
def Get_SkinCluster(LowMeshTransformLong):
# トランスフォームのシェイプノードを取得
shapeList = cmds.listRelatives(LowMeshTransformLong, shapes=True, noIntermediate=True,fullPath=True)
#print("shapeList= "+str(shapeList))
# lowのヒストリーを取得し、スキンクラスターのみ取得
historyList = cmds.listHistory(shapeList[0], pruneDagObjects=True, interestLevel=2)
#print("historyList= "+str(historyList))
skinclusterList = cmds.ls(historyList, type="skinCluster")
#print("skinclusterList= "+str(skinclusterList))
skincluster = skinclusterList[0]
#print("skincluster= "+str(skincluster))
return skincluster
startSelectionToNewSkinCluster()
完成ファイル (自分用リンク)
jennie9_6_v12z_v00127_Mouse_SW_Take2OK_Kihon_UE532ExportEnd.zip