[Blender][3.3.1][Python] ボーンの選択時の注意点

■注意点1:bone.select = True だけでボーンは選択できない!

以下のようにboneをselectして複製しようとするとできないのです。

    bone.select = True
    bpy.ops.armature.duplicate()

 

実は、ボーンは以下のようにhead(ヘッド)と本体とtail(テール)の3つの構成からなっています。

selectで選択される部分は本体のみであり、複製する場合は、headとtailも選択しておく必要があります。

headとtailを選択するためには、それぞれselect_headとselect_tailというものがあるので、それをTrueにすればOK。

これでボーンが選択され複製ができるようになります。

    bone.select = True
    bone.select_head = True
    bone.select_tail = True

 

■注意点2:繋がったボーンはselect_headでは選択できない!

通常ボーンを作る際はEキーを押しながら伸ばして作ると思います。

その際、自動で親のボーンを設定したりしてくれてとても便利です。

ところが先ほどのコードで、真ん中のボーンをhead/本体/tailを選択して、いざ複製と実行すると、これまた複製できないのです。

上図がコード実行時の結果です。
よく見ていただければわかるのですが、headが選択されていません。
この結果から察するに、自分のheadと親ボーンのtailが同一の位置にある場合は、select_headでは選択できないようです。

 

よって、以下のようにすれば真ん中のボーンのhead/本体/tailが選択され、複製ができるようになります。

    bone.select = True
    bone.select_tail = True
    bone.parent.select_tail = True

 

まとめると以下の図のような関係になります。
実は繋がったボーンにはheadがないのではないかとも考えたのですが、headの位置は取得できるので存在はしているようです。 なお、繋がったボーンのheadをselect_headで選択できないのが仕様なのか、バグなのかは現時点では不明です。