ベクトル
https://www.youtube.com/watch?v=dq4mq2ad0xI
ジャンル的には代数幾何学に含まれるらしい。当面2次元ベクトルに限ってのお話 衝突点を求めたりするので、線分の当たり判定を主に用いる(矩形の当たり判定で、当たり判定計算の要否を求めたりなど) ベクトルを使うにあたって
三角関数を使う事で、「向き」と「大きさ」に相互変換できる
向きの表現
素朴な表現だとVectorを使った、各X,Y,Zでどう回転させたかの数値、オイラー角を使った表現。角度。 同じくVectorを、「どの地点を見ているか」で表現する方法。LookAt。
オイラー角にはジンバルロックという問題があるので、それを解消するQuaternionと言う表現
ベクトルの差分で、2点間の距離と向きを格納したベクトルが得られる
var heading = target.position - player.position; (計算順はTo-Fromなので注意)
向きだけ取得するなら、正規化されたベクトルを取得する。これは距離ベクトルをそのベクトルの大きさで割った物になる var distance = heading.magnitude; 距離の取得(方向を失う)
距離の比較だけが必要な時(近接度合いのチェック、円の当たり判定) heading.sqrMagnitudeを使うことで平方根計算をスキップできる。
code:cs
if (heading.sqrMagnitude < maxRange * maxRange){
// Target is within range.
}
var direction = heading / heading.magnitude; 向きの取得(距離を1としてx軸y軸の長さを調整する)
向きを一発で取得するheading.normalizeも存在するが、magnitudeもnormalizeも平方根を計算するので、両方使うなら上記の計算をした方が良い
見下ろしの2.5Dを作ってる時などで、真上から見たターゲットへの向きが必要な場合、高さ(y軸)に0を入れて要素を消してしまう
code:cs
var heding = target.position - player.position;
heading.y = 0; // This is the overground heading
Quaternionから方向ベクトルを作る
https://gyazo.com/4da8e9df2ce2e5a0e781ef04ca2fd93b
こういう向きの銃から弾を出したい場合は、Vector3.rightと掛ける
code:cs
var rot = this.transform.rotation * Vector3.right;
go.GetComponent<Rigidbody>().velocity = rot * this.speed;
作り方(定義、公式)
from(x1,y1), to(x2,y2)があるとして、from, toのなす角をthetaとすると、
(x1 * x2 + y1 * y2)で求まる値、またはmagnitude(from) * magnitude(to) * cos(theta)で求まる値(同じ結果になる)
内積は「こういう値を定義しておくと色んな使い道があって便利」くらいの意味合いの数値です。
2つのベクトルの内積を求めると、スカラー値が取得できる。このスカラー値は、2つのベクトルの大きさを乗算したもの、およびベクトルのなす角のコサインと等しくなる https://gyazo.com/482fee353be9c7f63bcd3203e5490051
両方のベクトルが正規化されている時、コサインは実質的に、最初のベクトルが二つ目のベクトルの向きに進んでいるか否かを表す
magnitude(from) * magnitude(to) * cos(theta)による理屈。
magnitude(from)もmagnitude(to)も1になるので、内積した結果が単にcos(theta)になる。
そしてcos(theta)は、2つのベクトルが平行に近い程絶対値が大きくなり、向きが同じ程値が大きくなる
符号に関与する項がcos(theta)だけなので、正の値なら同じ向き、負の値なら反対向き、が判定できる
これで取得した値をarccosineに食わせるとラジアンが求まるらしい 関数的にはdotと呼ばれるそう
作り方(定義、公式)
from(x1,y1,0), to(x2,y2,0)があるとして、 from, toのなす角をthetaとすると、
(0, 0, x1 * y2 - y1 * x2)で求まる値、またはAbs(from) * Abs(to) * sin(theta)で求まる値
2次元に限った話
2つのベクトルが作る平面の法線と平行な方向を向いている。
スカラ値は面積に、ベクトルは面の法線になる。
2DだとベクトルAに対して、ベクトルBが右側に向かっているのか、左側に向かっているのかがわかる
正負の値がどっち向きなのかはよくわからん(上の式をよく見ろという話)
関数的にはcrossと呼ばれるそう
ベクトルに対し符号が反対になった逆数を求めればよい
境界線のベクトルがΔx Δyであった場合、法線の傾きはΔy -Δxになる
この辺、計算補助用にユーティリティクラスとか作った方が良いのかなぁ
table:変数名の参考
目的地 destination
距離 distance
方向 direction
座標、位置 position
直角ベクトルを作るために
code:cs
x = y
y = x
をした場合、反時計回りに90°回したことになる