2Dゲームの数学らへんのことまとめ

サイン、コサイン、タンジェント

#直角三角形の場合のはなし

直角以外の角度から長さの比率を求めることが出来る。

sinθ = 対辺 / 斜辺

→対辺が求まる。= Y座標にあたる。

cosθ = 隣辺 / 斜辺

→隣辺が求まる。= X座標にあたる。

tanθ = 対辺 / 隣辺

アークサイン、アークコサイン、アークタンジェント

サイン、コサイン、タンジェントの値(つまり長さの比率)から、角度を求めることが出来る。

libgdxではアークタンジェントを求めてくれる関数↓

比率ではなく、長さそのものがパラメータになっている。

float angle = MathUtils.atan2( screenY - 200, screenX -200 );

radian(ラジアン)とDegree(角度)

radian(ラジアン)はPIを使って表した角度。

90度 = PI / 2

180度 = PI

パラメータや戻り値になっている角度がradian(ラジアン)なのかDegree(角度)なのかは、わかっておかないといけない。

上に書いたMathUtils#atan2の戻りは、radian(ラジアン)。

それに対して、とく回転で使うActor#setRotationに渡すパラメータはDegree(角度)なので、ラジアンからDegree(角度)に変換する必要がある。

radian * MathUtils.radDeg;

上で変換出来る。逆にデジ→ラジの変換係数もMathUtilsにある。

ベクトル

数学的には向きと力のこと。ゲームプログラミングだと単純に座標(X, Y)とかで使われる。

libGDXではcom.badlogic.gdx.math.Vector2,com.badlogic.gdx.math.Vector3のクラスがこれにあたる。

ピタゴラスの定理

h2 = a2 + b2 h2 のルート が斜辺の長さ

ピタゴラスの定理を使って、斜辺の長さがわかる。libgdxだとVector2#lenがこれに相当する。

2点A,Bの距離を求めたい場合は、以下のようにすればよい。

AのVector.sub(BのVector) = AB差分Vector
2点の距離 = AB差分Vector#len()

上記ピタゴラスの定理では距離が求まるが、正確な距離が知りたいのではない場合(2つの距離を比べてどちらが長いか、だけを知るときなど)は ルートの演算をする前の2乗したそのままの値で比較すればいい。

ルートの処理は地味に思いので、それをしないでいいところではしないほうが処理が軽い。

libgdxではVector2#len2がこれにあたる。

単位ベクトル

上記ピタゴラスの定理では、2点の差の距離と向きがわかるが、

自分で速さを調整する時などのために、向きだけの情報がほしかったりする。

その為、単位ベクトルに変換する。この変換することを正規化する と言ったりもする。

libgdxではVector2#norがこの正規化する関数にあたる。

補完

点AからBへ移動するのに、少しずつ移動する、というようなのを補完という。

移動だけの話じゃなくて、赤から青にちょっとずつ変えたりとか。そういうのにも使える。

libgdxのActions#moveByとかは移動差分と時間を指定しているので、単純に距離を時間でわってちょっとずつ動かしたりしてる。そういうののことをいう。