这两天学习了3D图形学。独自花了2天时间设计了一个自由移动的DX9的摄像机类。下面我仔细讲述一下我的Camera类是如何完成的。
e3d_camere.h
#ifndef __e3d_camera__
#define __e3d_camera__
#include <d3dx9.h>
namespace e3d {
class Camera
{
public:
Camera(IDirect3DDevice9* Device = 0):m_right(D3DXVECTOR3(1.f, 0.f, 0.f)),
m_up(D3DXVECTOR3(0.f, 1.f, 0.f)),
m_look(D3DXVECTOR3(0.f, 0.f, 1.f)),
m_position(D3DXVECTOR3(0.f, 0.f, 0.f)),
m_aspect(800.f / 600),
m_fovY(D3DX_PI*0.25),
m_nearZ(1.f),
m_farZ(1000.f),m_view(),m_proj(),_Device(0) {
D3DXMatrixIdentity(&m_view);
_Device = Device;
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &m_position, &m_look, &m_up);
//Device->SetTransform(D3DTS_VIEW, &V);
D3DXMatrixPerspectiveFovLH(
&m_proj,
m_fovY, // 90 - degree
m_aspect,
m_nearZ,
m_farZ);
}
//设置摄像机位置
void SetPosition(float x, float y, float z) { m_position.x = x; m_position.y = y; m_position.z = z;}
void SetPositionXM(D3DXVECTOR3 pos) {m_position = pos; }
//获得摄像位置及朝向相关参数
D3DXVECTOR3 GetPosition() const { return m_position; }
D3DXVECTOR3 GetRight() const { return m_right; }
D3DXVECTOR3 GetUp() const { return m_up; }
D3DXVECTOR3 GetLook() const { return m_look; }
D3DXVECTOR3 GetPositionXM() const { return m_position; }
D3DXVECTOR3 GetRightXM() const { return m_right; }
D3DXVECTOR3 GetUpXM() const { return m_up; }
D3DXVECTOR3 GetLookXM() const { return m_look; }
//获得投影相关参数
float GetNearZ() const { return m