1 / 4 位置と方向のベクトル
二点の差から方向を求め、長さをそろえる理由を理解します。
二つの位置から向きを求める
位置A=(1,0,0)、位置B=(1,2,0)なら、AからBへの方向はB−A=(0,2,0)です。方向の長さは2で、正規化すると(0,1,0)になります。同じ向きで距離だけ異なる場合を比べるための操作です。
位置と方向の違い
位置は、空間内のどこにあるかを表します。
方向は、どちらへ向いているかを表します。
速度は、方向と速さを同時に持つ値です。
これらはすべて Vector3 で表せますが、同じ Vector3 でも何を表しているかによって計算の意味が変わってきます。
シェーダーでは「このベクトルは位置なのか方向なのか」を意識して使い分ける必要があります。
長さを1にそろえる正規化
ベクトルには大きさの情報も含まれていますが、 向きだけを使いたい場合があります。
例えば、視線の方向やライトの方向などは、通常向きだけが重要で、大きさは必要ありません。
ベクトルの向きだけを使いたい場合は、 ベクトルの大きさ(長さ)を得てからベクトル全体をその長さで割ります。
これで大きさが 1 になり、向きだけを表すベクトルが得られます。
この操作を正規化、Normalize と呼びます。
ベクトルの長さと正規化の式
2次元ベクトル v = (x, y) の長さは $$|v| = \sqrt{x^2 + y^2}$$。
3次元ベクトル v = (x, y, z) の長さは $$|v| = \sqrt{x^2 + y^2 + z^2}$$。
ベクトルを正規化する式は $$\text{Normalize}(v) = \frac{v}{|v|}$$。
// C# での正規化の例
Vector3 v = new Vector3(x, y, z);
// ベクトルの長さを計算
float length =
Mathf.Sqrt(
v.x * v.x +
v.y * v.y +
v.z * v.z);
// ベクトルを長さで割って正規化
Vector3 normalized = v / length;
// Unity には正規化のメソッドもあります
normalized = Vector3.Normalize(v);条件を変えた確認
Bだけを(1,4,0)へ変えた場合、差のベクトルと正規化後のベクトルを求めてください。
予測と結果の照合
差は(0,4,0)、正規化後は(0,1,0)です。向きは同じで長さだけが変わりました。長さ0のベクトルには方向を定義できないため、正規化する入力には使いません。
次のステップでは、Meshが持つ面の向きを使います。
- 位置の差から方向を求め、正規化が保つものを説明できる。