LoginSignup
15
17

More than 1 year has passed since last update.

ゲームプログラミング初学者のための実用数学 ベクトル編

Last updated at Posted at 2021-06-04

この記事について

この記事は「プログラミング初めてやるけど数学がわからない!」という人向けの解説です。【LogiX】とついている項目はLogiXというプログラミングのための説明なので関係ない場合は読み飛ばして問題ありません。
やる気がでてきたら画像を作って追加するかもしれません。
以下のことに注意してください。

  • わかりやすくするために一部端折っていたり厳密には間違っていたりします。(実用上は問題ないです)
  • 今回は2次元及び3次元のみを考えます。
  • ベクトルが1つの時は$\vec{V}$、2つ以上の時は$\vec{A},\vec{B}...$と表します。
  • 一度ですべてを覚えるのは無理があるのでなんとなく覚えておいて必要になったときに見直すといいかもしれません。

ベクトルの基本

ベクトル/Vectorとは

ベクトルとは「大きさ」と「向き」をもつ量です。
対して「向き」を持たない実数をスカラーと言います。
質量や距離は向きを持たないためスカラーで、速度や加速度は向きと大きさを持つためベクトルです。

ベクトルの成分表示

1つの実数だけでは向きを表すことができません。そこで各座標軸ごとの成分を(x,y)のように並べて書くことでベクトルを表します。これをベクトルの成分表示と言います。

基本ベクトル

(1,0)や(0,1,0)などの各座標軸の正方向で大きさが1のベクトルを基本ベクトルと言います。

【LogiX】関連ノード

Unpack XY :ベクトルを成分に分解します。
Pack XY :成分をベクトルとして組み立てます。

ベクトルの大きさ

ベクトルの大きさは$|\vec{V}|$と書かれ、大きさはベクトルを表した線分の長さと一致します。それぞれの成分の二乗を足した値の平方根がそのベクトルの大きさです。
例えば成分表示が(a,b)というベクトルの場合$\sqrt{a^2 + b^2}$が大きさとなります。

【LogiX】関連ノード

$|V|$ :ベクトルの大きさを出力します。
$|V|^2$ :ベクトルの大きさの二乗を出力します。

ベクトルの拡大・縮小

ベクトルにスカラーをかけると大きさを変えることができます。$\vec{V} \times a$をおこなうと$\vec{V}$の大きさはa倍となり、$\vec{V}$の成分もそれぞれa倍となります。

単位ベクトル

大きさが1のベクトルを単位ベクトルと言います。基本ベクトルと似ていますが、単位ベクトルは向きを限定されません。基本ベクトルは単位ベクトルに含まれます。
単位ベクトルは純粋な向きであると考えると扱いやすいです。

正規化/Normalize

ベクトルの向きをそのままに大きさを1にすること、つまり単位ベクトルにすることを正規化と言います。正規化するにはベクトルをそのベクトルの大きさで割ります。
$\vec{V}_{normalized} = \frac{\vec{V}}{|\vec{V}|}$

【LogiX】関連ノード

$\times$ :掛けた値を出力します。ベクトルとベクトルの場合はそれぞれの成分どうしを掛けます。
Normalized :正規化されたベクトルを出力します。扱いやすく言い換えると、ベクトルから向きのみを取り出します。

移動と位置を表すベクトル

ベクトルは大きさと向きのみを持つものであり、二点間の"移動"を表します。
例えば点Aから点Bへの移動量をベクトル$\vec{V}$とすると、$-\vec{V}$は点Bから点Aへの移動量です。

ベクトルの加法・減法

ベクトルは足し算と引き算を行うことができ、結果は新たな移動を表すベクトルとなります。
点Aから点Bへの移動ベクトルと点Bから点Cへの移動ベクトルを足すと、点Aから点Cへの移動ベクトルになります。

位置ベクトル

原点からある位置までのベクトルを位置ベクトルといいます。座標上の全ての点は位置ベクトルで表すことができます。
位置ベクトルと言うとわかりづらいですが計算上は位置/Positionとほぼ同じです。

点から点へのベクトル

2点の位置ベクトルがわかっている時、終点にしたい位置ベクトルから始点にしたい位置ベクトルを引くと2点間のベクトルを求めることができます。

【LogiX】関連ノード

+ :足した値を出力します。float3型などをそのままつなげることができます。
- :引いた値を出力します。float3型などをそのままつなげることができます。
-n :大きさはそのままで向きが逆のベクトルを出力します。

ベクトルの正射影

物体に光を当ててスクリーンに影を作ることを射影といいます。特に、あるベクトルに対して垂直な方向からの光による他のベクトルの射影を正射影といいます。
スクリーンは、ベクトルというよりもそのベクトルを含む直線であると考えるといいかもしれません。

【LogiX】関連ノード

Project :入力2をスクリーンとした入力1の正射影を出力します。

ベクトルの内積

