【Blender 5.1】マトリックス系ノードの紹介:ジオメトリノード

blender
記事内に広告が含まれています。

Blenderのジオメトリノード内で使うマトリックス系のノードを紹介します。

以前マトリックス(行列)計算について簡単に解説する記事を書いたので、それをより便利に使うために、その他のマトリックス計算やトランスフォームに使えそうなノードを紹介していきます。

逆行列や行列式という行列特有の概念も出できます。ざっと解説しながらわかりやすくまとめてみようと思うので、マトリックス(行列)とかわけがわからんって方も、以前の記事と合わせて読んでみていただければと思います。

スポンサーリンク

マトリックス(Matrix)系ノードとは

今回紹介するノード群は、マトリックス(行列)を直接扱うためのノードです。

通常のTransformノードなどは「移動・回転・スケール」を個別に扱いますが、マトリックス系ノードではそれらをひとまとめの変換情報として扱います。

そのため、

  • 複雑な変換をまとめて処理できる
  • 変換の合成や分解ができる
  • ローカル・ワールドの扱いを自分で制御できる

といった特徴があります。

ただしその分、何をやっているか分かりにくい部分もあるので、用途ごとにざっくり把握していきます。

スポンサーリンク

Combine Matrix ノード

複数の数値から、1つのマトリックスを作るノードです。

使い方

各列(Column)、各行(Row)に値を入れて変換行列を作り、

  • 直接Transform Geometryノードにつなぐ(単一値のみ有効)
  • Transform PointノードなどにつなぎSet Positionノードで各ポイントを変形する(フィールド値が使える)

などの方法でジオメトリを変形・移動できます。

4×4の行列を自分で構築できるため、かなり自由度は高いですが、その分直接使う場面は少なめです。

基本的には、

  • 特殊な変換を自作したいとき
  • 数式ベースで制御したいとき

など、かなり踏み込んだ用途向けです。

変換行列の作り方、ルールについては以下の記事で解説しています。

直接行列を作って変換するメリットは、

  • 複雑な形を作れる
  • せん断変形ができる

などです。

通常は後述するCombine Transformノードの方を使うことが多いです。

スポンサーリンク

Combine Transform ノード

位置・回転・スケールからマトリックスを作るノードです。

  • Location(位置)
  • Rotation(回転)
  • Scale(スケール)

をまとめて1つのマトリックスに変換します。行列を使わず、直感的に操作できるので誰でも使いやすいと思います。

Transform PointノードなどにつなぎSet Positionノードで各ポイントを変形することもできます。(フィールド値が使える)

Transform GeometryのComponentsで移動・変形することとの違い

Transform GeometryのComponentsモードを使っても、位置・回転・スケールを入力して移動・変形ができます。このノードも内部では行列を使って計算していますが、行列を複数つなげることができません。

Combine Transformなどのマトリックスを出力するノードを使えば、変換行列を複数重ねてペアレントしたような動きを作れます。
Multiply Matricesノードの項で詳細に説明しますが、ローカル座標軸で動かすことができます。

スポンサーリンク

Separate Matrix ノード

マトリックスを分解して、個別の要素として取り出すノードです。

4×4の行列の各成分をそのまま取り出すので、

  • 数値として細かく調整したいとき
  • あるトランスフォーム変換をデバッグ的に中身を確認したいとき

に使います。

スポンサーリンク

Separate Transform ノード

マトリックスを、

  • 位置(Location)
  • 回転(Rotation)
  • スケール(Scale)

に分解するノードです。

Combine Transformの逆の役割です。

インスタンスやオブジェクトの変換を、数値としていじれる状態に戻すときに使います。

※ちなみにCombine Matrixノード→Separate Transformノード→Combine Transformノード→Separate Matrixノードにつないだとき、最初と最後の行列が全く一緒にならないこともあります。(変形結果は一緒だとしても変換方法が途中で変化してる可能性)

スポンサーリンク

Multiply Matrices ノード

マトリックス同士を掛け算するノードです。

ここでやっているのは単なる計算ではなく、変換の合成です。

例えば、

  • 回転のマトリックス
  • 移動のマトリックス

を掛け合わせることで、回転してから移動するなどの複合変換を作れます。(これは移動してから回転とは異なる結果になります。)

重要
マトリックスの掛け算は順序で結果が変わります。

ローカル変換

例えば回転を上ソケット、移動を下ソケットにつなぐと、結果として回転したあとの座標軸を基準に移動したように見えます。

このため、ローカル座標で変形・移動しているような挙動になります。(※実際の計算順序については後述)

Transform Geometryノードを重ねて使った場合は、それぞれの変換がジオメトリに順番に適用されるため、行列として合成されません。

そのため、回転のあとに移動しても、
「回転後の軸に沿って移動する」ような挙動にはならず、常にワールド軸を基準にした移動になります。

用途

ロボットアームやキャラクターの動きを制御する場合、身体・肩・腕といった各パーツは、それぞれの向きに沿って動かす必要があります。こうした動きはローカル変換で制御されます。

