Unityゲーム作りでよく使う数学や物理学

data-thumbnail

<概念的なもの、手法>

スカラー

長さ、面積、質量、温度、時間など、大きさだけで定まる方向を持たない数量です。スクリプトでmagnitudeとついたらそのクラスや変数のスカラーを表す事が多いです。

正規化

データを扱いやすいように整理・変形することです。Unityでは0〜1の範囲に直すか、1に対応するように直す事が多いです。例えば100点満点のテストで80点をとった時、これを0〜1に範囲で正規化すると0.8になります。ベクトル等を正規化した場合は大きさが1になるように直します。スクリプトでnormalizedとついたらだいたい正規化のことをさします。

線形

直線のグラフで表すことができるものかと思いきや違うようです。
f(x+y) = f(x) + f(y)
f(kx) = kf(x) //kは実数
この2つの式が成り立つものらしいです。
Σや内積は線形らしいです。
y=2xは線形だけどy=2x+1は↑の条件に当てはまらないので線形ではないらしいです。

接線・主法線・従法線

ある曲線に接するように引かれるベクトルを接線ベクトル、曲面が曲がっていく方向を正規化した線を主法線ベクトル、接線ベクトルと主法線ベクトルの外積を従法線ベクトルと言います。

vector type_Illustration

ユークリッド空間

n個の実数で表現でき、各要素の距離を計算することができる空間

Euclidean space_Illustration

虚数

2乗した際に0より下になる実数の事を指します。
虚数単位「i」を使って表されます。iを2乗すると-1になる性質を持ちます。
i2 = -1
虚数は実際には存在しない数字です。

複素数

虚数と実数を合わせたものです。
a + biで表されます。

これを横を実数、縦を虚数で表したグラフを複素平面と言います。

Complex number graph_Illustration

複素平面は回転を表す際に便利です。

Complex number rotation_Illustration

角度をn倍した場合の値と、値をn乗した値が等しくなります

Imaginary power_Illustration

角度を足す事を複素数でかける事で表すことができるので回転の計算で重宝されます。

オイラー角

剛体の姿勢を表す角度。

座標をα,β,γで回転させて表現します。
このα,β,γは角度なので0〜180です。

Euler angles_Illustration

↑の例ではz-x-zの順で回していますが、回転方法は任意で12通りの回転方法があります。Unityはx-y-zの順に回しています。

クォータニオン

ある回転軸を決めて、そこからθ回転させることを表した数。
複素平面を3次元で表したものです。複素平面は1つの虚数と1つの実数から成り立っていましたが、クォータニオンは3次元で回転を表したい為、3つの虚数と1つの実数から成り立ちます。3つの虚数部をx,y,z、実数をwとすると4次元ベクトル(x,y,z,w)で表せます。

回転軸からθ(ラジアン)回転したクォータニオンは
x = (回転軸のx成分)sin(θ/2)
y = (回転軸のy成分)sin(θ/2)
z = (回転軸のz成分)sin(θ/2)
w = cos(θ/2)

です。

また、複素数の性質からクォータニオン同士の掛け算で回転させることができます。
↓は一定間隔でクォータニオン×クォータニオンをして回しています。

quater arrow

ソルバー

複数の変数を含む数式で、目標の値を得るために最適な変数は何かを求めること。完全な解を得る事は出来ませんが、反復計算の回数を増やすことによって、精度を高めることが出来ます。

スポンサーリンク

<行列計算>

行列

数や記号や式などを縦と横に矩形状に配列したものです。横に並んだ一筋を行、縦に並んだ一筋を列と呼びます。

matrix_sample_Illustration

正方行列

行と列の数が一緒になる行列。
例 2×2の行列。3×3の行列 など

単位行列

対角成分が全て1で他の成分が全て0の正方行列。Eで表記されます。

unit_matrix_Illustration

行列式

正方行列から取り出せる値。式ではなくスカラーです。あるベクトルに対してこの正方行列を使い、別のベクトルに変換した際にどれだけ伸び縮みするかの値です。detAや|A|と書きます。行列を右斜めに見た時の成分を掛けて足し、左斜めに見た時の成分を掛けて引くとこの値になります。↓は3×3の行列式の求め方です。

Determinant_Illustration

余因子

ある正方行列のある行とある列を1つ抜き取った行列式の符号を入れ替えたもの。スカラーです。(行列)ijと表記されます。

↓の例は3×3の行列での(2,2)での余因子です。

cofactor_Illustration

↑の例では(2,2)ですが、3×3なら9通りパターンが存在します。

余因子行列

余因子で構成された行列。(行列)~と表記されます。

cofactor_matrix_Illustration

逆行列

ある行列に掛けたら単位行列になる行列。
存在する場合と存在しない場合があります。存在する場合は行列式が0になります。(行列)-1と表記されます。

