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)首先要获得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平面上的夹角(图文讲解)相关推荐
- Unity 判断两物体碰撞方向
Unity 判断两物体碰撞方向 问题描述:游戏玩家可以在两个平面之间不断进行跳跃,且出现玩家顶着上面平面飞着走的情况. 问题原因:玩家碰撞体与平面不断进行碰撞体检测,导致游戏玩家可以不断进行跳跃. 解 ...
- unity判定两个物体距离
float sqrLenght = (target.position - transform.position).sqrMagnitude;//获取两个物体向量的平方长度if (sqrLenght & ...
- Unity2D判断两个物体碰撞的方向
我们要从Collision2D或者Collision2D的碰撞点,然后根据碰撞点的法线去判断是从那个方向碰撞的 private void OnCollisionEnter2D(Collision2D ...
- 点云在任意平面上获取二维投影
如有错误,恳请指出. 点云是在一个三维空间中由一堆无序的点所组成,那么在三维中理所应该可以在任意的二维平面:Ax + By + Cz + D = 0 中进行投影,获得不同平面中的二维视图.下面讲给出基 ...
- Unity判断物体相对位置
目录 一:点乘(Dot).叉乘(Cross) 1:点乘(Dot) 2:叉乘(Cross) 二:利用这个计算方位 1:点乘(Dot) 2:叉乘(Cross) 一:点乘(Dot).叉乘(Cross) 1: ...
- Unity 判断物体是否是在相机视野内
你玩吃鸡游戏有没有这样的经历,往往只有当枪在你的视野内时,才可以捡起,而如果你背对枪,就算距离很近时,也没有办法捡起.如何用Unity来实现类似的功能呢,来学习吧! Mesh Renderer: Me ...
- Unity判断一个物体是否在相机范围内
Unity判断一个物体是否在相机范围内 思路 代码 注意点 思路 先说下思路,先把物体从世界坐标转到该相机的视口坐标viewPos, 如果满足这两个条件: 0<viewPos.x < 1 ...
- 如何判断两个平面相交_初一数学下册预习第五章 相交线与平行线上
初一数学下册预习第五章 相交线与平行线上 平面内,点与直线之间的位置关系分为两种:① 点在线上 ② 点在线外同一平面内,两条或多条不重合的直线之间的位置关系只有两种:① 相交 ② 平 ...
- MATLAB_平面几何_判断两平面矩形是否干涉
1 原理 在其中一个矩形上建立局部坐标系,并计算出不干涉边界上8个顶点在局部坐标系下的坐标.再将另一个矩形形心的坐标换算到局部坐标系下,判断该形心是否在不干涉边界内.若形心落在不干涉边界内部,则两平面 ...
- Unity:计算两个物体(没有父子关系)的相对坐标
Unity:计算两个物体(没有父子关系)的相对坐标 问题描述 实现方法 实现原理 参考链接 问题描述 计算Unity场景中物体B在物体A坐标系下的坐标,且两物体没有父子关系 实现方法 计算一个物体A的 ...
最新文章
- 自动化学习的正确姿势
- hdu 2154 跳舞毯 (DP)
- 模拟简单计算器及比较大小
- MATLAB对字符串进行分割
- 世界地板大会姚红鹏的三问
- PCA的数学原理(非常值得阅读)!!!!
- ElasticSearch学习,请先看这一篇(win_Elasticsearch)
- python语言中的数据类型之字典
- 【React 基础】之 React 面向组件编程
- yyyy-mm-dd hh-mm--ss
- 你踩过dataguard的哪些坑?
- (三)映射对象标识符(OID)
- vs code html插件_VS插件CodeRush全新发布v20.1.7|支持HTML
- jQuery节点创建与属性的处理 创建节点
- html前端页面的字体大小,JQuery 改变页面字体大小的实现代码(实时改变网页字体大小)...
- Web前端低代码介绍的ppt大纲
- java开发一个简单的通讯录
- 学如逆水行舟,不进则退。
- 问题 C: 旅行者的背包
- 今天给在家介绍一篇基于jsp的旅游网站设计与实现