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