美文网首页
游戏中的数学-向量

游戏中的数学-向量

作者: JervieQin | 来源:发表于2018-05-07 20:59 被阅读0次

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

    加法:(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 , 第三维即方向,能表示物体间的左右位置关系。

    示例

    友情链接

    相关文章

      网友评论

          本文标题:游戏中的数学-向量

          本文链接:https://www.haomeiwen.com/subject/ysqbrftx.html