用C#一步一步构建一个完整的D3D场景(二) 灵活的摄像机

在这一节我们将建立一个灵活的摄像机,有了这个摄像机,我们可以在场景内进行移动,旋转以及追踪某个物体(相当于第三人称视角)。

先定义两个枚举变量:

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值