MRが楽しい

MRやVRについて学習したことを書き残す

Blender 2.8のPython APIドキュメントを少しずつ読み解く 落とし穴 その5

本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。
前回記事の続きです。
bluebirdofoz.hatenablog.com

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org

今日は「落とし穴」の「EditBones、PoseBones、骨」です。
f:id:bluebirdofoz:20200115093914j:plain

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))

f:id:bluebirdofoz:20200115093943j:plain

以下は編集モード以外では空になります。

>>> mybones = bpy.context.selected_editable_bones

f:id:bluebirdofoz:20200115093954j:plain

以下は編集モードでのみ編集ボーンを返します。

>>> bpy.context.active_bone

f:id:bluebirdofoz:20200115094005j:plain

ボーン(オブジェクトモード)

bpy.context.object.data.bones にはボーンが含まれています。
これらはオブジェクトモードで動作し、さまざまなプロパティを変更できます。
ヘッドとテールのプロパティは読み取り専用です。

オブジェクトモードまたはポーズモードでの bpy.types.Bone の使用例を示します。

編集モード外でボーンを返します。(これは編集ボーンではありません)

>>> bpy.context.active_bone

f:id:bluebirdofoz:20200115094015j:plain

以下のコマンドも動作します。
Blenderの場合、設定はどのモードでも編集できるためです。

>>> bpy.context.object.data.bones["Bone"].use_deform = True

f:id:bluebirdofoz:20200115094023j:plain

以下はアクセス可能ですが読み取り専用です。

>>> tail = bpy.context.object.data.bones["Bone"].tail

f:id:bluebirdofoz:20200115094032j:plain

ポーズボーン

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

f:id:bluebirdofoz:20200115094042j:plain

ポーズはオブジェクトデータではなく object からアクセスされることに注意してください。
これが、blenderが異なるポーズで同じアーマチュアを共有する2つ以上のオブジェクトを持つことができる理由です。

厳密に言えば、PoseBone はボーンではなく、単にアーマチュアの状態です。
bpy.types.Object ではなく bpy.types.Armature に保存されます。
実際のボーンはポーズボーン(bpy.types.PoseBone.bone)からアクセス可能です。

アーマチュアモードの切り替え

アーマチュアを扱うスクリプトを作成する際、モードを切り替える必要がある場合があります。
編集モードを切り替えるとき、編集ボーンまたはそのヘッド/テールベクトルへの参照を保持しないように注意してください。
これらに更にアクセスすると Blender がクラッシュします。
重要なのは異なるモードで動作するコードのセクションを明確に分離することです。

これは主に編集モードでの問題です。
ポーズデータは、ポーズモードでなくても操作できるためです。
ただし、オペレータアクセスの場合はポーズモードに切り替える必要があります。

bluebirdofoz.hatenablog.com