在电脑游戏中一种非常常用类型的相机是追踪摄像机,一个相机在一个关键对象后跟随(通常是玩家)来提供一个第一人称或第三人称视角,让对象能够在游戏世界中看到。
我们已经有很多块来实现这类在我们自己游戏中的相机,但一点点增加游戏框架的相机类,我们可以在游戏中实施这个绝对简单的实现。
这部分工作通过这类改变并构建一个场景(有一个纸飞机穿越我们在最后工程中所创建的场景)。一旦我们有这个飞机移动(它本身将有一个有趣的任务),你将看到如何去附加相机以便它自动追逐飞机并配置一些不同的追踪相机。
添加纸飞机
纸飞机是一个非常简单的在SketchUp 中创建的3D模型。它仅包含4个三角形安排给纸飞机的基础形状。模型可以在SketchUp中,如图所示
它能定位以便它的中心点近似于原始点(0,0,0)。这定位将确保,当我们旋转它,它会围绕它的中心点旋转。
这对象仅包含平坦的三角形,所以在这个情况下我们必须确保它可以导出以便每一个三角形背部面是包括在内的。没有这一点,飞机将明显从每一个三角形顶端,当底部观察时,将完全消失。.x文件导出有一个选项来导出背部面,所以这个选项用来使用来创建模型文件。
这个飞机然后添加到游戏工程中所谓一个标准的MatrixModelObject派生类,命名为PaperPlaneObject。我们对于飞机的目标是让它在房屋中平稳的飞行,然而,我们必须添加一些额外的功能让类去实现它。
赋予飞机生命力
一些我们前一个创建对象的示例,以多种方式围绕屏幕平滑移动。然而,他们都根据应用到对象位置的速度。在这个情况下,我们将得到更好的在平面上的飞行路径,允许它跟随一系列分布在3D场景中的移动点。
这是一个非常适用的例子,但可能不是你将在游戏中使用的控制机构的种类,它将更有可能依靠用户输入来控制玩家的移动。跟随移动路径不过是有用的技巧来知道,并在游戏中有多种应用,从铁轨上的射手(玩家控制准心,武器开火,但没有直接控制它的移动)到在游戏中控制的计算机特征。
首先要做的是,我们将要做的是定义一系列点沿着飞机要跟随的移动路径。在PaperPlaneObject类的开始,他们作为一个静态的Vector3结构体数组来声明。我们也存储在数组大小来避免稍后去重新查询。下面代码中将描述。
// Points on the spline movement path static Vector3[] _movementPath = { new Vector3(-1, 1.5f, -2), new Vector3(-1.5f, 2.5f, 2), new Vector3(0, 1, 6), new Vector3(3, 0.5f, 6), new Vector3(4, 1, 2), new Vector3(0, 0.4f, 2), new Vector3(-4, 0.8f, 1), new Vector3(-5, 1.5f, 1), new Vector3(-4, 2.5f, -2), new Vector3(2, 2.0f, -4), new Vector3(4, 1.5f, -7), new Vector3(2, 1.0f, -7.2f), new Vector3(0, 0.5f, -6), }; static int _movementPathLength = _movementPath.Length;
提示:通过一个简单的反复试验的过程,这些点将会被决定。在游戏中很多这些点必须去定义一个合理的精准度,它将值得去创建简单的设计的实用程序来允许他们被定位在屏幕上,而不是通过手工输入。
现在我们要在这些点中去移动飞机,但它们之间的路径是不确定的。飞机不能简单的从一个位置跳到另一个位置,即使我们计算一个在点和移动的飞机之间的直线,它的移动将看起来有棱角和不自然。
XNA提供另一个非常有用的工具,我们可以使用来解决这个问题:一个函数来计算曲线。样条线是一条曲线,通过一系列的点,比如那些我们所定义的点。同样直接要求在移动路径上的点的位置,我们能同样要求在这些中的点,曲线将计算一个从一个点到下一个点的平滑弯曲过渡。计算的路径是理想的,是我们飞机的移动路径。
移动路径从为移动路径设置的点的曲线生成,如图所示,用相机直接在场景中向下看。飞机的图片显示在定义移动路径点的位置,这些线显示相近的曲线路径。
有不同的曲线计算函数,但其中之一我们将在XNA中调用,被称为Catmull-Rom曲线(在它创建后命名Edwin Catmull和Raphael Rom)。这是非常有用,简单使用,并确保曲线路径准确通过所有定义的位置(不是所有曲线都能做)。