Skip to content
第07回 ベクトル演算とライティング

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|}$$。

csharp
// 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が持つ面の向きを使います。

チェックリスト
  • 位置の差から方向を求め、正規化が保つものを説明できる。