在这一节我们将建立一个灵活的摄像机,有了这个摄像机,我们可以在场景内进行移动,旋转以及追踪某个物体(相当于第三人称视角)。
先定义两个枚举变量:
public enum D3DAxises { Forward, Up, Right };
public enum D3DMovingMode { Flying, Translating, Tracing };
顾名思义,D3DAxises为D3D对象的三个方向,分别为向前、向上和向右,注意这三个轴是互相垂直的。D3DMovingMode是D3D对象在场景中的移动方式,分别为飞行模式、平移模式和追踪模式(英文比较烂,如果有不准确的地方请见谅),飞行模式下D3D对象可以在场景中自由移动和旋转,平移模式下D3D对象在场景中只能沿地表移动并且只能绕Up轴旋转(Up轴永远向上),追踪模式下D3D对象将按照一定的方式追随另一个D3D对象移动。说实话,我比较感兴趣的是追踪模式,想象一下一队士兵列队前进的场景......
下面定义几组常量:
public const float DefaultMoveDistance = 0.2f;
public const float DefaultRunDistance = 0.5f;
public const float DefaultRotateAngle = (float)Math.PI / 360.0f;
public static D3DMovingModes DefaultCameraMovingMode = D3DMovingModes.Translating;
public static float DefaultCameraAspectRatio = 1.0f;
public static float DefaultCameraZNearPlane = 0.1f;
public static float DefaultCameraZFarPlane = 200.0f;
public static float DefaultCameraFieldOfViewY = (float)Math.PI / 2.0f;
public static Vector3 DefaultCameraPosition = new Vector3(0.0f, 1.7f, 0.0f);
public static Vector3 DefaultCameraLookAt = new Vector3(0.0f, 1.7f, 1.0f);
public static Vector3 DefaultCameraUp = new Vector3(0.0f, 1.0f, 0.0f);
public static float DefaultCameraHightMin = 0.1f;
public static float DefaultCameraHight = 1.7f;
第一组常量分别定义的是行走时每一帧移动的距离、奔跑时每一帧移动的距离、旋转时每一帧转动的角度。
第二组常量分别定义的是摄像机的缺省模式、纵横比、能看到的最近的平面、最远的平面以及视角。
第三组常量分别定义的是摄像机的初始位置、看向的目标位置、向上的方向。
第四组变量分别定义摄像机距地面的最小高度、正常情况下摄像机距地面的高度。
我们还定义了一个用于保存D3D对象运动数据的类D3DAction,我们后面的每个可移动的D3D对象都会有这么一个Action来用于保存运动的相关数据:
public class D3DAction
{
private bool m_bMoving;//是否需要移动
private bool m_bRotating;//是否需要旋转
private D3DAxises m_MoveAxis;//沿哪个轴移动
private D3DAxises m_RotateAxis;//绕哪个轴转动
private float m_MoveDistance;//移动的距离
private float m