忙活了一个下午和晚上,终于在之前的MFC对话框工程中实现了漫游的功能,虽然只是简单的照相机前进后退左右移动的功能,虽然很多代码是网上的,但是最终把功能加到这个MFC对话框程序中了,还是可喜可贺的。主要是对opengl编程太不熟悉了,一个个小问题卡住半天的时间。
首先是定义一个工具类,比较喜欢这种编程方式,这样可以很大程度上减少耦合,修改很容易,代码也很清晰。
下面的主工具类Camera基本上是第一篇文章中的工具类,不过它的文章中的代码是基于QT的,所有有个Vector3类在MFC中找不到,所以我定义了一个和它功能相似的类。
Camera.h文件如下:
#pragma once
#include "D3Vector.h"
#include <math3d.h>
#include <gl/GLU.h>
class Camera
{
public:
Camera(void);
~Camera(void);
/* 获得摄像机状态方法 */
D3Vector getPosition() { return m_Position; }
D3Vector getView() { return m_View; }
D3Vector getUpVector() { return m_UpVector; }
float getSpeed() { return m_Speed; }
/* 设置速度 */
void setSpeed(float speed)
{
m_Speed = speed;
}
/* 设置摄像机的位置, 观察点和向上向量 */
void setCamera(float positionX, float positionY, float positionZ,
float viewX, float viewY, float viewZ,
float upVectorX, float upVectorY, float upVectorZ);
/* 旋转摄像机方向 */
void rotateView(float angle, float X, float Y, float Z);
/* 左右摄像机移动 */
void yawCamera(float speed);
/* 前后移动摄像机 */
void moveCamera(float speed);
/* 放置摄像机 */
void setLook();
/* 得到摄像机指针 */
static Camera* GetCamera(void) { return m_pCamera;}
private:
/* 摄像机属性 */
static Camera *m_pCamera; /* 当前全局摄像机指针 */
D3Vector m_Position; /* 位置 */
D3Vector