游戏中的数学-向量

首先我们来回顾一下二维向量(三维雷同)的运算公式:

加法:(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θ。

下面这张图说明的是点积返回的结果与两个向量之间夹角的关系:


游戏中的数学-向量_第1张图片
点乘结果示意图

因此游戏中多通过点乘+反余弦+弧角转换来计算两向量之间的夹角。以此来实现物体从点A向点B移动时的转向效果。

又例如:我们可以通过点乘来判断目标在不在视野内。

        Vector3 mySelf = transform.position;
        Vector3 direction = Obj.position - a;

        //假定我的视野范围是一个半圆
        if (Vector3.Dot(mySelf .normalized, direction .normalized) > 0)
            Debug.Log("目标在自己视野内");
        else
            Debug.Log("目标不在自己视野内");
游戏中的数学-向量_第2张图片
示意图.png

e.g.转向代码

游戏中的数学-向量_第3张图片
image
效果

四:叉乘

叉乘和点乘相似,但是比点乘更有用。相似之处在于:它也可以求夹角。但是叉乘的结果是一个向量而不是数。这个结果就是“法向量”,它表示的是方向。在unity中它可以算出玩家与怪物的位置关系,例如怪物在玩家的左侧。这样玩家就可以转动更小的角度。又例如,可以判断点在直线的上方还是下方,判断凹凸多边形等等。

在二维平面中:A X B = |A| * |B| *sin , 第三维即方向,能表示物体间的左右位置关系。

游戏中的数学-向量_第4张图片
示例

友情链接

你可能感兴趣的:(游戏中的数学-向量)