外積
外積
ゲームでは主に衝突判定などに利用され非常に重要な計算テクニックとなっています
<計算式>
外積の計算の特徴
- 答えはベクトルになる。unityの座標系は左手座標系となっており親指をベクトルA、人差し指をベクトルBとした時、中指が外積のベクトルとなります
- A×BはベクトルA、Bに対し垂直になる
- ベクトルA、Bによって形作られる平行四辺形の面積と、外積で計算されたベクトルの長さは同一となる
- A×B≠B×A (外積は交換不可)
ベクトルの外積の計算内容の順番は固定しているので通常の交換法則は成り立たない。以下のようになります
<左手座標系について>
線形代数学においてユークリッド座標を表す時に使われる。unityの場合、左手の3本の指を使って座標系を作る(いわゆるDirectX系。非OpenGL)
親指+x,人差指+y,中指+zを指す。L字を作った左手の平の内を人に見せた時のような形となる
<性質の検証>
a・(a×b)を計算してベクトルaと外積のベクトルの関係が垂直であるか検証してみる
この最期の式で、1項と4項、2項と5項、3項と6項がお互いに打ち消し合っている事が確認できる
従って a・(a×b)=0 となる。内積が0という事は直交であるという事になる。b・(a×b)も計算すると同様に0となる
次に|a×b|の長さを検証する。|a×b|の長さを2乗して余弦定理に似た形にしてみる
ここで式の意味を整理して内積の意味を思い出し a・b=|a| |b|cosθ として取り換える
この結果から、「aとbの外積」のベクトルの絶対値(長さ、大きさ)は「abで形作られる平行四辺形の面積」と同じになる事を表している
|a| |b|sinθ=平行四辺形の面積
<サンプル>
using UnityEngine;
using System.Collections;
public class Cross : MonoBehaviour
{
Vector3 vecA, vecB, cross, cross2; void Start () { vecA = new Vector3 (1, 0, 0); vecB = new Vector3 (0, 1, 0);
//外積を自前で計算 cross = new Vector3 ( vecA.y * vecB.z - vecA.z * vecB.y, vecA.z * vecB.x - vecA.x * vecB.z, vecA.x * vecB.y - vecA.y * vecB.x); //unityの関数で計算 cross2 = Vector3.Cross (vecA, vecB); } void Update () { Debug.DrawLine (Vector3.zero, vecA, Color.red); Debug.DrawLine (Vector3.zero, vecB, Color.green); Debug.DrawLine (Vector3.zero, cross, Color.blue); }
}
外積を利用して角度差(なす角)を得ることもできる
これにはアークサインを使う
ベクトルAとベクトルBの角度差θは
θ = Asin( A×B / |A| |B| )
- 最終更新:2014-11-14 16:59:21