图形引擎(四):创建自定义的Camera

图形引擎(四):创建自定义的Camera上一篇文章中,已经讨论了如何在应用程序中添加组件,并完成了对输入设备如键盘和鼠标的响应操作,本篇文章中将讲解如何使用鼠标和键盘控制场景。任何一个3D场景中都需要使用一个虚拟Camera用于显示,根据Camera的坐标位置和观察方向的不同,可以观察场景的不同角度。为此,我们将会创建一个基础的Camera类,包含了Camera的基础功能属性,然后在此基础
摘要由CSDN通过智能技术生成

图形引擎(四):创建自定义的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 &#
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值