単位ベクトル(正規化)

記号の意味
ベクトル- 矢印付きの文字
長さ- ベクトルの大きさ
単位ベクトル- 長さ1のベクトル
内積- 2つのベクトルから数値を計算
シータ- 角度を表すギリシャ文字
余弦- 角度から比率を求める関数

概要

ベクトルの長さを1にして方向情報だけを取り出すことで、どの方向でも一定速度で移動するキャラクター制御を実現する方法を学びます。

単位ベクトルとは

単位ベクトル(unit vector)は、長さが1のベクトルのことです。方向の情報だけを持ち、大きさは常に1です。

任意のベクトルを単位ベクトルに変換する操作を正規化(normalization)と呼びます。各成分を元の長さで割ることで、方向はそのまま、長さだけを1にします。

キャラクターの移動を実装する際、「斜め移動が速くなる」「方向はそのまま、速度だけ変えたい」といった問題に遭遇します。単位ベクトルを使うと、これらの問題を解決できます。

身近な例で考えてみよう
  • コンパス: どんな方向を指していても、針の長さは常に同じ
  • 方位磁石: 「北の方向」だけを示す(距離は関係ない)
  • 単位: 「1メートル」「1秒」のような基準となる長さ

デモ: 単位ベクトルがないと斜め移動が速くなる

単位ベクトルを使わないと、斜め移動が真横移動より速くなってしまいます。デモで確認してみましょう!

単位ベクトルの作り方(正規化)

任意のベクトルを単位ベクトルに変換するには、各成分を元の長さで割ります。この操作を正規化と呼びます。

数式での表現

基本の式:

v^=vv\hat{v} = \frac{\vec{v}}{\|\vec{v}\|}

これを成分ごとに書くと:

v^=(xv,yv)\hat{v} = \left(\frac{x}{\|\vec{v}\|}, \frac{y}{\|\vec{v}\|}\right)

計算例:

ベクトル (3,4)(3, 4) を正規化すると:

v^=(3,4)32+42=(3,4)5=(35,45)=(0.6,0.8)\hat{v} = \frac{(3, 4)}{\sqrt{3^2 + 4^2}} = \frac{(3, 4)}{5} = \left(\frac{3}{5}, \frac{4}{5}\right) = (0.6, 0.8)

単位ベクトルになったか確認

v^=0.62+0.82=0.36+0.64=1=1\|\hat{v}\| = \sqrt{0.6^2 + 0.8^2} = \sqrt{0.36 + 0.64} = \sqrt{1} = 1

→ 長さが1になった!これが単位ベクトルです。

パラメータの意味
  • v=(x,y)\vec{v} = (x, y): 元のベクトル
  • v\|\vec{v}\|: ベクトルの長さ(x2+y2\sqrt{x^2 + y^2}
  • v^\hat{v}: 単位ベクトル
    • 長さが1(単位長さ)のベクトル
    • ハット記号(^)で表記するのが一般的
    • 英語: Unit vector または Normalized vector

単位ベクトルの使い方

単位ベクトルは方向のみを表すので、これに速度(スカラー値)を掛けることで、最終的な移動量を決定します。

基本パターン:

移動量=単位ベクトル×速度\text{移動量} = \text{単位ベクトル} \times \text{速度}

実用例

方向を保ったまま長さを1にすることで、速度を一定に保ちながら自由に方向を変えられます。

どんな方向でも同じ速さで移動

JavaScript
const direction = { x: 3, y: 4 };
const length = Math.hypot(direction.x, direction.y);  // 5
const normalized = { 
  x: direction.x / length,  // 0.6
  y: direction.y / length   // 0.8
};
// → どの方向でも長さ1(同じ速さ)

方向と速度の独立制御

JavaScript
// 入力から方向を取得
const input = { x: 1, y: 1 };  // 右上
const direction = normalize(input);  // 長さ1に正規化

// 速度を自由に設定
const speed = 10;
const velocity = {
  x: direction.x * speed,
  y: direction.y * speed
};
// → 右上に速度10で移動(斜め移動も速すぎない)

単位ベクトルの生成

JavaScript
// 特定の方向を向くベクトル(長さ1)
const rightVector = normalize({ x: 1, y: 0 });    // (1, 0)
const upVector = normalize({ x: 0, y: 1 });       // (0, 1)
const diagonalVector = normalize({ x: 1, y: 1 }); // (0.707, 0.707)

デモ: 様々な方向のベクトルを単位ベクトルに

下のデモで、どんなベクトルも正規化すると長さ1の単位ベクトルになることを確認しましょう!

元のベクトル: (3.0, 4.0)
長さ: 5.00
正規化: (0.60, 0.80)
長さ: 1.00 ≈ 1
計算式: 各成分 ÷ 長さ = (3.0 ÷ 5.00, 4.0 ÷ 5.00)