手寫了一份叉乘的推導
矩陣的叉乘
叉乘的矩陣形式,a向量變成A* 然後乘b向量
二維矩陣
假設a(a1,a2) b(b1,b2)
aXb = a1b2 - a2b1 幾何意義就是 aXb是a b組成的平行四邊形的面積
接下來來證明
S(a,b) = ab*Sin<a,b> = b X a = a2b1 - a1b2
Sin<a,b> = Sin(α - β) = SinαCosβ - CosαSinβ = * - * =
==>> S(a,b) = a1b2 - a2b1
==>> S(a,b) = = a1b2 - a2b1
這兩個值是相反的, S(a,b) = b X a
因爲 Sin<a,b> = Sin(α - β) Sin<b,a> = Sin(β - α) 同時也跟矩陣aXb bXa的右手座標系有關
三維矩陣
= a11a22a33 + a12a23a31 + a13a21a32 - a11a23a32 - a12a21a33 - a13a22a31
跟上面二階行列式一樣,都是正向對角相乘後的和 減去 反向對角相乘後的和
S(a,b,c) = a X b X c
這就可以來推測Unity裏面Vector3的Cross
public static Vector3 Cross(Vector3 lhs, Vector3 rhs)
{
return new Vector3((float) ((double) lhs.y * (double) rhs.z - (double) lhs.z * (double) rhs.y), (float) ((double) lhs.z * (double) rhs.x - (double) lhs.x * (double) rhs.z), (float) ((double) lhs.x * (double) rhs.y - (double) lhs.y * (double) rhs.x));
}
這就是兩個矢量的叉乘
所以求向量的叉乘可以轉換爲求對應矩陣的行列式
應用
左手定則根據叉乘的正負判斷 目標在主角的左面還是右面
public Transform target;
public Vector3 temp;
void Start () {
}
void Update () {
temp = Vector3.Cross(transform.position,target.position);
if (temp.y > 0)
{
print("在左面");
}
else
{
print("在右邊");
}
}