游戏中的数学-向量
首先我们来回顾一下二维向量(三维雷同)的运算公式:
加法:(x1,y1)+(x2,y2) = (x1+x2,y1+y2)
减法:(x1,y1) - (x2,y2) = (x1-x2,y1-y2)
点乘:(x1,y1)(x2,y2) = x1x2+y1*y2
叉乘:(x1,y1)X(x2,y2) = x1y2-x2y1
一:加法
【游戏中的数学-向量】向量加法满足平行四边形法则,即相加后的向量等于对角线向量。在unity中最常见的用法例如物体的移动(另外还可以使用Translate)。拿炮弹做例子,我们看看向量在游戏中的运用。
e.g.简单移动
transform.position += Vector3.one*Time.deltatime;
e.g.描述速度:初始点是原点,速度向量是velocity (50,0,0),这样,每隔一段时间就要更新物体的坐标。
transform.position +=velocity * Time.deltatime;
二:减法
向量的减法满足三角形法则,即相减后的向量就是两向量围成三角的第三边,方向指向被减向量。在unity中最常见的用于获取方向、向量长度等。
e.g.让对象向目标直线移动
Vector3 direction = (Position1 - Position2).normalized;
//获取方向向量
if (transform.position != end)
transform.Translate(direction*0.2f*Time.deltaTime);
//沿一个方向直线移动
再拿炮弹打比方:炮弹在移动过程中,收到的各种阻力,推力,都能改变它的移动方向,这里就涉及到了向量的一些基本操作。
接下来重点讲一下向量的点乘和叉乘。
三:点乘
点乘也叫数量积,求出来的是一个数 ( 还记得高中数学中求两个向量是否为直角就是看他点乘结果是否为0) 。向量点乘还有一个比较重要的公式是:A * B = |A||B|cosθ。
下面这张图说明的是点积返回的结果与两个向量之间夹角的关系:
文章图片
点乘结果示意图 因此游戏中多通过点乘+反余弦+弧角转换来计算两向量之间的夹角。以此来实现物体从点A向点B移动时的转向效果。
又例如:我们可以通过点乘来判断目标在不在视野内。
Vector3 mySelf = transform.position;
Vector3 direction = Obj.position - a;
//假定我的视野范围是一个半圆
if (Vector3.Dot(mySelf .normalized, direction .normalized) > 0)
Debug.Log("目标在自己视野内");
else
Debug.Log("目标不在自己视野内");
文章图片
示意图.png e.g.转向代码
文章图片
image 效果 四:叉乘
叉乘和点乘相似,但是比点乘更有用。相似之处在于:它也可以求夹角。但是叉乘的结果是一个向量而不是数。这个结果就是“法向量”,它表示的是方向。在unity中它可以算出玩家与怪物的位置关系,例如怪物在玩家的左侧。这样玩家就可以转动更小的角度。又例如,可以判断点在直线的上方还是下方,判断凹凸多边形等等。
在二维平面中:A X B = |A| * |B| *sin , 第三维即方向,能表示物体间的左右位置关系。
文章图片
示例 友情链接
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 游戏IP(立足于玩家情感的粉丝经济)
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