Unity游戏开发——向量运算(点乘和叉乘)
Unity游戲開發——向量運算(點乘和叉乘)
0.前言
在游戲開發中,確定目標得方向,朝向,夾角等相關數據需要用到向量的計算,其中最常用到的就時點乘和叉乘。
因為我們主要研究的是游戲開發中的3D世界向量,所以小面的介紹會以幾何定義為主,不研究其代數定義。
1.點乘
定義
點乘又稱點積、數量積、標量積。
從幾何角度看,點乘是兩個向量的長度和它們的夾角余玄值的積。
從名稱和定義來看,點乘的結果是標量。點乘的名稱也源自與點乘的運算符號。
通過上面的公式,我們也可以得到如下公式。
也就是說如果給定了兩個向量,那么我們就可以求出兩個向量的夾角。
關于這里的計算需要插播一個點。**當兩個單位向量的長度都為1的時候,向量的點乘就是它們夾角的余玄值。**在游戲開發中會有歸一化的操作,然后直接求夾角的情況,如果對這個知識點沒有了解,可能看不懂夾角計算的原理。
我們通過點積公式可以看出來a,b都是標量,都是正數,余玄值會根據角度有正負變化。
當(0-90)°的始后,余玄值是正數,整個點乘公式都是正的。
當90°的時候,余玄值為0,整個公式為0.
當(90-180)°的時候,余玄值為負數,整個公式為負的。
在Unity中的應用
using UnityEngine; public class Example : MonoBehaviour {public Transform cubeRed;//敵人public Transform cubeBlue;//玩家自身void Update(){if (Input.GetKeyDown(KeyCode.Space)){CalculateDot();}}private void CalculateDot(){//先計算出敵人相對自身的位置信息Vector3 relativePosition = cubeRed.position - cubeBlue.position;//再使用自身正方向與相對方向兩個向量做點乘的相關運算Vector3 cubeForward = cubeRed.forward;//計算兩個向量的點乘//如果大于0說明敵人在玩家自身前方//如果小于0說明敵人在玩家自身后方//如果等于0說明玩家在玩家自身的左右float result = Vector3.Dot(cubeForward, relativePosition);Debug.Log($"點積的結果:{result}");//得到兩個向量后,可以直接計算其夾角float angle = Vector3.Angle(cubeForward, relativePosition);Debug.Log($"兩個向量的夾角:{angle}");//這是前面說到的當兩個向量的長度都為1時,點乘的結果就是夾角的余玄值float cos = Vector3.Dot(cubeForward.normalized, relativePosition.normalized);Debug.Log($"余玄值:{cos}");//通過反余玄函數得到兩個向量的角度//不過這里得到的時弧度值,并不是角度值float radians = Mathf.Acos(cos);Debug.Log($"通過余玄值求弧度:{radians}");//弧度值通過數據轉換成角度值angle = radians * Mathf.Rad2Deg;Debug.Log($"把弧度轉換成角度:{angle}");} }得到的結果如圖所示,當敵人在自身后方時,點乘的結果小于0,當敵人在自身前方時,點乘的結果大于0。
2叉乘
定義
又稱叉積、向量積
首先叉乘的結果是向量不是標量。
叉乘的名稱也來源于符號
叉乘的公式定義稍微復雜一點
叉乘最后的結果是一個向量,大小可以根據公式算出,但是方向要根據右手法則確定。
實際上Unity中用的是左手坐標系,所以確定方向的時候我們要用左手法則,最后得到的方向正好與右手法則相反。所以兩個向量的叉乘并不是一個真向量,它受參照系的影響,這個在以后的計算中要注意我們使用的到底是哪種坐標系。
幾何意義
如果以向量a和b為邊構成一個平行四邊形,那么這兩個向量的叉乘的模長與這個平行四邊形的面積相等。
其實這個概念很好理解。我們不考慮叉乘方向的問題,叉乘的模長就是absinθ,其實也就是平行四邊形面積公式中的底乘高。
在Unity中的應用
private void CalculateCross(){Vector3 relativePosition = cubeRed.position - cubeBlue.position;Vector3 cubeForward = cubeBlue.forward;Vector3 result = Vector3.Cross(cubeForward, relativePosition);Debug.Log(result.y);}根據左手定則,y軸是法向量的方向,當y大于零的時候,敵人在我方右邊,當y小于零的時候,敵人在我方左邊。
在實際開發中,我們可以用叉乘來判斷最優轉向角,根據敵人的方位,判斷我們應該向什么方向是最快的。
3總結
簡單來說,在兩個物體的位置關系判斷中。
點乘可以判斷出目標物體在我的前方還是后方。大于零在前方,小于零在后方。
叉乘可以判斷出目標物體在我的左邊還是右邊。大于零在右方,小于零在左方。
在計算機圖形學中。
點乘可以用來計算夾角余弦值。
叉乘可以用來計算平面法向量。
總結
以上是生活随笔為你收集整理的Unity游戏开发——向量运算(点乘和叉乘)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: it方面的证书 计算机软件,计算机及IT
- 下一篇: 论文阅读:Softer-NMS: Ret