このチャプターでは、オブジェクトの座標を取得する方法を紹介します。
利用例 : オブジェクトに追従する座標空間
ワールド座標からオブジェクトの座標を減算することで、オブジェクトに追従する座標空間を作ることができます。
以下は座標空間のXYZ成分をRGBカラーとして可視化したものになります。
オブジェクトに追従し、オブジェクトの回転やスケールの影響を受けない座標空間を作ることができます。
利用例 : 液体シェーダー
モデルの回転やスケールの影響を受けない液体表現を作ることができます。
モデルを動かしても液体が破綻しません。
オブジェクトの座標取得
Transformation Matrix (Model)
から列成分 M3
を見ると、オブジェクトの座標が取れます。
World Space からオブジェクト座標を減算することで、 オブジェクトに追従する座標空間を作ることができます。
オブジェクトの座標が取れる理由について (数式)
平行移動成分が取れる理由について
Transformation Matrix (Model)
を使うと、モデル行列を取り出すことができます。
モデル行列は オブジェクト空間(モデル空間) -> ワールド空間
という座標変換を行う際に使用される行列です。
モデル行列には、オブジェクトのスケール・回転・平行移動に関する情報が含まれています。
関連 : 🍇 ShaderGraphの座標空間
モデル行列
3Dモデルがワールド空間に変換される際、モデル行列が使用されます。
モデル行列は以下のような4x4行列になっています。
m00m10m20m30m01m11m21m31m02m12m22m32m03m13m23m33
オブジェクトの座標が (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