人工智能:矢量数学和运动物理学

学习人工智能,矢量数学和运动物理学的特性必须熟悉
人工智能体的设计离不开矢量数学和运动物理学方面的知识

矢量数学:

设计游戏的人工智能时常用到矢量数学。从计算一个游戏智能体射击的方向到表达一个神经网络的输入输出,矢量无处不在。

简要介绍一些矢量数学需要掌握的知识:

笛卡尔坐标系,二维空间xy平面描述物体的位置
三维空间增加z轴,xyz构成三维坐标系统

一维空间是指只由一条线内的点所组成的空间,它只有长度,没有宽度和高度,只能向两边无限延展。一维实际是指的是一条线,在理解上即为左-右一个方向(如:时间),也可理解为点动成线,指没有面积与体积的物体。直线上有无数个点,实际上就是一维空间。
一维空间里如果有“人”,那他们的形象就是直线上方的一个点。其实,点也是一维空间,不过这个一维空间是无限小的

函数和方程

三角学

使用Vector2D结构,可以进行矢量操作
列出声明的主要部分:

struct Vector2D
{
    double x;
    double y;
    Vector2D():x(0.0),y(0.0){}
    inline void Zero();//置x,y为0
    inline bool isZero()const;//如果xy都为0,返回TRUE
    inline double Length()const;//返回矢量的长度
    inline double LengthSq()const;//返回矢量长度的平方(可以避免开方运算)
    inline void Normalize();
    inline double Dot(const Vector2D& v2)const;//返回this和v2的点乘值
    inline int Sign(const Vector2D& v2)const;//如果v2在this矢量的顺时针方向就返回正值
                                             //如果在逆时针方向返回负值(假设Y轴的箭头指向下面的,X轴指向右边就像一个窗口应用)
    inline Vector2D Perp()const;//返回与this矢量正交的矢量
    inline void Truncate(double max);//调整x和y使矢量的长度不会超过最大值
    inline double Distance(const Vector2D &v2)const;//返回this矢量与一个被作为参数被传递的矢量之间的距离
    inline double DistanceSq(const Vector2D &v2)const;//矢量间距离的平方
    inline Vector2D GetReverse()const;//返回与this矢量相反的矢量
    //需要的一些操作
    const Vector2D& operator+=(const Vector2D &rhs);
    const Vector2D& operator-=(const Vector2D &rhs);
    const Vector2D& operator*=(const Vector2D &rhs);
    const Vector2D& operator/=(const Vector2D &rhs);
    bool operator == (const Vector2D& rhs)const;
    bool operator != (const Vector2D& rhs)const;
};  

局部空间:用来描述对象相对于指定实体的局部坐标系统的位置和方向。

世界空间:代表的就是你在屏幕上看到的渲染的东西,每个对象用世界坐标系统的相对于原点的位置和方向来定义。

我们可以使用局部坐标系来变换世界坐标系,这样在世界坐标系中的所有对象都可以用相对于它的位置和方向来描述,就像通过实体的眼睛来观看世界。
例如:当士兵们用像“目标在正前方50M处”的话来描述一个物体时,他们使用的是局部空间。他们根据目标相对于自己的位置和朝向来描述目标的位置。

运动物理学:

定义:质量和能量以及他们之间相互作用的科学

游戏人工智能常常会运用物理定律进行工作,特别是与运动有关的物理定律。
例如:创建算法预测未来某时智能体将在何处;计算武器发射最佳角度;智能体应该采用什么方向和力度传球给一个接球者

时间、距离、质量
位置(采用物体质量的中心,即质心)
速度(m/s)
加速度(m/s2)

创建汽车类:

class Vehicle
{
    //在空间中用一个矢量表示车的位置
    vector m_Position;
    //一个矢量表示车的速度
    vector m_vVelocity;
    public:
    //调用每一帧更新车的位置
    void Update(float TimeElapsedSinceLastUpdate)
    {
        m_Position += m_vVelocity * TimeElapsedSinceLastUpdate;
    }
};

数学和物理学方面的知识,是学习好人工智能的基础。确实,我们都可以用“复制和粘贴”的方式使用许多人工智能技术,但是对于自身发展是毫无益处。一旦不得不解决的问题与借来的代码之间有微小的差别,将陷入困境。如果理解技术背后的理论,通晓自己所使用的工具,将是一件多么令人兴奋的事情。

起航,学习人工智能在游戏方向的应用…

猜你喜欢

转载自blog.csdn.net/gaoyz1/article/details/79049007