⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera.cpp

📁 BSP地形系统和光照贴图的技术详解
💻 CPP
字号:
// Camera.cpp: implementation of the CCamera class.
//
//////////////////////////////////////////////////////////////////////

#include "Camera.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CCamera::CCamera()
{
	D3DXVECTOR3	eye(0.0f,0.0f,0.0f);
	D3DXVECTOR3	lookat(0.0f,0.0f,-1.0f);
	D3DXVECTOR3	up(0.0f,1.0f,0.0f);
	D3DXMatrixIdentity( &m_matView );
	D3DXMatrixIdentity( &m_matBill );
	D3DXMatrixIdentity( &m_matWorld );
	D3DXMatrixIdentity( &m_matProj );
	SetView( &eye, &lookat, &up );
}

D3DXMATRIX*	CCamera::SetView( D3DXVECTOR3* pvEye,D3DXVECTOR3* pvLookat,D3DXVECTOR3* pvUp)
{
	m_vEye		= *pvEye;
	m_vLookat	= *pvLookat;
	m_vUp		= *pvUp;
	D3DXVec3Normalize( &m_vView, &( m_vLookat - m_vEye ) );
	D3DXVec3Cross( &m_vCross, &m_vUp, &m_vView );

	D3DXMatrixLookAtLH( &m_matView, &m_vEye, &m_vLookat, &m_vUp);
	D3DXMatrixInverse( &m_matBill, NULL, &m_matView );
	m_matBill._41 = 0.0f;
	m_matBill._42 = 0.0f;
	m_matBill._43 = 0.0f;

	return &m_matView;
}

D3DXMATRIX* CCamera::RotateLocalX( float angle )	// 以local x轴为中心旋转,主要使用这个.
{
	D3DXMATRIX matRot;
	D3DXMatrixRotationAxis( &matRot, &m_vCross, angle );

	D3DXVECTOR3 vNewDst,vNewUp;
	D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot );	// 通过view * rot求得新的 dst vector.
//	D3DXVec3Cross( &vNewUp, &vNewDst, &m_vCross );			// 通过cross( dst, x轴)求得 up vector.
//	D3DXVec3Normalize( &vNewUp, &vNewUp );					// up vector变为 unit vector...
	vNewDst += m_vEye;										// 实际 dst position =  eye Position + dst vector

//	return SetView( &m_vEye, &vNewDst, &vNewUp );
	return SetView( &m_vEye, &vNewDst, &m_vUp );
}

D3DXMATRIX* CCamera::RotateLocalY( float angle )	// 以local y轴为中心旋转,主要使用这个.
{
	D3DXMATRIX matRot;
	D3DXMatrixRotationAxis( &matRot, &m_vUp, angle );

	D3DXVECTOR3 vNewDst;
	D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot );	// 通过view * rot求得新的 dst vector.
	vNewDst += m_vEye;										// 实际 dst position =  eye Position + dst vector

	return SetView( &m_vEye, &vNewDst, &m_vUp );
}

D3DXMATRIX* CCamera::RotateLocalZ( float angle )	// 以local z轴为中心旋转,主要使用这个.
{
	D3DXMATRIX matRot;
	D3DXMatrixRotationAxis( &matRot, &m_vView, angle );

	D3DXVECTOR3 vNewUp;
	D3DXVec3TransformCoord( &vNewUp, &m_vUp, &matRot );	// 通过up * rot求得新的 dst vector.
	D3DXVec3Normalize( &vNewUp, &vNewUp );					// up vector变为 unit vector...

	return SetView( &m_vEye, &m_vLookat, &vNewUp );
}

D3DXMATRIX* CCamera::MoveLocalX( float dist )	// 以local z轴为中心移动,主要使用这个.
{
	D3DXVECTOR3 vNewEye	= m_vEye;
	D3DXVECTOR3 vNewDst	= m_vLookat;

	D3DXVECTOR3 vMove;
	D3DXVec3Normalize( &vMove, &m_vCross );
	vMove	*= dist;
	vNewEye += vMove;
	vNewDst += vMove;

	return SetView( &vNewEye, &vNewDst, &m_vUp );
}

D3DXMATRIX* CCamera::MoveLocalY( float dist )	// 以local y轴为中心移动,主要使用这个.
{
	D3DXVECTOR3 vNewEye	= m_vEye;
	D3DXVECTOR3 vNewDst	= m_vLookat;

	D3DXVECTOR3 vMove;
	D3DXVec3Normalize( &vMove, &m_vUp );
	vMove	*= dist;
	vNewEye += vMove;
	vNewDst += vMove;

	return SetView( &vNewEye, &vNewDst, &m_vUp );
}

D3DXMATRIX* CCamera::MoveLocalZ( float dist )	// 以local z轴为中心移动,主要使用这个.
{
	D3DXVECTOR3 vNewEye	= m_vEye;
	D3DXVECTOR3 vNewDst	= m_vLookat;

	D3DXVECTOR3 vMove;
	D3DXVec3Normalize( &vMove, &m_vView );
	vMove	*= dist;
	vNewEye += vMove;
	vNewDst += vMove;

	return SetView( &vNewEye, &vNewDst, &m_vUp );
}

D3DXMATRIX* CCamera::MoveTo( D3DXVECTOR3* pv )
{
	D3DXVECTOR3	dv = *pv - m_vEye;
	m_vEye = *pv;
	m_vLookat += dv;
	return SetView( &m_vEye, &m_vLookat, &m_vUp );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -