📄 camera.cpp
字号:
#include "Camera.h"
#include "D3DBase.h"
XCamera::XEye::XEye():
m_EyePos(0,0,0),m_EyeTarget(0,0,-1),m_Up(0,1,0)
{
}
void XCamera::yaw(float angle)
{
D3DXVECTOR3 vTDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
D3DXVECTOR3 newDir;
float len = D3DXVec3Length(&vTDir);
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,&vTDir);
D3DXMATRIX matRot ;
D3DXMatrixRotationAxis(&matRot,&m_Eye.m_Up,angle);
D3DXVec3TransformCoord(&newDir,&vDir,&matRot);
newDir = newDir * len;
m_Eye.m_EyeTarget = m_Eye.m_EyePos + newDir;
}
void XCamera::pitch(float angle)
{
D3DXVECTOR3 vTDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
float len = D3DXVec3Length(&vTDir);
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,&vTDir);
D3DXVECTOR3 vLeft;
D3DXVec3Cross(&vLeft,&vDir,&m_Eye.m_Up);
D3DXVECTOR3 newDir;
D3DXVECTOR3 newUp;
D3DXMATRIX matRot;
D3DXMatrixRotationAxis(&matRot,&vLeft,angle);
D3DXVec3TransformCoord(&newDir,&vDir,&matRot);
D3DXVec3TransformCoord(&newUp,&m_Eye.m_Up,&matRot);
m_Eye.m_Up = newUp;
newDir = newDir * len;
m_Eye.m_EyeTarget = m_Eye.m_EyePos + newDir;
}
void XCamera::roll(float angle)
{
D3DXVECTOR3 vTDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
float len = D3DXVec3Length(&vTDir);
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,&vTDir);
D3DXVECTOR3 vLeft;
D3DXVec3Cross(&vLeft,&vDir,&m_Eye.m_Up);
D3DXVECTOR3 newUp;
D3DXMATRIX matRot;
D3DXMatrixRotationAxis(&matRot,&vDir,angle);
D3DXVec3TransformCoord(&newUp,&m_Eye.m_Up,&matRot);
m_Eye.m_Up = newUp;
}
void XCamera::circle(float angle)
{
D3DXVECTOR3 vTDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
float len = D3DXVec3Length(&vTDir);
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,&vTDir);
D3DXMATRIX matRot ;
D3DXMatrixRotationAxis(&matRot,&m_Eye.m_Up,angle);
D3DXVECTOR3 newDir;
D3DXVec3TransformCoord(&newDir,&vDir,&matRot);
newDir = newDir * len;
m_Eye.m_EyePos = m_Eye.m_EyeTarget - newDir;
}
void XCamera::toward(float dist)
{
D3DXVECTOR3 vTDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,&vTDir);
vDir *= dist;
m_Eye.m_EyePos.x += vDir.x;
m_Eye.m_EyePos.y += vDir.y;
m_Eye.m_EyePos.z += vDir.z;
m_Eye.m_EyeTarget.x += vDir.x;
m_Eye.m_EyeTarget.y += vDir.y;
m_Eye.m_EyeTarget.z += vDir.z;
}
void XCamera::upDown(float dist)
{
D3DXVECTOR3 vDir = m_Eye.m_Up;
vDir *= dist;
m_Eye.m_EyePos.x += vDir.x;
m_Eye.m_EyePos.y += vDir.y;
m_Eye.m_EyePos.z += vDir.z;
m_Eye.m_EyeTarget.x += vDir.x;
m_Eye.m_EyeTarget.y += vDir.y;
m_Eye.m_EyeTarget.z += vDir.z;
}
void XCamera::shift(float dist)
{
D3DXVECTOR3 vDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
D3DXVECTOR3 vTLeft;
D3DXVec3Cross(&vTLeft,&vDir,&m_Eye.m_Up);
D3DXVECTOR3 vLeft;
D3DXVec3Normalize(&vLeft,&vTLeft);
vLeft *= dist;
m_Eye.m_EyePos.x += vLeft.x;
m_Eye.m_EyePos.y += vLeft.y;
m_Eye.m_EyePos.z += vLeft.z;
m_Eye.m_EyeTarget.x += vLeft.x;
m_Eye.m_EyeTarget.y += vLeft.y;
m_Eye.m_EyeTarget.z += vLeft.z;
}
void XCamera::rotate(D3DXVECTOR3& axis,float angle)
{
D3DXVECTOR3 vDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
D3DXVECTOR3 vUp = m_Eye.m_Up;
D3DXMATRIX rot_mat;
D3DXMatrixRotationAxis(&rot_mat,&axis,angle);
D3DXVECTOR3 vDirNew;
D3DXVec3TransformCoord(&vDirNew,&vDir,&rot_mat);
D3DXVec3TransformCoord(&m_Eye.m_Up,&vUp,&rot_mat);
m_Eye.m_EyeTarget = m_Eye.m_EyePos + vDirNew;
}
void XCamera::focus(float dist,float factor)
{
D3DXVECTOR3 V = m_Eye.m_EyePos - m_Eye.m_EyeTarget;
float len = D3DXVec3Length(&V);
if( (1 - dist/len) < factor)
return ;
float f = (len - dist )/len;
V = V * f;
m_Eye.m_EyePos = m_Eye.m_EyeTarget + V;
}
void XCamera::applyCamera()
{
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
D3DXMATRIX mat;
D3DXMatrixLookAtLH(&mat,(D3DXVECTOR3*)(&m_Eye.m_EyePos),(D3DXVECTOR3*)(&m_Eye.m_EyeTarget),(D3DXVECTOR3*)(&m_Eye.m_Up));
pDevice->SetTransform(D3DTS_VIEW,&mat);
}
void XCamera::applyProjection()
{
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
D3DXMATRIX mat;
D3DXMatrixPerspectiveFovLH(&mat,this->m_fFov,this->m_fAspect,this->m_fNear,this->m_fFar);
pDevice->SetTransform(D3DTS_PROJECTION,&mat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -