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人物正前方的向量

(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!!!

Unity判断两个物体在XZ平面上的夹角(图文讲解)相关推荐

  1. Unity 判断两物体碰撞方向

    Unity 判断两物体碰撞方向 问题描述:游戏玩家可以在两个平面之间不断进行跳跃,且出现玩家顶着上面平面飞着走的情况. 问题原因:玩家碰撞体与平面不断进行碰撞体检测,导致游戏玩家可以不断进行跳跃. 解 ...

  2. unity判定两个物体距离

    float sqrLenght = (target.position - transform.position).sqrMagnitude;//获取两个物体向量的平方长度if (sqrLenght & ...

  3. Unity2D判断两个物体碰撞的方向

    我们要从Collision2D或者Collision2D的碰撞点,然后根据碰撞点的法线去判断是从那个方向碰撞的 private void OnCollisionEnter2D(Collision2D ...

  4. 点云在任意平面上获取二维投影

    如有错误,恳请指出. 点云是在一个三维空间中由一堆无序的点所组成,那么在三维中理所应该可以在任意的二维平面:Ax + By + Cz + D = 0 中进行投影,获得不同平面中的二维视图.下面讲给出基 ...

  5. Unity判断物体相对位置

    目录 一:点乘(Dot).叉乘(Cross) 1:点乘(Dot) 2:叉乘(Cross) 二:利用这个计算方位 1:点乘(Dot) 2:叉乘(Cross) 一:点乘(Dot).叉乘(Cross) 1: ...

  6. Unity 判断物体是否是在相机视野内

    你玩吃鸡游戏有没有这样的经历,往往只有当枪在你的视野内时,才可以捡起,而如果你背对枪,就算距离很近时,也没有办法捡起.如何用Unity来实现类似的功能呢,来学习吧! Mesh Renderer: Me ...

  7. Unity判断一个物体是否在相机范围内

    Unity判断一个物体是否在相机范围内 思路 代码 注意点 思路 先说下思路,先把物体从世界坐标转到该相机的视口坐标viewPos, 如果满足这两个条件: 0<viewPos.x < 1 ...

  8. 如何判断两个平面相交_初一数学下册预习第五章 相交线与平行线上

    初一数学下册预习第五章    相交线与平行线上 平面内,点与直线之间的位置关系分为两种:① 点在线上    ② 点在线外同一平面内,两条或多条不重合的直线之间的位置关系只有两种:① 相交    ② 平 ...

  9. MATLAB_平面几何_判断两平面矩形是否干涉

    1 原理 在其中一个矩形上建立局部坐标系,并计算出不干涉边界上8个顶点在局部坐标系下的坐标.再将另一个矩形形心的坐标换算到局部坐标系下,判断该形心是否在不干涉边界内.若形心落在不干涉边界内部,则两平面 ...

  10. Unity:计算两个物体(没有父子关系)的相对坐标

    Unity:计算两个物体(没有父子关系)的相对坐标 问题描述 实现方法 实现原理 参考链接 问题描述 计算Unity场景中物体B在物体A坐标系下的坐标,且两物体没有父子关系 实现方法 计算一个物体A的 ...

最新文章

  1. 自动化学习的正确姿势
  2. hdu 2154 跳舞毯 (DP)
  3. 模拟简单计算器及比较大小
  4. MATLAB对字符串进行分割
  5. 世界地板大会姚红鹏的三问
  6. PCA的数学原理(非常值得阅读)!!!!
  7. ElasticSearch学习,请先看这一篇(win_Elasticsearch)
  8. python语言中的数据类型之字典
  9. 【React 基础】之 React 面向组件编程
  10. yyyy-mm-dd hh-mm--ss
  11. 你踩过dataguard的哪些坑?
  12. (三)映射对象标识符(OID)
  13. vs code html插件_VS插件CodeRush全新发布v20.1.7|支持HTML
  14. jQuery节点创建与属性的处理 创建节点
  15. html前端页面的字体大小,JQuery 改变页面字体大小的实现代码(实时改变网页字体大小)...
  16. Web前端低代码介绍的ppt大纲
  17. java开发一个简单的通讯录
  18. 学如逆水行舟,不进则退。
  19. 问题 C: 旅行者的背包
  20. 今天给在家介绍一篇基于jsp的旅游网站设计与实现

热门文章

  1. Java中ElasticSearch的各种查询(普通,模糊,前缀,高亮,聚合,范围)
  2. win10计算机无动作后锁屏,怎么让win10不锁屏_让win10不锁屏的操作方法
  3. java bitset javadoc_Java数据结构: java.util.BitSet源码学习
  4. php 冷门与常用函数
  5. Activity工作流
  6. 端口映射不能访问80端口
  7. 轻松访问Google Chrome浏览器中的浏览历史记录
  8. 网易云音乐歌词python
  9. html教程:网页字体的设置
  10. 扒一扒那些叫欧拉的定理们(五)——平面几何欧拉定理的证明