首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
2013
01-29

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)

写在前面的话,前两天有个朋友在QQ上问我 如何获取主角面朝方向一定区域中的敌人对象。这个命题看似简单,其实里面蕴含了很多数学方面的东西。今天刚好有时间我就彻底的把这个疑问写在博客中。希望可以帮助到他。

在上代码之前请大家跟我先做几个简单的练习题,角度向量的计算一定要学会,不然后面的东西会很难懂。

1.已知3D坐标,和一个旋转角度,以及一段距离,求目标点的3D坐标。

已知当前点为Target,目标点沿着Target的Y轴旋转30度,沿着Target的X轴延伸10米求目标点的3D坐标?

 输出结果 :新坐标 (8.7, 0.0, -5.0) 当前坐标 (0.0, 0.0, 0.0)两点之间的距离 10。

 2.已知3D模型的角度求它的向量。

已知3D模型Target,Y轴旋转30度后向前平移。

 3.已知一个目标点,让模型朝着这个目标点移动。

这是一个比较简单的例子,大家应该都能看明白。

这里我要说的就是Vector3.forward ,它等价与 new Vector3(0,0,1);它并不是一个坐标,它是一个标准向量,方向是沿着Z轴向前。这样平移一次的距离就是1米, 如果Vector3.forward * 100那么一次平移的距离就是100米。 

在看看下面这段代码

 用向量减去一个向量求出它们的差值,normalized 是格式化向量,意思是把它们之间向量格式化到1米内。这样就可以更加精确的计算一次平移的距离了 vecn *0.1f 就标示一次平移1分米,蛤蛤。

 向量不仅可以进行X Y Z轴的移动,同样可以进行旋转 ,下面这段代码就是让向量沿着Y轴旋转30度。

 

如果上述三道简单的练习题 你都能了然于心的话,那么本文最大的难题我相信也不会是什么难事,继续阅读吧。

假设我们需要计算主角面前5米内所有的对象时。以主角为圆心计算面前5米外的一个点,为了让大家看清楚我现将这条线绘制出来。

 

如下图所,我们已经将这两个点计算出来了。此时你可以动态的编辑主角Y轴的坐标,这个点永远都是沿着主角当前角度面前5米以外的点。

 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 1

 

 

接下来,我们需要计算主角面前的一个发散性的角度。假设主角看到的是向左30度,向右30度在这个区域。

 

 

如下图所示,这时主角面前的区域就计算出来了。看起来就是两个三角形之间的区域。

 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 2

 

 

最后就是简单的套用公式,计算一个点是否在三角形内,在本文中就是计算敌人的点是否在面前的这两个三角形内。

如下图所示,如果箱子对象是主角的视野中就会检测到。 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 3

 

 

注意,上图中我的视野选择了两个三角形,如果你需要视野目标点是椭圆形的话,那么可以多设置一些三角形。但是这样就会非常消耗效率,我觉得这里完全可以使用1个三角形,,只是正对的目标点会出现一些偏差,影响其实并不会很大。如下图所示

 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 4

代码简单的修改一下即可。

 

上面我们介绍了三角形判断,当然也可以通过矩形来判断是否相交。。

 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 5

 

代码:

 

如果大家看了这篇文章后发现在你的项目中还有一些比较麻烦的角度与向量的算法,欢迎在下面留言给我,如果我有时间我会第一时间把方法贴在博客中。互相学习互相进步,加油!哇咔咔。。

马上过年了,雨松MOMO在这里祝福大家2013年幸幸福福的过日子,嘿嘿。

 

2013年4月补充

感谢楼下朋友给我的留言。, 我在补充一下这篇博客。

 

 

Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五) - 雨松MOMO程序研究院 - 6

这里我以角色左右个30度。 这样就可以根据两个模型的距离以及角度来判断了。。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 直接这样:(判定扇形30度)
    float Distance = Vector3.Distance(transform.position,targetPos.position);
    Vector3 p2 = (transform.position + transform.rotation * Vector3.forward).normalized;
    Vector3 ver3 = (targetPos.position – transform.position).normalized;
    if (Distance 0.867) {
    return true;
    }
    return false;

  2. var relativePos =starttranform.position-target.position;
    var rotation = Quaternion.LookRotation(relativePos);
    allcamera.transform.rotation=rotation;
    allcamera.transform.position=startpostion;
    鱼松大大我这里有一段代码 就是移动摄像机并转动方向后我想复原摄像机的位置结果发现代码还是角度有点偏移 是我的计算有问题么

  3. 额,这。。。。。想多了吧

    一个点是否在扇面上貌似只需要判定 目标点与原点的距离是否大于半径&&目标点与原点朝向的角度在扇形角度中 就可以了

    第一步:以玩家为原点向玩家朝向给定一个已知距离的向量
    第二步:给定扇形角度,已第一步得到的向量作为中分轴
    第三步:求目标点与角色的距离得到向量并判定距离是否大于半径
    第四部:由第一步和第三步的向量得到角度 Vector3.Angle()
    第五步:判定角度绝对值是否大于第二步规定的扇形角度。
    如果第三步和第五步都满足,就是在咯。

    不知道看明白没有。。代码好像写几行就可以了。。。而且不是三角形哟!!!!

  4. 我想问下如果做成三圆形的视野面积环绕主角的话该如何计算?我做了若干个点燃后连接所有的点一起,作的点越多就越像是圆,所有的点都加在一个list里了这个时候想测试该怎么办?用for loop直接一个个算过来么

    • 我试了下,貌似可以,不过很奇怪,drawline画起来很完美没有错,计算就出错了…void StartSearching(){ find = false; Vector3 point = target.position; for (int i=0; i

  5. 1.建议代码里面加点注释,比如triangleArea(float v0x,float v0y,float v1x,float v1y,float v2x,float v2y) 这个方法的2.建议可以在图中标一下Vector3 f0 = (transform.position + (r *Vector3.forward) * distance); Vector3 f1 = (transform.position + (r0 *Vector3.forward) * distance); Vector3 f2 = (transform.position + (r1 *Vector3.forward) * distance);比如说f0,f1,f2可以在图中标出来

  6. 看完那本书,想开发游戏简直是做梦(就是小学水平),我扔了。那本书的深度还不如他写的博客。现在我去Unity Asset Store买源码,直接看别人写的。

  7. 用坐标判断有一点不好,忽略了体积因素,如果我体积很大,虽然大半个屁股都在你的剑气里面,但是我中心点不在,就被判定为打不到

  8. Pingback: コーチ メンズ

  9. Pingback: オークリー サングラス

  10. Pingback: コーチ メンズ

  11. Pingback: レイバン メガネ

  12. Pingback: オークリー メガネ

  13. Pingback: maillot de foot

  14. Pingback: LxmVLShF

    • 其实MOMO的博客应该是针对主角的视角进行设计的,而你说的碰撞器针对与一个物体来说,更好一点,毕竟人的视线是单方向的

  15. Pingback: air max bw

  16. Pingback: 雷典易玄

  17. 这个方法貌似要算4-8次三角形的面积,感觉有点消耗。为什么不直接算角度?然后判断距离,得出来的结果是扇形区域,更精确一点。

  18. 要过年了,向雨松、小马以及研究院所有的斑竹拜年了,祝愿在新的一年,再接再厉,写出更好的文章,带领大家学习新的技术

  19. 其实这个也可以用在动态加载里边的,控制主角的视角为100°;然后给他加载的视角为150°,当然是在第一视角内。。。但是这个还是有点问题的。。。
    雨松大大啊,啥时候出个使用内存小点的动态加载的Demo啊。。。。我这很是嫉妒啊,别人问你了你就写了博文了。。。。我问你了。。。你还不写博文。。。。。。

  20. 雨松大哥,一个场景最多可以容纳多少个面呢,还是说,这个额度只和摄像机的视野有关系,如果是的话,那可以容纳多少个面呢??