天天看點

unity3d Vector3.Dot Cross Angle 用法記錄

今天為一個角度問題找了很多算法用法資料。結果發現網上幾乎全來自一個源頭。都是一樣的。真的是文章一大抄!操!

找到一篇寫得比較實用,正确的:

藍色問題是我補充的用法

1.已知兩個向量dirA,dirB。

Vector3 dirA = new Vector3(-1,1,0);

Vector3 dirB = new Vector3(-1,1,1);

2.使向量處于同一個平面,這裡平面為XZ

dirA = dirA - Vector3.Project(dirA,Vecotr3.up);

dirB = dirB - Vector3.Project(dirB,Vecotr3.up);

注:Vector3.Project計算向量在指定軸上的投影,向量本身減去此投影向量就為在平面上的向量

3.計算角度

float angle = Vector3.Angle(dirA,dirB);

Vector3 pv =head.forward- Vector3.Project(head.forward,Vector3.up);

float ang = Vector3.Angle(enemy.transform.position-transform.position,pv);//head.forward);

上面先是用Project方法投影到平面,然後計算角度,得到的是一個平面上的夾角。我是在計算兩人個拳手的相對角度,必須讓他們面對面,動作才能準。這第一個參數用的是目标坐标減角色坐标。這也是很多網上資料寫得含糊不清的地方(如果數學好,還需要找資料嗎。很多隻解釋數學原理的我先BS一下)

4.計算方向

float dir = (Vector3.Dot (Vector3.up, Vector3.Cross (dirA, dirB)) < 0 ? -1 : 1);

angle *= dir;

Vector3.Cross 叉乘傳回為同時垂直于兩個參數向量的向量,方向可朝上也可朝下,由兩向量夾角的方向決定。

Cross最主要的用處就是可以确定目标在你的左邊還是右邊,這樣你就可以根據上面的 Angle方法獲得的角度(這是個無方向的角度內插補點)來算要旋轉的角度(是正向還是反向)。

float lr = Vector3.Cross(head.forward, enemy.position-transform.position).y;

這裡的head是角色頭部,這是計算角色面向的方向與敵人目标的點的角度差,也就是正對到目标需要左轉還是右轉。 lr為正或負來确定向哪邊轉。

Vector3.Dot 點乘意義為兩參數向量方向完全相同傳回1,完全相反傳回-1,垂直傳回0。當兩向量角度減小,将得到更大的值。

這個方法是最早了解清楚的一個方法,簡單說就是可以計算出兩個目标的相對方向 (是面對還是背對,産生的值是一個-1到1的值。1表示面對,-1就是北對。值越接近1表示面對或背對的角度越正。

----------------------------------------

最後再BS一下一些轉别人文章都不看正确錯誤的人,這樣會誤導很多人。

繼續閱讀