图形引擎(四):创建自定义的Camera
上一篇文章中,已经讨论了如何在应用程序中添加组件,并完成了对输入设备如键盘和鼠标的响应操作,本篇文章中将讲解如何使用鼠标和键盘控制场景。任何一个3D场景中都需要使用一个虚拟Camera用于显示,根据Camera的坐标位置和观察方向的不同,可以观察场景的不同角度。为此,我们将会创建一个基础的Camera类,包含了Camera的基础功能属性,然后在此基础上完成一个第一人称的First-Person Camera类。作为练习,在创建一个类似于NVIDIA FX Composer中的Orbit Camera。
关于Camera基类,以及FirstPersonCamera类的详细讲解,
请查看另一篇博客。在这里,重点讲解如何创建一个Orbit Camera。
Orbit Camera
Orbit Camera是指Camera围绕某个坐标轴,沿着对应的轨道运行,并保持观察方向指向世界坐标空间的原点。具体地说,就是在世界坐标空间中,以原点为中心,Camera与中心的距离作为半径,然后围绕与camera的Right或Up方向平行的轴进行旋转,旋转所经过的路径就是运行的轨道。
在第一人称Camera中,已经计算了俯仰和偏航,详见
http://blog.csdn.net/chenjinxian_3d/article/details/51946202。俯仰是指Camera围绕Right方向轴旋转一定的角度,而偏航是围绕Up方向轴旋转一定的角度。在些基础上,可以把俯仰的角度作为Orbit Camera围绕世界坐标空间与Camera的Right方向平行的轴的旋转角度,把偏航的角度作为Orbit Camera围绕世界坐标空间与Camera的Up方向平行的轴的旋转角度。因此Orbit Camera围绕轨道运行一定角度后的坐标位置就可以通过把Camera的Postion与旋转矩阵相乘得到。由于Camera的坐标位置改变后,Camera的观察方向需要保持指向世界坐标空间的原点,因此在第一人称Camera中执行的旋转操作在Orbit Camera仍然需要。
Orbit Camera的代码如下
#pragma once
#include "Camera.h"
namespace Library
{
class Keyboard;
class Mouse;
class OrbitCamera : public Camera
{
RTTI_DECLARATIONS(OrbitCamera, Camera)
public:
OrbitCamera(Game& game);
OrbitCamera(Game& game, float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance);
virtual ~OrbitCamera();
const Keyboard& GetKeyboard() const;
void SetKeyboard(Keyboard& keyboard);
const Mouse& GetMouse() const;
void SetMouse(Mouse& mouse);
float& MouseSensitivity();
float& RotationRate();
float& MovementRate();
virtual void Initialize() override;
virtual void Update(const GameTime& gameTime) override;
static const float DefaultMouseSensitivity;
static const float DefaultRotationRate;
static const float DefaultMovementRate;
protected:
float mMouseSensitivity;
float mRotationRate;
float mMovementRate;
Keyboard* mKeyboard;
Mouse* mMouse;
private:
OrbitCamera(const OrbitCamera& rhs);
OrbitCamera& operator=(const OrbitCamera& rhs);
};
}
#include "OrbitCamera.h"
#include "Game.h"
#include "GameTime.h"
#include "Keyboard.h"
#include &#