虽然我们有一个清晰地良好的控制相机,简单的通过设置它的位置和LookAtTarget,这里有另一个相机定位机制,我们可以利用它将在一些状况中提供一个更简单的方法来将相机放到我们想它放置的地点。这个机制就是使用我们已经为我们的游戏对象所使用的矩阵转换方法。
如果我们使用矩阵转换,我们可以再一次提供一系列操作,相机将坚持决定它的最终位置。举例,我们可以在场景中决定去转换相机到一个不同的位置,围绕y轴预先的角度,旋转相机的矩阵,随着旋转角度的改变,相机将围绕着在首先转换的定义的坐标旋转。在相机的循环路径上,这是计算方法要比使用三角法去计算更简单, 如果我们简单的设置它坐标矢量。
下面代码显示了一个使用技巧降低派生相机类的Update方法来定位相机的示例。它首先旋转相机;然后沿它的新的z坐标轴和y坐标轴转换。最终结果是相机逐步围绕这个场景。
// Reset the position using the identity matrix SetIdentity(); // Rotate the camera ApplyTransformation(Matrix.CreateRotationY(AngleY)); // Translate the camera away from the origin ApplyTransformation(Matrix.CreateTranslation(0, 5, -14));
这种比较方法,在下面代码,它产生完全正确的相同相机移动,但使用三角法来代替矩阵转换。
// Reset the position using the identity matrix SetIdentity(); // Calculate the camera position Position = new Vector3((float)Math.Sin(AngleY) * 14,5, (float)Math.Cos(AngleY) * 14); // Apply the standard transformations to the object ApplyStandardTransformations();
相机对象的作用
伴随着这个章节是一个名叫CameraMovement的示例工程,它提供一个简单的在游戏中使用相机的示例。
它创建了一个简单的场景,包含一个广场,在其上面放置了一些房屋。然后相机围绕着场景旋转,允许它从不同角度看。除了相机以外,在场景中的所有对象是完全固定的。为了让场景在显示上更适合点,这个工程已使用支持屏幕横向来实现,所以你将必须去旋转你的设备或者相应的模拟器。一个工程效果图片如图所示。
工程的ResetGame函数为地面和房屋添加对象到GameObjects集合中,然后创建相机对象,并设置到相机属性中。
使用一个自定义的命名为CameraObject的派生类来实现相机对象,为了围绕场景来移动相机。在它的Update函数中,你将看到2个不同的为了定位相机的代码块:1个使用矩阵转换,另一个直接设置坐标属性。这其中之一最初就被注释掉了,但尝试去掉注释,运行下2个方法来研究下,看下它们是如何工作的。
你可以同样尝试使用LookAtTarget属性来研究,以便随着它围绕场景移动时,相机在不同方向看起来不同。