Game Physics 2015 – 8

ベクトル

今までは、計算を水平方向(x)と垂直方向(y)に分けて計算してきました。
しかし、向きのある運動を考えると、まとめて計算する方が便利です。

そこで、ここで ベクトル(Vector)を導入します。

スカラーとベクトル

今まで扱ってきた数値は、整数、小数など、値のみのもので、 スカラー(Scalar)といって、座標でもxとyの2つの値を別に扱ってきました。
それを2つの値にまとめて、ベクトルp(x,y)として、1つのものとして扱うことができます。

ベクトルを使った移動

スカラーを使った物体の移動は次のように計算していました。
$ X位置 = 元のX位置 + X加速度 \times 経過時間$
$ Y位置 = 元のY位置 + Y加速度 \times 経過時間$

ベクトルを使うと物体の移動は次のように計算できます。
$ 位置 = 元の位置 + 加速度 \times 経過時間$

ベクトルの表現

ベクトルは、大きさと向きを持った値です。物理で有用なのは位置ベクトルという、始点を原点(0,0)にしたものです。
たとえば、座標x=3,y=4は、ベクトル(3,4)と表します。

ベクトルの加算

2つのベクトルを加算できます。
例えば、ベクトル$A$ (1,2)とベクトル$B$ (3,4)を足して、ベクトル$C$を求めることにします。

$ C = A + B$

数値の形で書くと次のようになります。

$ C = (1,2) + (3,4)$

これは、それぞれの成分を足し合わせることで計算できます。
結果として、次のように(3,7)に移動することになります。

$ C = (1+3,2+4) = (4, 6)$

ベクトルの減算

2つのベクトルを減算できます。
例えば、先ほど計算したベクトル$C$ (4,6)とベクトル$A$ (1,2)から、ベクトル$B$を求めることにします。

$ B = C – A$

数値の形で書くと次のようになります。

$ B = (4,6) + (1,2)$

これは、それぞれの成分を引くことで計算できます。
結果として、次のように(3,7)に移動することになります。

$ B = (4-1,6-2) = (3, 4)$

きちんと、先ほどの$B$になっていますね。

ベクトルの減算のゲームへの応用

これができると、プレーヤーのキャラクタに向かってくる敵のキャラクタの移動を作成することができるようになります。

プレーヤーのキャラクタの位置を$P$、敵のキャラクタの位置を$E$としすると、敵がプレーヤーに向かうベクトル($V$)は次のように計算できます。

$ V = P – E$

このベクトルを速度にして、敵キャラクタを移動するとプレーヤーを捕まえることができます。
ただ、これだと1回で捕まってしまいます。
そこで、移動方向はそのままで移動する速さを調節することにします。

ベクトルのスカラー倍

ベクトルにスカラーをかけると、同じ方向に伸び縮みさせることができます。マイナスのスカラーを使うと逆向きになります。

$ B = A \times 2$

数値の形で書くと次のようになります。

$ B = (1,2) \times 2 = (1 \times 2, 2 \times 2) = (2, 4)$

半分にするなら、0.5を掛けます。

$ B = (1,2) \times 0.5 = (0.5, 1)$

逆向きにするだけなら、-1を掛けます。

$ B = (1,2) \times -1 = (-1, -2)$

ベクトルの正規化

ベクトルの長さを1にすることを、正規化(Normalize)といいます。
正規化されたベクトルはいろいろな場面で、計算を楽にしてくれます。

例えば、速度を次のように表すことができます。

$ 速度 = 正規化された向き \times 速さ$

正規化は、長さを1にすることですので、ベクトルをベクトルの大きさで割ります。
正規化されたベクトル($V_n$)は、ベクトル($V$)とベクトルの大きさ($|V|$)で次のように計算します。

$ 正規化されたベクトル = \frac{ベクトル}{ベクトルの大きさ}$
$ V_n = \frac{V}{|V|}$

ベクトルの大きさ

ベクトルの大きさを計算する必要がでてきました。

ベクトル$V(V_x,V_y)$の大きさは、三平方の定理から、次のように計算できます。

$ ベクトルの大きさ = \sqrt{ベクトルのx^2 + ベクトルのy^2}$
$ |V| = \sqrt{V_x^2 + V_y^2)}$

ベクトルの正規化を使って移動速度を決める

先ほどの敵の移動を正規化を使って、少しずつ移動できるようにします。

$V = P – E$
$V_n = \frac{V}{|V|}$

これを速度にすると、1回に1ずつ移動することになります。あとは、これに適当な速さを設定して移動すれば、プレーヤーに向かってくる敵を作ることができます。

Digiprove sealCopyright secured by Digiprove © 2015

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください