一个精致的camera类,我喜欢它。

原创 2006年06月14日 18:16:00

        在看Introduction to 3D Game Programming with DirectX 9.0的代码时,发现了一个camera类,感觉简单实用,思路清晰。它很容易扩展,做到了与具体的输入设备无关。

camera.h

class Camera
{
public:
 enum CameraType { LANDOBJECT, AIRCRAFT };

 Camera();
 Camera(CameraType cameraType);
 ~Camera();

 void strafe(float units); // left/right
 void fly(float units);    // up/down
 void walk(float units);   // forward/backward
 
 void pitch(float angle); // rotate on right vector
 void yaw(float angle);   // rotate on up vector
 void roll(float angle);  // rotate on look vector

 void getViewMatrix(D3DXMATRIX* V);
 void setCameraType(CameraType cameraType);
 void getPosition(D3DXVECTOR3* pos);
 void setPosition(D3DXVECTOR3* pos);

 void getRight(D3DXVECTOR3* right);
 void getUp(D3DXVECTOR3* up);
 void getLook(D3DXVECTOR3* look);
private:
 CameraType  _cameraType;
 D3DXVECTOR3 _right;
 D3DXVECTOR3 _up;
 D3DXVECTOR3 _look;
 D3DXVECTOR3 _pos;
};

camera.cpp

#include "camera.h"

Camera::Camera()
{
 _cameraType = AIRCRAFT;

 _pos   = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
 _right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
 _up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
 _look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}

Camera::Camera(CameraType cameraType)
{
 _cameraType = cameraType;

 _pos   = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
 _right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
 _up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
 _look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}

Camera::~Camera()
{

}

void Camera::getPosition(D3DXVECTOR3* pos)
{
 *pos = _pos;
}

void Camera::setPosition(D3DXVECTOR3* pos)
{
 _pos = *pos;
}

void Camera::getRight(D3DXVECTOR3* right)
{
 *right = _right;
}

void Camera::getUp(D3DXVECTOR3* up)
{
 *up = _up;
}

void Camera::getLook(D3DXVECTOR3* look)
{
 *look = _look;
}

void Camera::walk(float units)
{
 // move only on xz plane for land object
 if( _cameraType == LANDOBJECT )
  _pos += D3DXVECTOR3(_look.x, 0.0f, _look.z) * units;

 if( _cameraType == AIRCRAFT )
  _pos += _look * units;
}

void Camera::strafe(float units)
{
 // move only on xz plane for land object
 if( _cameraType == LANDOBJECT )
  _pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;

 if( _cameraType == AIRCRAFT )
  _pos += _right * units;
}

void Camera::fly(float units)
{
 // move only on y-axis for land object
 if( _cameraType == LANDOBJECT )
  _pos.y += units;

 if( _cameraType == AIRCRAFT )
  _pos += _up * units;
}

void Camera::pitch(float angle)
{
 D3DXMATRIX T;
 D3DXMatrixRotationAxis(&T, &_right, angle);

 // rotate _up and _look around _right vector
 D3DXVec3TransformCoord(&_up,&_up, &T);
 D3DXVec3TransformCoord(&_look,&_look, &T);
}

void Camera::yaw(float angle)
{
 D3DXMATRIX T;

 // rotate around world y (0, 1, 0) always for land object
 if( _cameraType == LANDOBJECT )
  D3DXMatrixRotationY(&T, angle);

 // rotate around own up vector for aircraft
 if( _cameraType == AIRCRAFT )
  D3DXMatrixRotationAxis(&T, &_up, angle);

 // rotate _right and _look around _up or y-axis
 D3DXVec3TransformCoord(&_right,&_right, &T);
 D3DXVec3TransformCoord(&_look,&_look, &T);
}

void Camera::roll(float angle)
{
 // only roll for aircraft type
 if( _cameraType == AIRCRAFT )
 {
  D3DXMATRIX T;
  D3DXMatrixRotationAxis(&T, &_look, angle);

  // rotate _up and _right around _look vector
  D3DXVec3TransformCoord(&_right,&_right, &T);
  D3DXVec3TransformCoord(&_up,&_up, &T);
 }
}

