MRが楽しい

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

Blender 2.8のPython APIドキュメントを少しずつ読み解く クイックスタートその5

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

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試しつつ記事を進めていきます。
docs.blender.org
docs.blender.org
今日は「クイックスタート」のタイプに関してです。
f:id:bluebirdofoz:20190909093940j:plain

タイプ

Blender は多くの Python タイプを定義しますが、Python ネイティブタイプも使用します。
BlenderPython API は3つのカテゴリに分割できます。

ネイティブ型

数値または文字列をカスタム型として返すのは扱いにくいので、これらは通常の Python 型としてアクセスします。

Blender float/int/boolean -> float/int/boolean
Blender 列挙子 -> string

>>> C.object.rotation_mode = 'AXIS_ANGLE'

f:id:bluebirdofoz:20190909093954j:plain
Blender列挙子(複数)-> set of strings

# setting multiple camera overlay guides
# 複数のカメラオーバーレイガイドの設定
bpy.context.scene.camera.data.show_guide = {'GOLDEN', 'CENTER'}

# passing as an operator argument for report types
# レポートタイプの演算子引数として渡す
self.report({'WARNING', 'INFO'}, "Some message!")

(Blender2.8ではオーバレイ操作が overlay タイプの配下のため、上記操作は利用不可)

内部型

bpy.types.bpy_struct は Blenderのデータブロックとコレクションに使用されます.。
例えば、独自の属性 collections / mehes / bones / scenes… などを含むデータが対象です。

Blender データをラップする2つの主なタイプがあります。
1つはデータブロック(内部的な bpy_struct)用で、もう1つはプロパティ用です。

>>> bpy.context.object
bpy.data.objects['Cube']
>>> C.scene.objects
bpy.data.scenes['Scene'].objects

f:id:bluebirdofoz:20190909094012j:plain

これらのタイプは Blender のデータを参照するため、変更するとすぐに表示されることに注意してください。

Mathutilsのタイプ

mathutils からアクセス可能なベクタークォータニオンオイラーマトリックスおよび色の種類に使用します。
以下の一部の属性は様々な方法で、使用および操作できる特別な数学タイプとしてアクセスできます
・bpy.types.Object.location
・bpy.types.PoseBone.rotation_euler
・bpy.types.Scene.cursor_location

行列の例、ベクトル乗算:

bpy.context.object.matrix_world * bpy.context.object.data.verts[0].co.x

f:id:bluebirdofoz:20190909094024j:plain

mathutils タイプは Blender の内部データへの参照を保持するため、変更を反映することができます。
例:

# modifies the Z axis in place.
# Z軸を所定の位置に変更します。
bpy.context.object.location.z += 2.0

f:id:bluebirdofoz:20190909094034j:plain

# location variable holds a reference to the object too.
# ロケーション変数は、オブジェクトへの参照も保持します。
location = bpy.context.object.location
location *= 2.0

f:id:bluebirdofoz:20190909094044j:plain

# Copying the value drops the reference so the value can be passed to
# functions and modified without unwanted side effects.
# 値をコピーすると参照が削除されるため、値を関数に渡して影響しないように変更できます。
location = bpy.context.object.location.copy()
location *= 2.0

f:id:bluebirdofoz:20190909094054j:plain

アニメーション

Python を介してキーフレームを追加するには2つの方法があります。

1つ目はキープロパティを直接使用する方法です。
これは、ユーザーとしてボタンからキーフレームを挿入することに似ています。
2つ目は曲線とキーフレームデータを手動で作成してから、プロパティへのパスを設定する方法です。

以下に両方の方法の例を示します。
どちらの例もアクティブなオブジェクトのZ軸にキーフレームを挿入します。

簡単な例:

obj = bpy.context.object
obj.location[2] = 0.0
obj.keyframe_insert(data_path="location", frame=10.0, index=2)
obj.location[2] = 1.0
obj.keyframe_insert(data_path="location", frame=20.0, index=2)

f:id:bluebirdofoz:20190909094108j:plain

低レベル関数の使用:

obj = bpy.context.object
obj.animation_data_create()
obj.animation_data.action = bpy.data.actions.new(name="MyAction")
fcu_z = obj.animation_data.action.fcurves.new(data_path="location", index=2)
fcu_z.keyframe_points.add(2)
fcu_z.keyframe_points[0].co = 10.0, 0.0
fcu_z.keyframe_points[1].co = 20.0, 1.0

f:id:bluebirdofoz:20190909094118j:plain