矩陣和矢量的叉乘推導和簡單實用

手寫了一份叉乘的推導

矩陣的叉乘

叉乘的矩陣形式,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β = \frac{a2}{a}*\frac{b1}{b}\frac{a1}{a}*\frac{b2}{b}\frac{a2b1 - a1b2}{ab}

==>>   S(a,b) = a1b2 - a2b1

==>>   S(a,b) = \begin{bmatrix} a1 & a2 \\ b1 & b2 \end{bmatrix} = a1b2 - a2b1

這兩個值是相反的, S(a,b) = b X a 

因爲 Sin<a,b> = Sin(α - β)   Sin<b,a> = Sin(β - α)    同時也跟矩陣aXb  bXa的右手座標系有關

三維矩陣

\begin{bmatrix} a11 &a12 &a13 \\ a21&a22 & a23\\ a31 &a32 &a33 \end{bmatrix}  = 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("在右邊");
		}
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章