また、インスタンスをそれぞれ異なる方向に向けたうえで、その向きに沿って移動させるような処理にも応用できます。

このように、ローカル軸を基準にした変換は、リグ的な構造の制御や、シミュレーション的なアニメーションで便利に使えます。

計算の順番

乗算の計算の順序は私たちが考える直感に反しているかもしれません…最初はわかりづらいです。

上の図のように、Rを回転、Tを移動のマトリックスだとすると、Multiply Matricesノードにつないだとき、

  • 上ソケット…R
  • 下ソケット…T

とつなぐと、R×Tという乗算になりますが、Tの方が先にベクトルに作用するので、内部の計算では

(R⋅T)v=R(Tv)
移動した結果の点を回転する

だから軸方向が変わり、ローカル変換したような結果になります。

だけど、乗算ノードにつなぐときは、R×Tで、回転して座標軸変えてから移動した、ように感じます…。

スケールと回転の組み合わせでも同様に軸が変形し、順番によって結果が異なります。

回転とスケールの変換を順番を変えた場合が右図になります。

R×Sは、人間の感覚だと「座標軸を回転させてからローカル方向にスケールしている」ように感じることがあります。

しかし実際の行列計算では、右側の行列から順にベクトルに作用するため、

まずスケール(S)が適用され、その後に回転(R)が適用されます。

つまり「スケールされた点を回転している」だけです。

行列計算は、座標系を直接操作しているのではなく、あくまでベクトルの位置を変換している処理です。

人間はどうしても座標系の変化として考えてしまいがちですが、それだと順序が直感とズレて混乱しやすくなります。

そのため、慣れてきたら右にある行列ほど先にベクトルに作用すると覚えてしまうと理解しやすくなります。

自分もまだあんまり慣れてないですが…。

何か生物や機械を動かすときってスケールってあんまり使わないと思うので、移動と回転だけなら、直感的に回転してからローカル軸で移動する、みたいな覚え方でも大丈夫かもしれません(実際の内部の計算は逆ですが…)

スポンサーリンク

Invert Matrix (逆行列)ノード

マトリックスの逆行列を求めるノードです。

逆行列はざっくり言うと、その変換を打ち消すものです。

A1A=IA^{-1} A = I
AA1=I AA^{-1} = I
  • A1A^{-1}:逆行列(Aは元の行列)
  • II:単位行列(何も変換しない行列)

元の変換を打ち消して、何もしていない状態に戻す

右図のように、ある変換をしたあとにそれを戻そうとして今までの変換にマイナスをつけて行列同士を掛け算しても元の位置には戻りません。

Invert Matrixノードで変換行列の逆行列を作ってそれを作用させることで元の位置に戻ります。

出力

Invertible(可逆かどうか)出力
そのマトリックスが逆行列を持つかどうかを返します。
例えば、スケールが0になっている変換行列などは、逆行列を持たないため false になります。

マトリックスが可逆でない場合(逆行列が存在しない場合)、単位行列が返されます。つまり、何もしません。

用途

空間の行き来(ローカル⇄ワールド)を扱うときに使えます。

例えば、

  • あるオブジェクトのローカル空間に入りたい
  • ワールド変換を元に戻したい

といったときに使います。

例えば
スザンヌオブジェクトのトランスフォーム×変換行列×スザンヌオブジェクトのトランスフォームの逆行列を右図のように掛けると、

実際の計算は右の行列からベクトルに作用するため、

  • スザンヌオブジェクトのトランスフォームの逆行列×ベクトル
    ワールド → スザンヌローカル座標に入ります。
  • Combine Transform×①でローカル座標で移動します。
  • スザンヌオブジェクトのトランスフォーム×②でワールドに戻します。

Combine TransformでZ方向に5m移動しているのですが、ワールド空間にいながら、スザンヌオブジェクトの座標空間の方向に移動しています。

このように、ローカルで移動しても、最後にはワールド座標に戻す、というようなことができます。
この操作は座標系を一時的に借りて処理していると言えます。

スポンサーリンク

Matrix Determinant (行列式)ノード

マトリックスの行列式(determinant)を計算するノードです。

  • スケールの影響(拡大・縮小)
  • 反転(ミラー)が起きているか

などを判断する指標になります。

例えば右図の場合、X軸方向に2倍、Z軸方向に2倍のスケールをしているので、体積が4倍になっており、それが行列式の値として出ています。

行列式がマイナスの場合、空間が反転している(裏返っている)状態です。

※ちなみに4×4マトリックスだけど左上3×3部分だけを計算しているらしいです。(計算方法はただ複雑なだけなので知らなくていいと思います)

スポンサーリンク

Matrix SVD ノード

このノードは、入力されたマトリックスをSVD(特異値分解)によって分解します。

これはかなり専門的なノードで、

  • 回転・スケール・歪みを分離する
  • マトリックスの構造を解析する

といった用途に使われます。一般的な用途ではあまり使いませんが、変換をきれいに分解したい場合に役立ちます。(多分中級者くらいだと使わないからスルーしていいノードだと思う。)

