📄 d3dcamera.cpp
字号:
// D3DCamera.cpp: implementation of the CD3DCamera class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// Name:
// Desc:
//-----------------------------------------------------------------------------
CMCGCamera::CMCGCamera()
{
// Set attributes for the view matrix
D3DXVECTOR3 vEyePt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vLookatPt(0.0f,0.0f,1.0f);
D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
D3DXMatrixIdentity( &m_matView );
D3DXMatrixIdentity( &m_matBillboard );
SetViewParams( vEyePt, vLookatPt, vUpVec );
SetProjParams( D3DX_PI/4, (float)1024/768, 1.0f, 1000.0f );
m_fSector=0;
//m_fFOV = D3DX_PI*0.3;
m_fFOV = (float)(D3DX_PI*0.35);
m_fAspect = (float)g_pApp->GetScreenWidth()/(float)g_pApp->GetScreenHeight();
}
//-----------------------------------------------------------------------------
// Name:
// Desc:
//-----------------------------------------------------------------------------
VOID CMCGCamera::SetViewParams( D3DXVECTOR3 &vEyePt, D3DXVECTOR3& vLookatPt,
D3DXVECTOR3& vUpVec )
{
// Set attributes for the view matrix
m_vEyePt = vEyePt;
m_vLookatPt = vLookatPt;
m_vUpVec = vUpVec;
//D3DXVECTOR3 Dir = m_vEyePt - m_vLookatPt;
D3DXVECTOR3 Dir = m_vLookatPt - m_vEyePt;
D3DXVec3Normalize(&m_vView,&Dir);
//D3DXVec3Cross(&m_vRight,&m_vView,&m_vUpVec);
D3DXVec3Cross(&m_vRight,&m_vUpVec,&m_vView);
//D3DXVec3Normalize(&m_vLookatPt,&m_vLookatPt);
//D3DXVec3Cross(&m_vRight,&m_vUpVec,&m_vLookatPt);
D3DXMatrixLookAtLH( &m_matView, &m_vEyePt, &m_vLookatPt, &m_vUpVec );
D3DXMatrixInverse( &m_matBillboard, NULL, &m_matView );
m_matBillboard._41 = 0.0f;
m_matBillboard._42 = 0.0f;
m_matBillboard._43 = 0.0f;
}
//-----------------------------------------------------------------------------
// Name:
// Desc:
//-----------------------------------------------------------------------------
VOID CMCGCamera::SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane,
FLOAT fFarPlane )
{
//fNearPlane = 20.0f;
// Set attributes for the projection matrix
//m_fFOV = fFOV;
//m_fAspect = fAspect;
m_fNearPlane = fNearPlane;
m_fFarPlane = fFarPlane;
// m_fFOV = D3DX_PI*0.35;
//m_fFOV = D3DX_PI/1.2f;
//m_fFOV = D3DX_PI*0.3;
// if(fFOV == D3DX_PI/4) // 快急篮 捞犯霸父 贸府 窍技..
// D3DXMatrixPerspectiveFovLH( &m_matProj, m_fFOV, m_fAspect, fNearPlane, fFarPlane );
// else
// D3DXMatrixPerspectiveFovLH( &m_matProj, fFOV, m_fAspect, fNearPlane, fFarPlane );
D3DXMatrixPerspectiveFovLH( &m_matProj, fFOV, m_fAspect, fNearPlane, fFarPlane );
}
void CMCGCamera::SetView( D3DXVECTOR3 &vEyePt, D3DXVECTOR3& vLookatPt, D3DXVECTOR3& vUpVec )
{
m_vEyePt = vEyePt;
m_vLookatPt = vLookatPt;
m_vUpVec = vUpVec;
}
void CMCGCamera::Reset()
{
m_vEyePt = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vLookatPt = D3DXVECTOR3(0.0f,0.0f,1.0f);
m_vUpVec = D3DXVECTOR3(0.0f,1.0f,0.0f);
}
D3DXMATRIXA16* CMCGCamera::RotateLocalX( float angle )
{
/* D3DXMATRIXA16 matRot;
D3DXMatrixRotationAxis( &matRot, &m_vRight, angle );
D3DXVECTOR3 vNewDst;
D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot );
vNewDst += m_vEyePt;
SetViewParams( m_vEyePt, vNewDst, m_vUpVec ); */
CUtility::RotateVector(&m_vView,&m_vRight,angle);
m_vView += m_vEyePt;
SetViewParams( m_vEyePt, m_vView, m_vUpVec );
return NULL;
}
D3DXMATRIXA16* CMCGCamera::RotateLocalY(float angle )
{
/* D3DXMATRIXA16 matRot;
D3DXMatrixRotationAxis( &matRot, &m_vUpVec, angle );
D3DXVECTOR3 vNewDst;
D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot );
vNewDst += m_vEyePt;
SetViewParams( m_vEyePt, vNewDst, m_vUpVec ); */
CUtility::RotateVector(&m_vView,&m_vUpVec,angle);
m_vView+= m_vEyePt;
SetViewParams( m_vEyePt, m_vView, m_vUpVec );
/*CUtility::printf_Debug("\n墨皋扼 轰 : %f, %f, %f",m_vView.x,m_vView.y,m_vView.z);*/
//CUtility::printf_Debug("\n墨皋扼 扼捞飘 : %f, %f, %f",m_vRight.x,m_vRight.y,m_vRight.z);
return NULL;
}
D3DXMATRIXA16* CMCGCamera::MoveLocalX( float dist )
{
D3DXVECTOR3 vNewEye = m_vEyePt;
D3DXVECTOR3 vNewDst = m_vLookatPt;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vRight );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
SetViewParams( vNewEye, vNewDst, m_vUpVec );
return NULL;
}
D3DXMATRIXA16* CMCGCamera::MoveLocalY( float dist )
{
D3DXVECTOR3 vNewEye = m_vEyePt;
D3DXVECTOR3 vNewDst = m_vLookatPt;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vUpVec );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
SetViewParams( vNewEye, vNewDst, m_vUpVec );
return NULL;
}
D3DXMATRIXA16* CMCGCamera::MoveLocalZ(float dist )
{
D3DXVECTOR3 vNewEye = m_vEyePt;
D3DXVECTOR3 vNewDst = m_vLookatPt;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vView );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
SetViewParams( vNewEye, vNewDst, m_vUpVec );
return NULL;
}
void CMCGCamera::SetLocalX( float x )
{
}
void CMCGCamera::SetLocalY( float y )
{
m_vEyePt.y = y;
m_vLookatPt.y = y;
SetViewParams( m_vEyePt, m_vLookatPt, m_vUpVec );
}
void CMCGCamera::SetLocalZ( float z )
{
}
D3DXMATRIXA16* CMCGCamera::MoveTo( D3DXVECTOR3* pv )
{
D3DXVECTOR3 dv = *pv - m_vEyePt;
m_vEyePt = *pv;
m_vLookatPt += dv;
SetViewParams( m_vEyePt, m_vLookatPt, m_vUpVec );
return NULL;
}
void CMCGCamera::PointRotateY(D3DXVECTOR3& vPos, float fDistance, float angle)
{
D3DXMATRIXA16 matRot;
// D3DXVECTOR3 vView = m_vView;
D3DXMatrixRotationAxis(&matRot,&m_vUpVec,angle);
D3DXVec3TransformCoord(&m_vRight, &m_vRight, &matRot );
D3DXVec3TransformCoord(&m_vView,&m_vView,&matRot);
// D3DXVec3TransformCoord(&vView,&m_vView,&matRot);
CMCGCamera::SetPoint(vPos,fDistance);
}
void CMCGCamera::PointRotateX(D3DXVECTOR3& vPos, float fDistance, float angle)
{
D3DXMATRIXA16 matRot;
D3DXMatrixRotationAxis(&matRot,&m_vRight,angle);
//D3DXVec3TransformCoord( &m_vUpVec, &m_vUpVec, &matRot );
// 墨皋扼 阜扁~
m_fSector+= angle; // 墨皋扼 巨臂蔼阑 拌加 绵么~
if(fabs(m_fSector) < D3DX_PI/3) // 绵么等 巨臂捞 3.141592/3 = (180/3=60) 焊促 累促搁
{
D3DXVec3TransformCoord(&m_vView,&m_vView,&matRot); // 拌加 雀傈
}
else
m_fSector-= angle; // 雀傈 肛勉~
CMCGCamera::SetPoint(vPos,fDistance);
}
void CMCGCamera::SetPoint(D3DXVECTOR3 vPos, float fDistance)
{
// fDistance啊 - 甫 秒窍绰 捞蜡 : 弊成 蚌窍搁 fDistance啊 剧荐老版快 某腐磐 第率栏肺, 澜荐老版快 菊率栏肺 柯促.
// 盔贰 墨皋扼 谅钎啊 吝痢俊辑 Z俊 - 甫 拎具 窍扁锭巩俊, 窃荐甫 荤侩且锭 墨皋扼甫 第肺 动扁绊 酵栏搁 -n
// 菊栏肺 林绊 酵栏订 +n, 捞 谅钎拌(?)甫 嘎眠扁 困秦辑 -甫 嘿烙
// RotateLocalY();
if(fDistance == 0) // fDistance捞 0老 版快 1牢莫 墨皋扼 贸烦 官诧促.-_-;;;; 0
{ // 0捞扼搁 墨皋扼 困摹甫 vPos肺 嘎冕促.
m_vEyePt = vPos;
m_vLookatPt = vPos + m_vView;
}
else
{
m_vEyePt = vPos-m_vView * (-fDistance);
m_vLookatPt = vPos;
}
SetViewParams(m_vEyePt,m_vLookatPt,m_vUpVec);
}
void CMCGCamera::PointMove( D3DXVECTOR3& vDir, float fDistance )
{
D3DXVECTOR3 vNewEye = m_vEyePt;
D3DXVECTOR3 vNewDst = m_vLookatPt;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &vDir );
vMove *= fDistance;
vNewEye += vMove;
vNewDst += vMove;
SetViewParams( vNewEye, vNewDst, m_vUpVec );
}
void CMCGCamera::SetPos(D3DXVECTOR3 &vPos)
{
SetViewParams(vPos,m_vLookatPt,m_vUpVec);
}
void CMCGCamera::CustomCamera(D3DXVECTOR3 vDir, D3DXVECTOR3 vPosPt, float angleX, float angleY )
{
D3DXMATRIXA16 matRot;
// y绵 雀傈
D3DXMatrixRotationAxis(&matRot,&m_vUpVec,angleY);
D3DXVec3TransformCoord( &m_vRight, &m_vRight, &matRot );
D3DXVec3TransformCoord(&m_vView,&m_vView,&matRot);
D3DXMatrixRotationAxis(&matRot,&m_vRight,angleX);
D3DXVec3TransformCoord(&m_vView,&m_vView,&matRot);
D3DXVec3Normalize(&vDir,&vDir);
vPosPt.y += 1.0f;
//vPosPt.y += angleX;
m_vEyePt = vPosPt + vDir * (-3.5f);
//D3DXVECTOR3 vEPDir = m_vEyePt - vPosPt;
//D3DXVec3TransformCoord(&vEPDir,&vEPDir,&matRot);
m_vLookatPt = m_vEyePt + m_vView;
SetViewParams(m_vEyePt,m_vLookatPt,m_vUpVec);
// x绵 雀傈
// D3DXMatrixRotationAxis(&matRot,&vPosPt,angleX);
// D3DXVec3TransformCoord(&m_vView,&m_vView,&matRot);
// m_vEyePt = vPosPt - m_vView;
// SetViewParams( m_vEyePt, m_vView, m_vUpVec );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -