ゲーム作りが大好きな人のブログ

ゲームを作るのが大好きな人のブログ。UE4とBlender、MAYA(LT)、3DCoatを使用しています!

【Blender】【Python】ポーズボーンの行列(マトリックス)をWorld空間に変換する

Blenderのバージョンは2.82で検証しています

前回の記事でポーズボーンの行列(マトリックス)を扱いました。
toofu0.hatenablog.com
しかし3Dで行列を扱っていると
「これはどこの空間から見た行列?」と思う事も少なくないはずです。

今回は
 ・ポーズボーンが持つ行列はどの空間か
 ・ポーズボーンが持つ行列を他空間へ変換するにはどうしたらよいか
を紹介します。


※ 筆者は数学が苦手な部類でもあるので間違いがあるかもしれません
※ 解析した結果「おそらくこうだろう」と断定している箇所もあります。
  間違えてたらすみません。

 
 

ポーズボーンが持つ行列は何空間?

公式APIリファレンスにはオブジェクト空間と書かれています。
docs.blender.org
オブジェクト空間ってわかりづらいんですが
単純にローカル空間であってると思います。
※ローカル空間が分かりづらい場合は『ローカル空間』でググるとよいかも
 
 

ポーズボーンが持つ行列をワールド空間へ変換する方法

※あらかじめポーズボーンをboneという変数名で定義した事を前提にしています

import bpy
import mathutils

# 省略用変数定義
ob = bpy.context.object

# ローカル空間からワールド空間へ変換
matWorld = ob.convert_space(pose_bone=bone, matrix=bone.matrix, from_space='POSE',to_space='WORLD')

めっちゃ簡単ですね。
逆にワールドからローカル空間に戻す事も可能です。

# ワールド空間からローカル空間へ変換
ob.convert_space(pose_bone=bone, matrix=matWorld, from_space='WORLD',to_space='POSE')

 
 

まとめ

この変換方法が分かると色々な事ができるようになります。
例えば親ボーンは動かしたいけど子ボーンは動かしたくないって時がありますよね。
そういった時は

  1. 子ボーンのワールド変換した行列を覚えておく
  2. 親ボーン移動
  3. 子ボーンに保存したワールド変換行列をローカル空間へ変換し適用

これで全く同じ状態に戻す事ができます。
こういった機能をスクリプト化しておくと救われる事が多いので
是非色々と試してみると楽しいかと思いますよ。