频道栏目
  • 8.2.1 向量的定义
  • 在游戏编程中,向量用于操作和描述3D游戏世界。向量的数学定义是既有大小又有方向的量。大小就是向量的长度。

    游戏编程中最常用的向量是2D、3D和4D向量。在使用投影矩阵将顶点从3D转换到2D空间时,会用到4D向量。纸面上看起来,向量和位置很类似。位置[0,3,0]和向量[0,3,0]有相同的内部值,但是它们代表不同的概念。位置使用坐标系统定义世界中的一个绝对位置。向量描述一个方向(在这里为向上)和大小或者说长度(在这里为3)。图8-3比较了两者的不同。例如,“离地面3英里”不是一个位置,而是使用位置和长度描述了一个位置,换句话说,它是一个向量。

    在游戏编程中,向量用于回答如下问题:

    ● 敌人的飞船位于[0,0,90],玩家的飞船位于[0,80,-50]。敌人应该向哪个位置发射导弹?在每一帧中,如何更新导弹的位置,使其朝向玩家不断移动?

    ● 玩家与导弹的位置小于1m吗?

    ● 玩家在墙的哪一边?

    ● 玩家在看NPC吗?

    ● 给定一个表示枪的后部的四方形,子弹将向哪个方向飞出?

    ● 光应该如何从这个表面反射出去?

    ● 把汽车向前移动3m。

    ● 玩家击中了一个敌人,敌人应该向哪个方向运动?

    ● 如何将子弹的动力增加100?

    ● 哪个玩家最接近外星人的飞船?

     


    为了回答这些问题,需要扩展向量类,在其中添加基本的向量方法。本章中的示例将以前面章节中的代码为基础。其中的大多数示例都要求创建一个新的游戏状态,并使其成为活动的状态以测试代码。本章所有的示例代码都可以从本书配套光盘中的Code\Chapter 8目录中找到。下面的小节将解释各种向量操作,并列出完成向量类所需添加的代码。游戏引擎中有时候会有Vector2d、Vector3d和Vector4d,但是在这里只创建一个向量结构会更加简单一些,这个向量仍然可以用于任意的2D操作。本书中的内容不会涉及4D向量。

    [StructLayout(LayoutKind.Sequential)]

    public struct Vector

    {

    public double X { get; set; }

    public double Y { get; set; }

    public double Z { get; set; }

    public Vector(double x, double y, double z) : this()

    {

    X = x;

    Y = y;

    Z = z;

    }

    }


本书试读章节

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站