关于这个camara类的疑惑

yzm365487848 2010-05-13 05:19:20
下面是一个摄像机类:


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;
};


#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)
{
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;
}






对于这样一个函数....
对于这样一个函数....
对于这样一个函数....
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;
}
他跟 D3DXMatrixLookAtLH(&matrixView, &position, &lookat, &up)

有什么区别???
为什么getViewMatrix得到的Matrix 可以直接这么用

D3DXMATRIX V;
TheCamera.getViewMatrix(&V);
Device->SetTransform(D3DTS_VIEW, &V);

SetTransform中参数V到底是需要什么样一个矩阵啊..
...全文
85 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzm365487848 2010-05-14
  • 打赏
  • 举报
回复
这个问题我自己想明白了

D3DXMATRIX *D3DXMatrixLookAtLH( D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *pUp
);
Parameters

pOut
[in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
pEye
[in] Pointer to the D3DXVECTOR3 structure that defines the eye point. This value is used in translation.
pAt
[in] Pointer to the D3DXVECTOR3 structure that defines the camera look-at target.
pUp
[in] Pointer to the D3DXVECTOR3 structure that defines the current world's up, usually [0, 1, 0].

pEye 虽然是个D3DXVECTOR3向量形式,其实他是要转换成点的, 也就是说这个向量的意义是描述眼睛所在的世界坐标系的位置..他与carema类中_pos是不一样的,_pos是实实在在的位置向量..

同理pAt和_look也是这个道理

_up和pUp应该是一样的都是向量..

carema作为一个类,自己的成员变量就全都是向量,所以它写上自己的特定的getViewMatrix方法,来转换视角...
所以他们俩种用法是不同的

最后同用pDevice->SetTransform(D3DTS_VIEW, &view);
yzm365487848 2010-05-13
  • 打赏
  • 举报
回复
谢谢大家 不过好像有些时候就是不相同的啊。。。
evoup1 2010-05-13
  • 打赏
  • 举报
回复
getviewMatrix做公告牌的时候有用呗
张赐 2010-05-13
  • 打赏
  • 举报
回复
就是因为它是相机类啊,所有关于相机的操作都自己实现了

如果使用系统自带的3DXMatrixLookAtLH函数就没有多大意义了,而且不灵活
wickergg 2010-05-13
  • 打赏
  • 举报
回复
他使用getViewMatrix有什么好处吗?
张赐 2010-05-13
  • 打赏
  • 举报
回复
// 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;

这和3DXMatrixLookAtLH是一样的
yzm365487848 2010-05-13
  • 打赏
  • 举报
回复
这个是龙书上面 carama类源码...

调用 carama的方法getViewMatrix得到的matrix可以直接用来SetTransform(D3DTS_VIEW, &matrix);

而如果改而使用D3DXMatrixLookAtLH(&matrixView, &position, &lookat, &up)
同样可以得到一个矩阵 matrix啊, 同样可以SetTransform(D3DTS_VIEW, &matrix);

他使用getViewMatrix有什么好处吗?

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