说明:
最近接到一个需求,在一个雷达界面(扇形UI)的界面上显示出三维场景中真实的物体显示情况,我的思路就是一个三维场景某物体的位置映射到二维UI界面上。
实现思路:
-
物体到扇形原点的距离需要小于扇形半径的距离,否则就不在扇形范围内
-
物体与扇形原点的向量与扇形圆心的正方向向量的夹角要小于规定夹角的二分之一
满足以上两点就满足当前的物体在扇形范围内 -
使用向量的叉乘判断物体在扇形圆心的左侧还是右侧
-
三维扇形需要对应在UI扇形上将计算的角度和相对半径计算好
满足以上两点满足三维扇形和UI扇形映射关系就计算好了
代码如下:
void Sector()
{
Vector3 playerPos=this.transform.position;
Vector3 enemyPos=enemy_Obj1.transform.position;
float distance=Vector3.Distance(playerPos,enemyPos);
//玩家相对于目标的向量
Vector3 srcLocalVect = enemyPos - playerPos;
srcLocalVect.y = 0;
//获取主角正前方的一个点
Vector3 forwardPlayerPos =transform.forward + playerPos;
//获取正方向向量
Vector3 forwardVect = forwardPlayerPos - playerPos;
forwardPlayerPos.y = 0;
//计算角度
float angle = Vector3.Angle(srcLocalVect, forwardVect);
//Debug.Log("当前的值为:"+ Vector3.Cross(playerPos, enemyPos));
if (distance<minDis&&angle<minAngle/2)
{
if (Vector3.Cross(playerPos,enemyPos).y>0)
{
angle *= -1;
}
float x = UICenterPos.localPosition.x + radius * radiusScale * Mathf.Sin(angle * 3.14f / 180f);
float y = UICenterPos.localPosition.y + radius * radiusScale * Mathf.Cos(angle * 3.14f / 180f);
radarTarget_TF.localPosition = new Vector3(x, y, 0);
}
}