void Camera::getViewMatrix(D3DXMATRIX* V)
{
 // Keep camera's axes orthogonal to eachother
 D3DXVec3Normalize(&_look, &_look);

 D3DXVec3Cross(&_up, &_look, &_right);
 D3DXVec3Normalize(&_up, &_up);

 D3DXVec3Cross(&_right, &_up, &_look);
 D3DXVec3Normalize(&_right, &_right);

 // Build the view matrix:
 float x = -D3DXVec3Dot(&_right, &_pos);
 float y = -D3DXVec3Dot(&_up, &_pos);
 float z = -D3DXVec3Dot(&_look, &_pos);

 (*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;
 (*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;
 (*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;
 (*V)(3,0) = x;        (*V)(3, 1) = y;     (*V)(3, 2) = z;       (*V)(3, 3) = 1.0f;
}

void Camera::setCameraType(CameraType cameraType)
{
 _cameraType = cameraType;
}

        上面的注释很清楚,我就不啰嗦了。一些函数如果不明白,查下DX的文档,一目了然。之所以能够这样设计,主要是依赖了DX固定流水线的模块化设计。把变换流水线分为了几个可控的部分,在内部的矩阵合并串联运算我们不用理会它。

Java 编程思想(第4版)学习笔记(各种容器(集合框架)的比较 Collection Map ..第11章 练习4)

 package Exer_11;import java.util.*;import static java.lang.System.out;/*** @author lzcysd**/public ...
  • seng3018
  • seng3018
  • 2009年04月05日 16:45
  • 1058

11.4容器的打印

11.4容器的打印 使用Arrays.toString()来产生数组的可打印表示: package cn.wangs.c11.$11_4;import java.util.ArrayList; ...
  • jisngjun
  • jisngjun
  • 2017年01月19日 11:43
  • 170

我一直喜欢下午的阳光。它让我相信这个世界任何事情都会有转机,相信命运的宽厚和美好。我们终归要长大,带着一种无怨的心情悄悄地长大。归根到底,成长是一种幸福。

我一直喜欢下午的阳光。它让我相信这个世界任何事情都会有转机,相信命运的宽厚和美好。我们终归要长大,带着一种无怨的心情悄悄地长大。归根到底,成长是一种幸福。...
  • u014768604
  • u014768604
  • 2014年04月18日 08:52
  • 357

我喜欢我的一个女客户

 
  • taozi8848
  • taozi8848
  • 2007年05月24日 11:52
  • 468

我喜欢培根:

我喜欢培根: -- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-. . ..--.- -... ..- - ..--.- -... .- -.-...
  • dongyanwen6036
  • dongyanwen6036
  • 2017年07月30日 19:59
  • 570

我害怕孤单,我害怕受伤,我害怕最重要的人离开,我害怕独处

我不喜欢你跟别人聊天不理我,我害怕你离开;我不喜欢当你看见我给你发的QQ消息时,你不回我,因为我害怕你讨厌我, 我不喜欢你跟我讲不真实的话,让我感觉到虚假; 我不喜欢你一声不讲就下了QQ,我害怕你...
  • lchongs
  • lchongs
  • 2012年01月09日 22:21
  • 533

实验吧—我喜欢培根

前半段用摩斯码解出,发现要用培根码。 后半段用培根码杰出手shiyanba/is/cool。提交答案的时候会比较tricky,CTF{SHIYANBA IS COOL}。这个…嗯…不要浪费太多时间...
  • miss_snow_m
  • miss_snow_m
  • 2017年02月21日 01:45
  • 650

个人封装的一个Camera类

本文转自:http://blog.csdn.net/wz331956750/article/details/24291479
  • FightForFuture2013
  • FightForFuture2013
  • 2014年04月22日 11:07
  • 1761

Java核心中的核心-多态

原文地址:http://www.cnblogs.com/xdp-gacl/p/3644035.html 一句话概括多态(也叫动态绑定):在运行期间,判断其引用的实际类型,根据其实际的类型,调用对应的方...
  • u011698346
  • u011698346
  • 2016年05月26日 10:25
  • 207

如果我只有一点点喜欢你,我就不会给你说

如果我只有一点点喜欢你,我就不会给你说。 因为我知道,人生,特别当你寂寞太久的时候,有太多的冲动。 把喜欢当很喜欢,把一秒当作永恒。 我相信一见钟情,也相信日久生情,所以我要等待,等待这份只有一...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2014年06月10日 14:44
  • 570
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个精致的camera类,我喜欢它。
举报原因:
原因补充:

(最多只允许输入30个字)