//////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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 "CCamera.h"
Camera::Camera()
{
_cameraType = AIRCRAFT;
_pos = D3DXVECTOR3(0.0f, 0.0f, -3.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);
SetCursorPos(Window_Width >> 1, Window_Height >> 1);
ShowCursor(FALSE);
}
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;
}
void Camera::SetViewByMouse()
{
POINT mousePos; // 存储鼠标位置的结构体
int middleX = Window_Width >> 1; // 窗口宽度的一半
int middleY = Window_Height >> 1; // 窗口高度的一半
float angleY = 0.0f; // 存储向上看、向下看的角度
float angleZ = 0.0f; // 存储向左看、向右看的角度
static float currentRotX = 0.0f; // 存储总的向上、向下的旋转角度
// 获得当前鼠标位置
GetCursorPos(&mousePos);
// 如果鼠标仍然在正中间,不更新场景
if ((mousePos.x == middleX) && (mousePos.y == middleY))
{
return;
}
// 将鼠标置回屏幕的中央
SetCursorPos(middleX, middleY);
// 获得鼠标移动的方向
angleY = (float)((middleX - mousePos.x)) / 6000.0f;
angleZ = (float)((middleY - mousePos.y)) / 6000.0f;
// 保存一个当前向上或向下旋转过的角度,可以限制Camera上下做360度旋转
currentRotX -= angleZ;
// 如果当前的旋转弧度大于1.3,不让Camera继续向上旋转
if (currentRotX > 1.3f)
{
currentRotX = 1.3f;
}
// 如果当前的旋转弧度小于1.3,不让Camera继续向下旋转
else if (currentRotX < -1.3f)
{
currentRotX = -1.3f;
}
// 否则绕所处位置旋转视线
else
{
// 绕Camera的水平向量旋转Camera(上下)
pitch(angleZ);
// 绕Camera的向上向量旋转Camera(左右)
yaw(angleY);
}
ShowCursor(FALSE);
}
没有合适的资源?快使用搜索试试~ 我知道了~
DX .X文件网格渲染
共28个文件
cpp:4个
obj:4个
h:3个
需积分: 9 23 下载量 33 浏览量
2010-06-05
23:38:29
上传
评论
收藏 4.7MB RAR 举报
温馨提示
自己最近学习DX游戏开发 自己按照书上的代码实现的 现将其传到网上去 其一跟大家一块分享 其二方便以后查找 我感觉这是一种很好的方法来保存自己曾经所写过的代码
资源推荐
资源详情
资源评论
收起资源包目录
CBasicXFile.rar (28个子文件)
CBasicXFile
CBasicXFile.suo 17KB
CBasicXFile.sln 899B
Debug
CBasicXFile.ilk 502KB
CBasicXFile.pdb 755KB
CBasicXFile.exe 46KB
CBasicXFile
main.cpp 2KB
CBasicXFile.h 969B
CBasicXFile.cpp 5KB
tiger.bmp 65KB
CWndApp.cpp 2KB
CCamera.h 2KB
tiger.x 30KB
Debug
CBasicXFile.exe.embed.manifest 663B
vc90.idb 539KB
CBasicXFile.exe.embed.manifest.res 728B
BuildLog.htm 6KB
CBasicXFile.obj 41KB
CWndApp.obj 23KB
CCamera.obj 50KB
CBasicXFile.exe.intermediate.manifest 621B
mt.dep 67B
main.obj 36KB
vc90.pdb 316KB
CBasicXFile.vcproj 4KB
CCamera.cpp 5KB
CBasicXFile.vcproj.PC-201004051525.Administrator.user 1KB
CWndApp.h 664B
CBasicXFile.ncb 15.95MB
共 28 条
- 1
资源评论
mlinlin
- 粉丝: 7
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功