夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderPythonで行列を使用して頂点座標を計算してオブジェクトを回転させる

本日はBlender Python枠です。

今回はグラフィックの勉強の一環として行列を使用してオブジェクトを回転させます。

〇3DCGの頂点と行列

3DCGは3D空間(XYZ座標)に配置された頂点とそれを結ぶ辺によって構成されるメッシュ(面)で構成されています。

頂点はXYZのそれぞれの成分の座標を持っています。

オブジェクトを移動させる場合は単に移動軸に対してそれぞれの成分を足し合わせればよいですが、回転を行う場合は計算が複雑になります。

回転が絡む場合は回転の軸に対して処理を行う必要があり、一般的に行列計算が使用されています。

また3Dモデルの親子関係等を用いた子トランスフォームなどにも用いられており、3DCGと行列は切り離せないものとなっています。

Blenderの行列API

 BlenderではMatrixを使用することで行列を簡単に使用できます。

 今回は例として回転させたいためMatrix.Rotation(回転角、行列のサイズ、軸)を使用します。

具体的なコードは次のようになります。

import bpy
import math
from mathutils import Matrix

# アクティブなオブジェクトを取得
obj = bpy.context.active_object

# 回転行列の生成(Z軸周りに90度回転)
rotation_matrix = Matrix.Rotation(math.radians(90), 4, 'Z')

# 選択したオブジェクトの各頂点に回転行列を適用
for vertex in obj.data.vertices:
    # オブジェクトの原点に頂点を移動
    vertex_co = rotation_matrix @ vertex.co

    # 回転後の座標をセット
    vertex.co = vertex_co

# オブジェクトの更新
obj.data.update()

# ビューポートのリフレッシュ
bpy.context.view_layer.update()

これを行うことでオブジェクトの原点を軸として実行する度にオブジェクトが回転します。

 見た目上はRキー+Zキー+90を入力し回転させた場合と同じになります。

 本日のまとめですがBlenderMatrixを使用することで簡単に行列を行うことができました。

 本日は以上です。