Unity判断两个物体在XZ平面上的夹角

  • 写在前面
  • 效果展示
  • 原理讲解
  • 写在后面


写在前面

项目需要知道某个物体是不是在角色-60°到90°之间,因此要判断两个物体在XZ平面上的夹角。

效果展示

可以看到人物只有在-60°到90°之间才会转头看向Cube。而在-180°到-60°和90°到180°之间不会。

原理讲解

先附代码

Vector3 dirA = targetPosition - this.transform.position;
Vector3 dirB = this.transform.forward;
//Vector3.Project计算向量在指定轴上的投影,向量本身减去此投影向量就为在XZ平面上的向量
Vector3 dirA_XZ = dirA - Vector3.Project(dirA,Vector3.up);
Vector3 dirB_XZ = dirB - Vector3.Project(dirB,Vector3.up);
//这个方法的意图是求from向量与to向量之间的夹角,并且此夹角的大小为两者之间的锐角,所以,不管什么情况,这个函数返回的值都不可能大于180
float angle = Vector3.Angle(dirB_XZ,dirA_XZ);
//Vector3.Cross 叉乘返回为同时垂直于两个参数向量的向量,方向可朝上也可朝下,由两向量夹角的方向决定。
Vector3 ABCross = Vector3.Cross(dirB, dirA);
//判断是人物左边还是右边
float dir = (ABCross.y > 0) ? 1 : -1;
angle *= dir;

(1)首先要获得dirA人物到Cube的向量,dirB人物正前方的向量

Unity 计算两个向量夹角 unity两个向量的夹角_Unity 计算两个向量夹角


(2)用Vector3.Project函数求dirA和dirB在Vector3.up轴上的投影(即y轴的投影),然后用dirB 减去这个投影就得到了dirB在XZ平面的投影。

Unity 计算两个向量夹角 unity两个向量的夹角_unity_02


(3)用Vector3.Angle计算夹角,但这个夹角的大小为两个向量之间的锐角,所以,不管什么情况,这个函数返回的值都为0到180。所以还要判断人物在Cube的左边还是右边。

Unity 计算两个向量夹角 unity两个向量的夹角_函数返回_03


(4)用Vector3.Cross(dirB, dirA)判断左右。左手大拇指为dirB方向,中指为dirA方向,此时食指指向的方向就算Vector3.Cross返回的结果。可以看到此时食指向下,即ABCross.y肯定<0,也就代表Cube在人物的左边,因此角度为负。你把Cube放在人物右边,就ABCross.y肯定>0,则角度为正。

Unity 计算两个向量夹角 unity两个向量的夹角_Cross_04

写在后面

露西亚让我好好学Unity!!!

Unity 计算两个向量夹角 unity两个向量的夹角_Unity 计算两个向量夹角_05