Unity游戏开发中的向量运算-点乘和叉乘
Unity游戲開發中的向量運算-點乘和叉乘
1.點乘:
定義:
又稱點積、數量積、標量積。既可以由向量坐標的代數運算得出,也可以通過引入兩個向量的長度和角度等幾何概念來求解。
公式一:
?公式二:
點積滿足交換律,即?a?b = b?a
通過點積公式可以看出,a,b都是標量,都是正數,余弦值結果只受角度變化的影響。所以,游戲開發中經常對向量a、b進行歸一化,即當兩個單位向量的長度都是1時,點乘的結果就是他們夾角的余弦值,最后可以反余弦求得向量的夾角 θ = arccos(a?b),注意這里得到的是弧度值,需要再乘以Mathf.Rad2Deg才能得到最終的角度。這個結果也可以通過Vector3.Angle(a,b)直接得出。
?由余弦函數曲線可以看出:當夾角小于90,余弦值大于0;當夾角大于90,余弦值小于0。
游戲中的應用:
1.判斷敵人在我們前方或者后方?
我們以自己為原點,問題就可以轉化為,計算我們的正前方(Vector3.forward)和原點指向敵人位置的向量的點積。當結果大于0時,說明敵人與我們正前方夾角小于90度,敵人在我們前面,當結果小于0時,說明敵人與我們正前方夾角大于90度,敵人在我們后面。
2.已知敵我位置,自己的視角θ范圍,判斷敵人是否在視角內?
同樣以自己為原點,首先可以求得正前方向量和指向敵人位置的向量之間的夾角α,因為左右視角是平分的,我們只需要比較α和θ/2的大小就可以判斷出結果了。由根據余弦值在(0,π)是單調遞減的,所以可以通過直接比較cos值的大小來比較θ值的大小,不需要通過反余弦來計算真實角度值。即當cos(α) > cos(θ/2)時,敵人在我們視角內;當cos(α) < cos(θ/2)時,敵人在我們視角外。
?2.叉乘:
定義:
向量積,數學中又稱外積、叉積,物理中稱矢積、叉乘,是一種在向量空間中向量的二元運算。與點積不同,它的運算結果是一個向量而不是一個標量。并且兩個向量的叉積與這兩個向量和垂直。同樣既可以由向量坐標的代數運算得出,也可以通過引入兩個向量的長度和角度等幾何概念來求解。
?公式一:
?公式二:
該結果為向量積的模長,其中0° < θ < 180°,方向在unity中由左手法則得出。
?
?叉乘不滿足交換律,滿足反交換律,即?axb = -(bxa)
根據左手定則可以看出,叉乘結果大于0時,第二個向量在第一個向量右邊,叉乘結果小于0時,第二個向量在第一個向量左邊。
?根據叉乘的定義,這兩個只在XY平面的向量的叉乘,必然為一個只在Z軸(垂直于XY平面)上有值的向量,所以可以把2D向量的叉乘簡化為一個只表示Z值的標量。
所以2D向量的叉乘可以定義為:
?這個公式的幾何意義就是如果以向量a和b為邊構成一個平行四邊形,那么a和b的叉乘的結果就是這個平行四邊形的面積。
游戲中的應用:
判斷最優轉向敵人問題
以自己為原點,計算自己正前方和指向敵人的向量的叉乘,如果結果大于0,說明敵人在我們右手邊,小于0則在我們左手邊。
3.總結:
簡單來說,在兩個物體的位置關系判斷中。
點乘可以判斷出目標物體在我的前方還是后方。大于零在前方,小于零在后方。
叉乘可以判斷出目標物體在我的左邊還是右邊。大于零在右方,小于零在左方。
?參考文章:
向量運算在游戲開發中的應用和思考
Unity游戲開發——向量運算(點乘和叉乘)
總結
以上是生活随笔為你收集整理的Unity游戏开发中的向量运算-点乘和叉乘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直线检测——Radon变换/霍夫变换/基
- 下一篇: 【FFmpeg】tbr tbn tbc