Matrix SVDでは、マトリックス MM を次の3つに分けて表現します。

M=USV𝖳M = U S V^{\mathsf{T}}
  • UU:左側の変換
    回転や反転のみを含むマトリックスです。
  • SS:スケール(拡大・縮小)特異値
    スケール成分です。
    対角成分だけを持つシンプルな形で、各軸方向の拡大・縮小を表します。
  • VTV^T:右側の変換(Vの転置)
    こちらも回転や反転のみを含むマトリックスです。出力のVそのままではダメで、転置行列(回転だと逆行列となる)を掛けます

※転置行列は次のセクションで解説してます。

何をしているのか

この分解は、変換を

回転(+反転) → スケール → 回転(+反転)

という形に分解しているイメージです。どんな変換でも「回転+スケール+回転」に分解できるノードです。

上図はある行列をUSV(またはVの転置行列)の行列に分解し、また合成して同じ変形を再構成しています。

せん断の変形なのに、回転とスケールに分解できました。Sの行列でそれぞれの軸のスケールが綺麗に出ていることがわかります。このように、あらゆる変形を回転とスケールに綺麗にわけることができるノードです。(移動は除きます)

※上図のUとVの転置はある回転の合成の行列なので、普通の回転行列っぽくないですが、回転の変換行列です。(例えばY軸90°とZ軸約58°の合成)

注意点

  • 入力マトリックスのうち、3×3部分のみが使われます(4列目の平行移動は無視されます)
  • 入力は通常の変換行列でなくてもOKで、どんなマトリックスでも分解できます

用途

  • 歪みを分離したい
  • スケールだけ取り出したい
  • 回転をきれいに抽出したい

みたいなときに使う上級者向けのノード。この機能を使って、方向つきのバウンディングボックスを作成するチュートリアルを作っている方もいますが、正直難しくてよくわかんないですね。

スポンサーリンク

Transpose Matrix(転置)ノード

マトリックスの転置を取るノードです。

行と列を入れ替える操作で、数学的な処理や特定の計算で使われます。

転置:(M𝖳)ij=Mji\text{転置:}\quad (M^{\mathsf T})_{ij} = M_{ji}

行列Mの2行目、3列目の成分をM23と表すことがあります。転置をするとM23がM32になります。対角線上の成分は変化しません。

Geometry Nodesでは頻出ではありませんが、

  • 行列計算を自前で組むとき
  • 特定のアルゴリズムを実装するとき

に使うことがあります。

※回転行列の転置行列は逆回転になり、逆行列となります。
上のMatrix SVDノードで得られるVは直交行列であり、反射(反転)が含まれない場合は回転行列となるため、

V𝖳=V1V^{\mathsf T} = V^{-1}

が成り立ちます。

スポンサーリンク

Transform Point ノード

ポイント(位置)に対してマトリックス変換を適用するノードです。

Transform Geometryノードにマトリックス変換をつなげることとの違いは、

フィールド値が使えるので、各位置の座標や情報を使ったマトリックスで変換できます。

複雑な形を作りたいときはこれを使うと面白い形が作れます。

スポンサーリンク

Transform Direction ノード

方向ベクトルに対して変換を適用するノードです。

Transform Pointとの違いは、位置ではなく「向き」を扱う点です。

移動成分(Translation)の影響を受けないため、

  • 法線(Normal)の変換
  • 方向ベクトルの回転

などに使います。

位置の移動のマトリックスで変換しても位置は動きません。

スポンサーリンク

Project Point ノード

ポイントを別の空間・平面などに投影するノードです。遠近感(パース)をつけるようなイメージ。

スポンサーリンク

おわりに

マトリックスは最初はとっつきにくいですが、やっていることは変換の合成順番の制御です。

まだ自分も慣れていないので、また良い応用方法などを探してみたいと思います。

追記:マトリクスノードをつないで親子階層を再現する方法がわかったので新しい記事を書きました。以下関連記事のジオメトリノードで作るマトリクスロボットアームをご覧ください。

スポンサーリンク

関連記事

  • ジオメトリノードのためのマトリックス入門|位置・回転・スケールを行列で理解する
    ジオメトリノードでマトリックスを使ったトランスフォーム変換をするために簡単に行列計算などを解説しています。
  • ジオメトリノードで作るマトリクスロボットアーム:Multiply Matricesで親子関係を再現する方法
    マトリックス変換をつなげて親子階層を作って、ジオメトリノードでリグっぽい仕組みを再現する方法を解説しています。
  • 回転系ノードについて解説
    インスタンスの回転、ベクトル回転、回転の補間やクォータニオンなど、回転系ノードの使い方を網羅。
  • カーブの接線・法線・従法線を解説:Tiltのトラブルを解決する
    カーブの接線・法線・従法線とは何かを解説し、Set Curve Normalノードを使ってねじれを修正する方法を説明

ジオメトリノード記事のガイドです。ジオメトリノード関連の記事をまとめています。

コメント