camera类

 

//

//

// File: camera.cpp

//

// Author: Frank Luna (C) All Rights Reserved

//

// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0

//

// Desc: Defines a camera's position and orientation.

//

//

#include "mycamera.h"

extern IDirect3DDevice9* Device;

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); //y zhou

_look = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

}

Camera::Camera(CameraType cameraType)

{

_cameraType = cameraType;

_pos = D3DXVECTOR3(0.0f, 30.0f, -100.0f);

_right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);

_up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);

_look = D3DXVECTOR3(0.0f, -2.0f, 5.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) //shang xia ping yi

{

// 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) //tai tou,di tou

{

D3DXMATRIX T;

D3DXMatrixRotationAxis(&T, &_right, angle); //rao ren yi zhou xuan zhuan

// 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); //xiang liang dan wei hua

D3DXVec3Cross(&_up, &_look, &_right); //cha cheng

D3DXVec3Normalize(&_up, &_up);

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

D3DXVec3Normalize(&_right, &_right);

// Build the view matrix:

float x = -D3DXVec3Dot(&_right, &_pos); //dian cheng

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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值