在某些方面,它与一般的游戏对象相似,我们可以在我们的场景中使用:它是一个转换矩阵,有一个坐标,可以使用矩阵转换函数来转换。出于这个原因,我们将实现相机类,从MatrixObjectBase中派生,命名为MatrixCameraObject。这个类是具体的(非抽象类),并可以直接使用,不必继承更远的类。相机类的坐标在类继承关系上可以在图中看到。
然而,在相机和标准游戏对象中有一些明显的不同:
1)在任何时间,游戏中仅可以只有一个活动的相机。
2)相机不会做任何绘制,虽然它们任然可以像其它任何普通游戏对象那样,更新它们的坐标。
3)相机坐标更新和应用的顺序在3D场景中是有意义的:如果它的坐标通过一组对象改变一半,这其中的一些对象将出现相对于就的相机位置,其它对于相对于新坐标位置,它能够产生非常奇怪样子的结果。
4)我们必须知道相机看到的位置,MatrixObjectBase类没有任何属性来定义它。
这些点首先要解决直接为一个相机对象添加一个详细的规定到GameHost类中。代替添加相机对象给GameObjects集合,设置相机到GameHost.Camera属性。如果相机已经被设置了,它将在每一次调用Update和Draw函数期间被处理。如果没有设置相机,没有关联相机的处理将发生。
虽然第二点是真的(相机不会绘制任何东西),我们将任然利用所有的MatrixCameraObject 类的Update和Draw方法。在Update方法中,我们可以设置相机坐标,就像我们设置普通对象的坐标那样。在Draw方法中,我们将在效果对象中申请相机坐标以便它对所有后续渲染对象是活动的。
第三点通过游戏框架是很容易解决的。它可以确定相机是最后需要更新的对象(在GameHost.UpdateAll函数)并且第一个绘制(在它的DrawObjects函数)。更新最后确保,如果相机坐标是设置在场景中的相关其它对象(我们将立刻演示),目标对象总是放置在相机前以便相机得到最新的信息。绘图第一确保相机坐标是活动的,在任何对象被渲染前。第四点解决办法是加入一个新的Vector3属性给MatrixCameraObject类,命名为LookAtTarget。这个属性可以用来指定朝向相机所聚焦的位置。
相机类默认的行为是给在通过坐标矩阵指定位置本身的坐标,在它的LookAtTarget矢量朝向指定位置。如果额外的定位逻辑活一个不同的Matrix.CreateLookAt函数调用实现是必须的,在派生类中,Update和/或Draw方法可以被覆盖,这是必须的。