ある行列をAとすると求め方は
A-1=(1/|A|)A~
になります。

またある行列に掛けたら単位行列になるので
AA-1 = E
となります。

正則行列

逆行列をもつ行列のこと

転置行列

行列の成分(i,j)を(j,i)に入れ替えた行列。(行列)Tで表されます。

transposed_matrix_Illustration

対称行列

ある行列の成分(i,j)を(j,i)に入れ替えても同じになる行列。
ある行列とその転置行列の値が等しくなります。
A = ATになる行列の事を言います。

直交行列

ある行列Aの対称行列が逆行列と等しくなる正方行列を直交行列と言います。
つまりAT=A-1が成り立つ行列です。
また↑の性質より、ATA = Eも成り立ちます。
行列Aが表す列ベクトルは互いに垂直で大きさが1になります。

orthogonal_matrix_Illustration

対角行列

正方行列かつ対角成分以外ゼロである行列。Dと表記されます。

diagonal matrix_Illustration

対角化

ある行列を対角行列にすること。
ある行列をAとして、適当な行列をPとした時、
P-1AP = D
が成立するPが存在することを対角化可能と言います。

Pの求め方はある行列Aの固有ベクトルを行列にします。

例 : Aが3×3の正方行列の時、Aの固有ベクトルを→x1,→x2,→x3とすると

vector_calculation_Illustration

(aやらxやらややこしくなるので、固有ベクトルの成分を適当な記号で表しました。数学的には変だけど、わかりづらいよりかはいい)

回転行列

ベクトルを回転させる行列


2次元の場合

cosθ -sinθ
sinθ cosθ で表せます

2 Rotation matrix_Illustration


3次元の場合

2次元の時より複雑で、何軸で回転するかを考えなければならなりません。↑の2次元回転行列を参考に

3 Rotation matrix_Illustration

と出せます。これを、y、zも同様にすることによって各軸周りの回転行列を出すことができます。

3_rotation_matrix_math_Illustration
スポンサーリンク

<微分積分>

極限

ある値に限りなく近づけること
limという風に表現されます。

limit_n_infinity _Illustration

↑の時0を極限値といいます。このように1つの値に近くことを「収束する」と言います。結果が無限大になるものを「発散する」と言います。この時、正の無限大に発散するものと負の無限大に発散するものがあり、正にも負にも発散するものを「振動する」と言います。↑の例ではnは無限に近づいていますが、無限である必要はありません。

微分係数

ある数式のある点における接線の傾き。

derivative_coefficient_Illustration

導関数

