…いや、なんでそんなもん作る必要があったのよ?って話なんですが。
以前、左右対称化をしたモデルを再度編集用の片面モデルに戻すアドオンを作りまして、良し、これで全身モデルを見ながら編集作業ができるぞと思ったわけですよ。
で、以前作った、横隔膜の動作を試したのですが…
腹筋半壊。
腹筋操作ボーンは体の中心に作っており、数値上も X の値が0.000になっています。
予定では、この操作ボーンを動作させることで、左右の腹筋が動く予定だったのですが。
…調べてみたら、プログラミングの実数型にありがちな「微妙に数値があっていない」現象により、体の中心に置いたはずの腹筋操作ボーンが微妙にずれて、左右に2本作られた為、左側の腹筋ボーンのみの動作になったようです。
微妙にずれている為、標準のオートネームでは末尾にL/Rが付いてしまう
この現象の一般的な対処法は、3Dカーソルを中心付近に動かして、グリットに吸着させて X=0 の位置に固定し、エディットモードで中心付近のボーンを選択して、3Dカーソルに対してX軸スケール→0と選択する事ですが…ジンバルが起こるらしく見事にモデルが壊れてしまいました。
そもそも、こんな面倒な操作は毎回やっていられないので、アドオンを作成。
コード
import bpy
if bpy.context.mode == 'EDIT_ARMATURE':
for obj in bpy.context.selected_objects:
# Use armature only
if obj.type != 'ARMATURE':
continue
for bone in obj.data.edit_bones:
if bone.select == False:
continue
if (bone.name[-2:]=='.R')or(bone.name[-2:]=='.L'):
bone.name = bone.name[:-2]
if (bone.head.x<0.0001)and(bone.tail.x<0.0001)and(bone.head.x>-0.0001)and(bone.tail.x>-0.0001):
bone.head.x=0.0
bone.tail.x=0.0
continue
if (bone.head.x>=0.0)and(bone.tail.x>0.0):
bone.name = bone.name+'.L'
continue
if (bone.head.x<=0.0)and(bone.tail.x<0.0):
bone.name = bone.name+'.R'
※一部表示が崩れるので文字を小さくしています
ベースになっているのは以前作ったボーンロール値を0にするアドオンです。
操作方法は編集モードでリネームするボーンを選んで実行。
動作は
1.選択されていないボーンを弾く
2.ボーン名の末尾に「.L」「.R」とついていた場合は外す(〜.L.L等、2重にリネームされないようにする為)
3.ボーンのヘッド/テールのX座標が +-0.0001 の範囲に入る場合はリネームせず、 x の値を 0.0 で改めてセットする
4.ボーンのX座標を確認してリネーム
という動作。
で、これで再度やってみると…
できた。
念の為、お腹を傾けて同じ動作をさせてみる。
…まあ、出来はしたんだけど、お腹の形状はいろいろと難ありなので修正は必要かもしれないですね。
0 件のコメント:
コメントを投稿