広告
広告

Blender の python スクリプトの Tips

カテゴリ:blender

ベクトルに同じ値を設定する

o.scale = [1.0]*3

ベクトルを設定する

o.location = [1.0, 2.0, 3.0]

メッシュオブジェクトだけ取得する

mesh_objects = [o for o in bpy.data.objects if o.type=='MESH']

ラジアンと弧度法の変換

math をインポートする必要がある。

import math

弧度法へ

Blender は角度にラジアンを使っている。弧度法への変換には math.degrees を使う。

2 * pi * math.degrees

ラジアンへ

ラジアンへの変換には math.radians を使う。

90 * math.radians

mathutils を使う

mathutils を使うと、ベクトル・行列・クォータニオンなどが使えるようになる。mathutils を使うにはインポートが必要だ。

import mathutils

ベクトル

ベクトルは mathutils.Vector で作成する。渡すデータはタプルでもリストでもいい。

v = mathutils.Vector((0,1,2))

ベクトルはそのままオブジェクトのベクトルに代入できる。

o.location = v

ベクトルの便利なメソッド


正規化v.normalize()
内積v.dot(v2)
外積v.cross(v2)
ベクトル間の角度v.angle(v2)
反射v.reflect(v2)
長さv.length()
2乗長さv.length_squared()

そのほかのベクトルの機能

加減乗算もできる。

v2 = mathutils.Vector((5,6,7));
v + v2
v - v2
v * v2 # 内積をとる。外積と紛らわしいので v.dot(v2) がよい。

一部の要素だけ取り出す swizzle もできる。

v.xy = v2.yz
v.xyz = v2.xxx
v.xy = [1, 0] # swizzle への代入はタプルかリストを使う

行列

行列を使うと移動・回転・拡縮を1行で実行できる。また親子構造を持つオブジェクトの座標計算を行列の掛け算で実行できるようになる。加えて Blender では子オブジェクトのワールド座標等は行列から取得する必要がある。

行列の作成方法は使用頻度が低いので公式のドキュメントを参照。この項では行列からデータを取得する方法を紹介する。

to_* メソッドを使う方法

# これはローカル座標。親子付けされている場合、期待とは違う値の可能性がある。
loc_local = bpy.context.active_object.location 

m = bpy.context.active_object.matrix_world
loc = m.to_translation() # ワールド座標の取得
rot_euler = m.to_euler() # ワールドオイラー回転を取得
rot_qt = m.to_quaternion() # ワールドクォータニオン回転を取得
scale = m.to_scale() # ワールドスケールの取得

decompose() を使う方法

位置・回転・拡縮のデータがすべて必要な場合、decompose() は一度の呼び出しで取得できるので to_* メソッドよりも効率的だ。

loc, rot, scale = m.decompose()
print(loc)

関連記事

mathutils

Blender 記事の目次


広告
広告