本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。
前回記事の続きです。
bluebirdofoz.hatenablog.com
Blender 2.8 Python API Documentation
以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org
今日は「落とし穴」の「EditBones、PoseBones、骨」です。
EditBones、PoseBones、骨
Blenderのアーマチュアボーンには3つの異なるデータ構造があります。
それらのいずれかを介してボーンにアクセスしている場合、必要なプロパティにアクセスできない場合があります。
次の例でbpy.context.objectは、アーマチュアオブジェクトを想定しています。
骨の編集
bpy.context.object.data.edit_bones には編集ボーンが含まれています。
それらにアクセスするには、最初にアーマチュアを編集モードに設定する必要があります。
(編集ボーンはオブジェクトモードまたはポーズモードには存在しません)
これらを使用して以下の操作を行います。
・新しいボーンを作成する
・ヘッド/テールまたはロールを設定する
・親子関係を他のボーンに変更する、
アーマチュア編集モードでの bpy.types.EditBone の使用例を示します。
以下のコマンドは編集モードでのみ可能です。
>>> bpy.context.object.data.edit_bones["Bone"].head = Vector((1.0, 2.0, 3.0))
以下は編集モード以外では空になります。
>>> mybones = bpy.context.selected_editable_bones
以下は編集モードでのみ編集ボーンを返します。
>>> bpy.context.active_bone
ボーン(オブジェクトモード)
bpy.context.object.data.bones にはボーンが含まれています。
これらはオブジェクトモードで動作し、さまざまなプロパティを変更できます。
ヘッドとテールのプロパティは読み取り専用です。
オブジェクトモードまたはポーズモードでの bpy.types.Bone の使用例を示します。
編集モード外でボーンを返します。(これは編集ボーンではありません)
>>> bpy.context.active_bone
以下のコマンドも動作します。
Blenderの場合、設定はどのモードでも編集できるためです。
>>> bpy.context.object.data.bones["Bone"].use_deform = True
以下はアクセス可能ですが読み取り専用です。
>>> tail = bpy.context.object.data.bones["Bone"].tail
ポーズボーン
bpy.context.object.pose.bones にはポーズボーンが含まれています。
これは、アニメーションデータが存在する場所です。
アニメーション化可能な変換が、コンストレイントやik設定と同様に、ポーズボーンに適用されます。
オブジェクトモードまたはポーズモードでの bpy.types.PoseBone の使用例を示します。
# Gets the name of the first constraint (if it exists) bpy.context.object.pose.bones["Bone"].constraints[0].name # Gets the last selected pose bone (pose mode only) bpy.context.active_pose_bone
ポーズはオブジェクトデータではなく object からアクセスされることに注意してください。
これが、blenderが異なるポーズで同じアーマチュアを共有する2つ以上のオブジェクトを持つことができる理由です。
厳密に言えば、PoseBone はボーンではなく、単にアーマチュアの状態です。
bpy.types.Object ではなく bpy.types.Armature に保存されます。
実際のボーンはポーズボーン(bpy.types.PoseBone.bone)からアクセス可能です。