ベクトルの学習において最初の大きな壁となるのが内積です。ゲームプログラミング実用上は内積の意味を頑張って理解するよりも内積の式と性質を理解する方が速いし楽なので今回は深い部分にあまり触れません。(ベクトルをある程度理解してから学ぶことをおすすめします。)
内積はドット積や点乗積ともいい、"・"を使って表します。内積の出力はスカラーです。

内積の式

2つのベクトル$\vec{A},\vec{B}$の始点を同じ位置にした時の角度をθとすると
$$\vec{A}・\vec{B} = |\vec{A}||\vec{B}|cosθ$$
2ベクトルの大きさの絶対値とcosθを掛けています。
また、ベクトルの成分がわかっている場合は同じ軸の成分同士を掛けてそれを足しても内積がでます。
成分表示がそれぞれ$(a_1,a_2),(b_1,b_2)$の二次元ベクトル$\vec{A},\vec{B}$の内積は
$$\vec{A}・\vec{B} = a_1b_1 + a_2b_2$$
成分表示がそれぞれ(a_1,1_2,a_3),(b_1,b_2,b_3)の三次元ベクトル$\vec{A},\vec{B}$の内積は
$$\vec{A}・\vec{B} = a_1b_1 + a_2b_2 + a_3b_3$$
となります。

単位ベクトルの内積

単位ベクトルの大きさは1であるため、単位ベクトル同士の内積はcosθとなります。
$$\begin{align} \vec{A}・\vec{B} &= 1 \times 1 \times cosθ \\ &= cosθ \end{align}$$
cosの性質よりベクトル間の角度が0°,90°,180°の時、内積は以下のようになります。
$$\begin{align}&\vec{A}・\vec{B} = cos0° = 1 \
&\vec{A}・\vec{B} = cos90° = 0\
&\vec{A}・\vec{B} = cos180° = -1\end{align}$$
内積は2ベクトル間の角度が小さいほど1に近づき、大きいほど-1に近づきます。また、垂直な場合は0になります。
単位ベクトルではなくても2つのベクトルの大きさで内積を割ることでcosθをだすことができます。

【LogiX】関連ノード

・ :入力1と入力2の内積を出力します。
。 :入力1と入力2の度数法の角度を出力します。
Acos :cosを弧度法の角度に変換します。

弧度法と度数法 弧度法や度数法とは角度の表し方のことです。 半径と等しい長さの弧に対する中心角の大きさを1としたものが弧度法で、単位はrad(ラジアン)です。私たちが普段使っている 45°,180°のような表し方を度数法といいます。 $π_{rad} = 180°$です。 基本的に数学では弧度法が使われています。

内積での条件判定

単位ベクトルの内積は2つの向きの角度の大きさを-1~1で出力するため、条件判定にとても便利です。
例えば両方の手のひらに垂直なベクトルの内積が‐1に近ければ手のひらが向かい合っていることがわかります。さらに両手の距離や、片方の手のひらのベクトルと片手を始点としたもう片方の手へのベクトルの内積を見ることで、「手のひらをあわせている」などの条件を判定することができます。

【LogiX】関連ノード

> :入力1が入力2より大きい場合Trueを出力します。
< :入力1が入力2より小さい場合Trueを出力します。
= :入力1が入力2と等しい場合Trueを出力します。
≈ :入力1と入力2の差が入力3以下の場合Trueを出力します。
IsBetween :入力1が入力2以上、入力3以下の場合Trueを出力します。

ベクトルの外積

ベクトルの2つ目の大きい壁が外積です。
外積は内積よりも意味を理解しづらく、特に二次元での外積は外積の定義にや分野によって存在したりしなかったりするので調べるのも難しいです。今回は三次元の外積のみを考えます。
外積はクロス積ともいい、"×"を使って表します。外積の出力はベクトルです。

外積の大きさ

2つのベクトルが作る平行四辺形の面積が外積の大きさです。
$$\vec{A} \times \vec{B} = |\vec{A}||\vec{B}|sinθ$$
で求めることができます。

外積の向き

外積の向きは2つのベクトルに対して垂直な向きです。$\vec{A}\times\vec{B}$の場合$\vec{A}$から$\vec{B}$へ向けてねじを回した時にねじが進む方向です。そのため$\vec{B}\times\vec{A}$とすると向きが反転します。

外積の求め方

$\vec{A}(a_1,a_2,a_3),\vec{B}(b_1,b_2,b_3)$の外積の成分は次の式で求めることができます。
$$\vec{A}\times\vec{B} = (a_2b_3-b_2a_3,a_3b_1-b_3a_1,a_1b_2-b_1a_2)$$
求める成分以外の成分をたすき掛けします。(すぐに覚えなくとも問題はないです)

【LogiX】関連ノード

cross :入力1と入力2の外積を出力します。

終わりに

ベクトル編はここまでです。ベクトルの回転や座標の話も入れようかと思いましたが既にかなり長くなってしまったので今回入れるのはやめました。座標は図形の性質編、回転は行列編で説明しようかと思います。(やるきがあれば)

15
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17