微分係数がある点に関することだった事に対し、任意のx座標での接線の事。微分係数の説明の点Aでの(a,f(a)を任意の点(x,f(x))に変えるだけです。もっと簡単に言うと、aをxに変えただけです。

微分

ある数式の変化率を求めること。導関数を求めることと同じ。

積分

限りなく小さくしたものを特定の範囲分足して得られるものです。

integral_Illustration

積分をすると単位が変わる特徴があります。

integral_example_Illustration

数学では難しい積分ですが、Unityでは割と簡単に扱えます。何故なら「限りなく小さいもの」という抽象的なものを実数として計算できるからです。例えば、「限りなく小さい時間」はTime.deltaTimeで表せます。「限りなく小さい距離」は現在のフレームの位置から前のフレームの位置を引けば計算できます。

//oldPosiotnを前フレーム、 dmは限りなく小さい距離
Vector3 oldPosition;

void Update()
{
   float dm = (transform.position - oldPosition).magunitude; 
   oldPosition = transform.position;
}

ここで問題になってくるのは、Unityの「限りなく小さいもの」がデカ過ぎる点です。数学や物理でいう「限りなく小さいもの」は限りなく0に近いわけですが、Unityではフレーム間の差になってしまうので小さいとは言っても大きさを持ってしまいます。ゲームの物理は嘘と言われるのは、この差を設定でなんとかそれっぽく見せようとしているからです。本当に限りなく0に近づけて計算しようとすると重すぎてゲームがカクカクになってしまいます。

スポンサーリンク

<ベクトル計算>

ベクトル

方向と大きさを表したものです。矢印で表される事が多いです。始点と終点があるので座標とこんがらがる事が多いですが、ベクトル自体は位置を示しているわけではありません。あくまで方向とその大きさを表した物です。

ただし位置ベクトルとかいうややこしい物があり、これは原点からの見た対象へのベクトルを表しているので位置ベクトルと座標が同じ値になります。

ノルム

ベクトルの大きさです。スカラーの一種でもあります。単位ベクトル×ノルム=ベクトルになります。

vector_Illustration

(ベクトルにおける)テンソル

「ベクトルに働きかけて、別のベクトルを生み出すもの」という概念(数値だったり数値の集合体だったりするらしい)スカラーだったり行列だったりします。
スカラー・・・0階テンソル
ベクトル・・・1階テンソル
行列・・・2階テンソル
と分類されます。

位置ベクトル

原点を始点とするベクトルのことです。Unityのワールド座標の原点の位置が(0,0,0)なのでtransform.positionが原点からみた位置ベクトルと同値で扱えます。

単位ベクトル

大きさが1のベクトルです。大きさが1なのでUnityでは方向として扱われる事が多いです。ベクトルを正規化すると単位ベクトルになります。

法線ベクトル

2次元の場合:ある線に対して垂直なベクトルです。

3次元の場合 : ある面に対して垂直なベクトルです。方向はプログラムによってまちまちです。直交する2辺を反時計周りに見た時手前を右手系、奥を左手系と言います。ゲームではポリゴンの向きが3次元法線ベクトルで表されます。OpenGLは右手系、DirectXは左手系です。ネーミングは右ネジの法則と同じ原理です。

normal vector_Illustration

固有ベクトル

とある正方行列に掛けても方向が変わらない特殊なベクトル

vector_matrix_Illustration
eigenvector_Illustration

n×nの正方行列には最大n個の固有ベクトルが存在します、

求め方

det(A-λE) = 0
detは行列式、Aが元の行列、λが固有値、Eが単位行列

↓は3次元での例です。
元の行列の値がわかっているならλの値を求められます。

eigenvectores_math_Illustration

↑の式から行列式の公式で計算すると
(a11-λ)(a22-λ)(a33-λ)+a12a23a31+a13a21a32-a13(a22-λ)a31-a12a21(a33-λ)-(a11-λ)a23a32 = 0

↑Aの各種成分がわかっているとλが求まります。
この時
(A-λE)→x = →0
(A-λE)の値がわかっているので→xが求まります。
→xが固有ベクトルになります。
λは最大n個存在するので→xも最大n個存在します。

固有値

固有ベクトルと行列を計算した後、元の固有ベクトルとどれくらい変わったかの倍率。n×nの正方行列には最大n個の固有値が存在します。λと表記されます。求め方は固有ベクトルを求める過程で得ることができます。

スポンサーリンク

<内積外積>

内積

2つのベクトルの、一方の方向でのベクトルの大きさを掛けたものです。

dot_Illustration

「ベクトルの大きさ」を掛けているので得られる結果はベクトルではなくスカラー(ただの数値)
また、「ベクトルの大きさ」を掛けているのでaとb逆にしても同じ結果になります。

Cosine_theorem_Illustration

また、ベクトルの長さは(ベクトルa,bは平行移動で原点から伸びているとできるので)

length_Illustration

で計算されます。これをベクトルa,bの絶対値に当てはめます。この時ベクトルaの要素を(ax,ay,az)、ベクトルbの要素を(bx,by,bz)とすると

dot_theorem_Illustration

という訳で内積は2つのベクトルの各種要素を掛けたものを全部足しても表すことができます。


この特性から、Unityでは2つのベクトルの角度を求める時等に使用されます。(ベクトルの要素は全てtransform.positionで把握できるのでcosθの値を出すことができる)

また、ベクトルaが単位ベクトルだった場合(|→a|は1だがax,ay,azは1とは限らない)ベクトルbがa方向に持つベクトルの長さが求められるので力のかかり方等を計算することができます。

例えば、箱を紐で引っ張ったとして、|→a|を進む方向で大きさを1と仮定した場合

vector_power_Illustration

このように、内積によって力の計算などもできます。

外積

cross_product_Illustration

なんか便利だったから↑のように定義したらしいです。|→a||→b|sinθは外積の大きさであり、外積そのものではありません。

x成分(aybz-azby)、y成分(azbx-axbz)、z成分(axby-aybx)

で計算されるのが外積となります。

スポンサーリンク

<運動>

物体に働く力

物体に働く力はFと表記されます。
F = ma で計算できます。mは質量[kg]、aを加速度[m/s2]
ベクトルで表されます。

運動エネルギー

物体の運動に伴うエネルギー。物体の速度を変化させるための仕事量です。
Kと表記されます。
K = 1/2 mv2 で計算できます。mは質量[kg]、vは速度[m/s]

運動量

物体の運動の勢い。pと表記されます。
p = mv で計算できます。mは質量[kg]、vは速度[m/x]
ベクトルで表されます。

密度

単位体積辺りの質量。kg/m3だったり、g/m3だったりg/L(リットル)だったりします。

剛体

どんなに力を加えても形が変わらない物体。衝突などで変形することを考慮しなくてもいい物体です。


スポンサーリンク

<回転運動>

角速度

ある点をまわる回転運動の速度。ωで表記されます。ラジアン/秒。
ω = θ/ t
ベクトル表記する時、速度の方向とは違うので注意しましょう。

angular_vector_Illustration

速度はv = ωrで表されます。

角加速度

ある点を回る回転運動における角速度の変化率。変化率であるため角速度を時間で微分することで求められます。εで表記されます。
ε = dω / dt

モーメント

ある点のベクトルと、その点の位置ベクトルの外積

moment_Illustration

回転運動エネルギー

回転運動をする物体の運動エネルギー
K= 1/2 Iω2  で計算されます。Iは慣性モーメントテンソル、ωは角速度

トルク

ねじりの強さ。ある固定された回転軸周りの力のモーメントのことです。

力のモーメント

ある点における「物体の回転軸」を回転させる力の大きさ。ある点にかかる力と位置ベクトルを外積すると回転させる力の大きさになります。位置ベクトルは原点からある点までのベクトルですので、原点からある点までの距離と言えます。すなわちある点にかかる力のモーメントは
N = r × F
(N=力のモーメント、r=ある点の回転軸からの距離、F=ある点にかかる力)
(×はかけるではなく外積である点に注意)

また、運動方程式では
N = I(dw/dt) でも表すこともできます。
(I=慣性モーメントテンソル、dw/dt=角加速度)

運動のモーメント(角運動量)

ある点における回転軸に対する回転運動の勢い。Lで表記されます。
L = Iω で計算することができます。 Iは慣性モーメントテンソル、ωは角速度
L = r × p でも計算されます。rは回転軸からの距離、pは運動量 p = mv

慣性モーメントテンソル

物体が回転する際の角運動量Lと角速度ωの関係を表すテンソル。Iで表記されます。
慣性モーメントテンソルの大きさは回しにくさと言えます。
力のモーメントの公式よりN = I(dw/dt)から 
(トルクと力のモーメントは同じものなので)

tensor_Illustration

角加速度を求める際、慣性モーメントテンソルで割られているので、慣性モーメントテンソルが大きさが大きいほど角加速度は小さくなる=慣性モーメントテンソルの大きさは回しにくさと言えます。

また、各種公式から
L = Iω
L = r × p 
p = mv
v = ω × r より (×は外積)(・は内積)

Iω = r × p
lω = r × (mv)  外積の結合の法則より A×(λB)= λA×B
Iω = mr × v
Iω = mr × (ω × r) 外積の法則より A×(B×C)=(A・C)B – (A・B)C
Iω = (mr・r)ω – (mr・ω)r  r・rは内積の法則よりr2、(mr・ω)=m(r・ω)
Iω = mr2ω – m(r・ω)r
Iω = m(ωr2 – (r・ω)r)

この時、rの成分をrx,ry,rzと置き、ωの成分をωxyzと置く。
r2はベクトルの大きさになっているので、r2 = rx2+ry2+rz2
また内積はスカラーであるため、(r・ω)の中身はどの成分で考えても同じ


x成分で考えるω>ωx r>rx  スカラーである部分は成分関係なく代入出来る
x = m(ωx(rx2+ry2+rz2) – (rxωx + ryωy + rzωz)rx)
  = m(ωxrx2 + ωxry2 + ωxrz2 – ωxrx2 – ωyrxry – ωzrxrz)
  = m(ry2 + rz2x – mrxryωy – mrxrzωz


y成分で考えるω>ωy r>ry  ↑と同じように計算すると
y = -mrxryωx + m(rx2 + rz2y – mrzry


z成分は ω>ωz r>rz
z = -mrxrzωx – mryrzωy + m(x2 + y2z


この3つを合わせると

rotation_tensor_Illustration

全慣性モーメントテンソル

慣性モーメントテンソルはある点1つにおけるものでした。それを全ての点で足した物が全慣性モーメントテンソルになります。これもIと表現されるので慣性モーメントテンソルがある点1つにかかっているのか、全ての点にかかっているのかを考える必要があります。

sigma_moment_tensor_Illustration

主慣性モーメント

慣性モーメントテンソルの大きさを表します。慣性モーメントテンソルの行列を見てみると対象行列であるということがわかります。対称行列は直交行列で対角化することが出来るという性質があります。この慣性モーメントテンソルを対角化した行列を主観性モーメントと言います。
対角化の公式より
PTIP = D このDの各種成分をI1、I2、I3として

main_tensor_Illustration

と表されます。

また、直交行列は各種列ベクトルの大きさが1、互いに垂直になるという性質から、2次元および3次元のユークリッド空間において回転行列であると言えるため、角速度ωの方向をPの回転行列で回転させると角運動量Lの方向と等しくなります。

rotation_Illustration

すなわち、主慣性モーメントはωとLとの大きさの違い、慣性モーメントテンソルの直交行列はωとLとの方向の違いを表します。

↑と↓の色は関係ありません

omega_Illustration


タイトルとURLをコピーしました