游戏中的数学-向量

首先我们来回顾一下二维向量(三维雷同)的运算公式:
加法:(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 , 第三维即方向,能表示物体间的左右位置关系。
游戏中的数学-向量
文章图片
示例 友情链接

    推荐阅读