• Unity判断两个物体在XZ平面上的夹角(战双露西亚图文讲解)


    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (1)首先要获得dirA人物到Cube的向量,dirB人物正前方的向量
    在这里插入图片描述
    (2)用Vector3.Project函数求dirA和dirB在Vector3.up轴上的投影(即y轴的投影),然后用dirB 减去这个投影就得到了dirB在XZ平面的投影。
    在这里插入图片描述
    (3)用Vector3.Angle计算夹角,但这个夹角的大小为两个向量之间的锐角,所以,不管什么情况,这个函数返回的值都为0到180。所以还要判断人物在Cube的左边还是右边。
    在这里插入图片描述
    (4)用Vector3.Cross(dirB, dirA)判断左右。左手大拇指为dirB方向,中指为dirA方向,此时食指指向的方向就算Vector3.Cross返回的结果。可以看到此时食指向下,即ABCross.y肯定<0,也就代表Cube在人物的左边,因此角度为负。你把Cube放在人物右边,就ABCross.y肯定>0,则角度为正。
    在这里插入图片描述

    写在后面

    露西亚让我好好学Unity!!!
    在这里插入图片描述

  • 相关阅读:
    从 AI 代码生成模型到 AI 编程助手应用实战
    通达信软件编程写一段抄底的源代码
    实现java项目idea打包发布至服务器(完整版)
    pthread_detach函数的应用
    成都建筑模板批发市场在哪?
    算法之旅(相交链表160)
    Python ArcPy批量拼接长时间序列栅格图像
    自适应模糊神经网络与bp神经网络的区别
    pytho-numpy-数组切片存取元素
    数据结构(二):括号匹配(C++,栈)
  • 原文地址:https://blog.csdn.net/iiiiiiimp/article/details/126452766