スキンモディファイアを使用した際に、
ウェイトがどうなっているかを調べる。
これは、いろんなスキニング補助ツールでやっていることなので
わざわざ、やる必要はないんだけど。
前にBioSkinを改造していたので、思い出しがてらに少し残そう。
したのごちゃごちゃしたものは、どのボーンにもウェイト値が割り振られていない
0ウェイトの頂点を選択する一連のもの。
この方法を使えば、未使用のボーンを削除したり、0ウェイトを削除できる。
調べ上げる際の skinops.getVertexWeight は、
たとえ、ウェイトが0であっても影響しているとみなしているので、
すべての影響ボーン数回はチェックしないといけない。
なので、頂点数の上昇とともに、処理速度も落ちる・・。
BioSkinはここが弱点かと思われる。
–修正パネルにしないとエラーが出る
max modify mode
Local selectVertsArray = #{}, checkResult = false, myObj = selection[1], vertsCount = 0;
–スキンもぢファイアはあるか
if (myObj.modifiers[“Skin”] != undefined) then
(
vertsCount = selection[1].verts.count;
if (skinOps.GetNumberBones myObj.skin) != 0 then
(
–1頂点ごとに調べる
for i = 1 to vertsCount do
(
checkResult = false;
–頂点のウェイトの影響数分
for k = 1 to (skinops.GetVertexWeightCount myObj.skin i) do
(
–ウェイトはいくつか?0以上があればヨシ
if (skinops.getVertexWeight myObj.skin i k > 0) do checkResult = true;
);–for end
–ウェイトが空の頂点を回収
if not checkResult then append selectVertsArray i;
print selectVertsArray;
);–for end
–選択
skinOps.SelectVertices myObj.skin selectVertsArray;
)else(
messageBox(“ボーンがありません”)title:”メッセージ”;
);–if end
)else(
messageBox(“スキンモヂファイアがありません”)title:”メッセージ”;
);–if end
流れは、まずモディファイアが無かった場合や、ボーンが無かった場合の対策。
それから、1頂点ずつ、影響しているボーンに対するウェイトを調べる。
調べ終わっても、0以上のウェイト値が見つからなかったら回収しておく。
最後に、回収した頂点を選択する。
もっと、上手に組める方もいらっしゃると思う。
まぁ、自己流でスクリプトを勉強しているのでご勘弁を。
これを改造して、たとえば未使用ボーンを切り離したり。
自作のウェイとテーブルを作成したり、色々やりようはあると思う。
今度は、リスト化されたボーンを、まったく別のボーンに入れ替えるのをやってみよう
できるかな・・・