スキン ウェイト値を調べる


スキンモディファイアを使用した際に、
ウェイトがどうなっているかを調べる。

これは、いろんなスキニング補助ツールでやっていることなので
わざわざ、やる必要はないんだけど。
前に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以上のウェイト値が見つからなかったら回収しておく。
最後に、回収した頂点を選択する。

もっと、上手に組める方もいらっしゃると思う。
まぁ、自己流でスクリプトを勉強しているのでご勘弁を。

これを改造して、たとえば未使用ボーンを切り離したり。
自作のウェイとテーブルを作成したり、色々やりようはあると思う。

今度は、リスト化されたボーンを、まったく別のボーンに入れ替えるのをやってみよう
できるかな・・・

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください