Chapter 45無料公開

🍇 Matrixからオブジェクトの座標を取得する

かもそば
かもそば
2021.08.29に更新

このチャプターでは、オブジェクトの座標を取得する方法を紹介します。

利用例 : オブジェクトに追従する座標空間

ワールド座標からオブジェクトの座標を減算することで、オブジェクトに追従する座標空間を作ることができます。

以下は座標空間のXYZ成分をRGBカラーとして可視化したものになります。

オブジェクトに追従し、オブジェクトの回転やスケールの影響を受けない座標空間を作ることができます。

利用例 : 液体シェーダー

モデルの回転やスケールの影響を受けない液体表現を作ることができます。
モデルを動かしても液体が破綻しません。

オブジェクトの座標取得

Transformation Matrix (Model) から列成分 M3 を見ると、オブジェクトの座標が取れます。 

World Space からオブジェクト座標を減算することで、 オブジェクトに追従する座標空間を作ることができます。

オブジェクトの座標が取れる理由について (数式)

平行移動成分が取れる理由について

Transformation Matrix (Model)を使うと、モデル行列を取り出すことができます。

モデル行列は オブジェクト空間(モデル空間) -> ワールド空間 という座標変換を行う際に使用される行列です。
モデル行列には、オブジェクトのスケール・回転・平行移動に関する情報が含まれています。

関連 : 🍇 ShaderGraphの座標空間

モデル行列

3Dモデルがワールド空間に変換される際、モデル行列が使用されます。
モデル行列は以下のような4x4行列になっています。

(m00m01m02m03m10m11m12m13m20m21m22m23m30m31m32m33) \begin{pmatrix} m_{00} & m_{01} & m_{02} & \color{red}m_{03} \\ m_{10} & m_{11} & m_{12} & \color{red}m_{13} \\ m_{20} & m_{21} & m_{22} & \color{red}m_{23} \\ m_{30} & m_{31} & m_{32} & m_{33} \\ \end{pmatrix}

オブジェクトの座標が (1, 2, 3) だった場合、\color{red}m_{03} \color{black} = 1, \color{red}m_{13} \color{black} = 2, \color{red}m_{23} \color{black} = 3 となります。

モデル行列を使った座標変換

3Dモデルの頂点座標 (x, y, z) はモデル行列によって以下のように変換されます。

\begin{pmatrix} m_{00} & m_{01} & m_{02} & \color{red}m_{03} \\ m_{10} & m_{11} & m_{12} & \color{red}m_{13} \\ m_{20} & m_{21} & m_{22} & \color{red}m_{23} \\ m_{30} & m_{31} & m_{32} & \color{red}m_{33} \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \\ \end{pmatrix} = \begin{pmatrix} m_{00} \cdot x + m_{01} \cdot y + m_{02} \cdot z + \color{red} m_{03} \color{black} \\ m_{10} \cdot x + m_{11} \cdot y + m_{12} \cdot z + \color{red} m_{13} \color{black} \\ m_{20} \cdot x + m_{21} \cdot y + m_{22} \cdot z + \color{red} m_{23} \color{black} \\ m_{30} \cdot x + m_{31} \cdot y + m_{32} \cdot z + \color{red} m_{33} \color{black} \\ \end{pmatrix}


変換後の頂点座標を(x', y', z') と置いたとき、以下のようになります。

\begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} m_{00} \cdot x + m_{01} \cdot y + m_{02} \cdot z + \color{red} m_{03} \color{black} \\ m_{10} \cdot x + m_{11} \cdot y + m_{12} \cdot z + \color{red} m_{13} \color{black} \\ m_{20} \cdot x + m_{21} \cdot y + m_{22} \cdot z + \color{red} m_{23} \color{black} \\ \end{pmatrix}

上記の式の赤字は平行移動成分(オブジェクトの座標)になっています。

平行移動成分を取り出す

モデル行列とMatrix Split (Column)の対応は以下のようになっています。
M3列にはオブジェクトの座標が含まれます。

液体表現Shader

冒頭で紹介した、液体表現のシェーダーは以下のようになります。
Sineを使って波を作っています。

液体表現サンプル

液体表現のサンプルデータはGitHubにて公開中です
https://github.com/rngtm/ShaderGraphCookBookSample

Assets/_SampleData/ShaderSamples/13_Liquid

他の方法との比較

方法 回転・スケールの影響 オブジェクトへの追従
今回の方法 なし
あり
Position(World)ノードのみ なし
なし
Position(Object)ノードのみ あり
あり

関連 : 🍇 ShaderGraphの座標空間

今回の方法

今回の方法は、以下のような座標空間を作ることができます。

  • オブジェクトに追従する
  • オブジェクトのScaleやRotationの影響を受けない



World Space

Position(Space = World)をそのまま使った場合

  • オブジェクトに追従しない
  • オブジェクトの回転やスケールの影響を受けない


Object Space

Position(Space = Object)を使った場合

  • オブジェクトに追従する
  • オブジェクトの回転やスケールの影響を受ける


備考

Transformation Matrix ノード (Model)は、内部的には UNITY_MATRIX_M というモデル行列を出力しています。
https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Transformation-Matrix-Node.html