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

📄 camera.cpp

📁 D3D做的天空盒地面加上了纹理混合!写的非常清晰
💻 CPP
字号:

#include "Camera.h"
#include <zmouse.h>

CCamera::CCamera() :
m_fNear(0.f),
m_fFar(0.f),
m_fFOV(0.f),
m_fAspect(0.f),
m_bIsRot(false),
m_bIsTrans(false),
m_fCameraYawAngle(0.f),
m_fCameraPitchAngle(0.f),
m_vDelta(0.f, 0.f, 0.f),
m_fVelocity(0.01f),
m_fMaxPitch(D3DX_PI*0.49f),
m_fMinPitch(-D3DX_PI*0.49f)
{
	m_EyePos = D3DXVECTOR3(0.f, 0.f, 0.f);
	m_LookAt = D3DXVECTOR3(0.f, 0.f, 1.f);
	m_Up	 = D3DXVECTOR3(0.f, 1.f, 0.f);

}

CCamera::~CCamera()
{

}


void CCamera::SetViewParams( D3DXVECTOR3 &pos, D3DXVECTOR3 &lookat, D3DXVECTOR3 &up )
{
	m_EyePos = pos;
	m_LookAt = lookat;
	m_Up	 = up;
	m_Direction = m_LookAt - m_EyePos;
	D3DXVec3Cross( &m_Right, &m_Up, &m_Direction );


	D3DXMatrixLookAtLH(&m_ViewTrans, &m_EyePos, &m_LookAt, &m_Up);

	D3DXMATRIX mInvView;
	D3DXMatrixInverse( &mInvView, NULL, &m_ViewTrans );
	D3DXVECTOR3* pZBasis = (D3DXVECTOR3*) &mInvView._31;
	m_fCameraYawAngle   = atan2f( pZBasis->x, pZBasis->z );
	float fLen = sqrtf(pZBasis->z*pZBasis->z + pZBasis->x*pZBasis->x);
	m_fCameraPitchAngle = -atan2f( pZBasis->y, fLen );
}

void CCamera::SetProjParams( float fFOV, float fAspect, float fNear, float fFar  )
{
	m_fFOV		= fFOV;
	m_fAspect	= fAspect;
	m_fNear     = fNear;
	m_fFar      = fFar;

	D3DXMatrixPerspectiveFovLH( &m_ProjTrans, m_fFOV, m_fAspect, m_fNear, m_fFar );
}
void CCamera::SetOrthoProjParams( float w, float h, float fNear, float fFar )
{
	D3DXMatrixOrthoLH( &m_ProjTrans, w, h, fNear, fFar );
}
const D3DXMATRIX *CCamera::GetViewTrans() const
{
	return &m_ViewTrans;
}
const D3DXMATRIX *CCamera::GetProjTrans() const
{
	return &m_ProjTrans;
}

void CCamera::SetMoveVelocity( float fVelocity )
{
	m_fVelocity = fVelocity;
}


LRESULT CCamera::HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	//m_vDelta = D3DXVECTOR3(0.f, 0.f, 0.f);
	// setcapture getcursorPos
	switch( msg )
	{	
	case WM_LBUTTONDOWN:
		{
			m_bIsRot = true;
			SetCapture(hWnd);
			GetCursorPos(&m_LastPoint);
		}
		break;
	case WM_LBUTTONUP:
		{
			m_bIsRot = false;
			ReleaseCapture();
		}
		break;
	}

	return 0;
}

void CCamera::ProcessKey(float fElapsedTime)
{
	m_vDelta = D3DXVECTOR3(0.f, 0.f, 0.f);
	float fVelocity = m_fVelocity * fElapsedTime;

	if( GetKeyState('W') & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.z += fVelocity;
	}
	if( GetKeyState('S') & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.z -= fVelocity;
	}
	if( GetKeyState('A') & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.x -= fVelocity;
	}
	if( GetKeyState('D') & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.x += fVelocity;
	}
	if( GetKeyState(VK_HOME) & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.y += fVelocity;
	}
	if( GetKeyState(VK_END) & 0x8000 )
	{
		m_bIsTrans = true;
		m_vDelta.y -= fVelocity;
	}
}


void CCamera::Update()
{
	POINT ptCurrentPos = {0, 0};
	POINT ptDeltaPos = {0, 0};

	if(m_bIsRot)
	{
		//计算鼠标偏移
		GetCursorPos(&ptCurrentPos);
		ptDeltaPos.x = ptCurrentPos.x - m_LastPoint.x;
		ptDeltaPos.y = ptCurrentPos.y - m_LastPoint.y;
		m_LastPoint = ptCurrentPos;

		float fYaw = ptDeltaPos.x*0.01f;
		float fPitch = ptDeltaPos.y*0.01f;

		//根据鼠标便宜计算欧拉角
		m_fCameraYawAngle   += fYaw;
		m_fCameraPitchAngle += fPitch;

	}

	// 根据欧拉角Yaw,Pitch计算摄像机的旋转矩阵
	D3DXMATRIX matCameraRot;
	ZeroMemory(&matCameraRot, sizeof(D3DXMATRIX));
	D3DXMatrixRotationYawPitchRoll(&matCameraRot, m_fCameraYawAngle, m_fCameraPitchAngle,0.f);

	// 根据旋转矩阵将摄像机的局部方向向量和o上方向向量转为全局向量
	D3DXVECTOR3 vWorldUp, vWorldAhead;
	D3DXVECTOR3 vLocalUp    = D3DXVECTOR3(0,1,0);
	D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,1);
	D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &matCameraRot );
	D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &matCameraRot );

	if(m_bIsTrans)
	{
		// 将局部偏移量转到全局坐标
		D3DXVECTOR3 vWorldDelta;
		D3DXVec3TransformCoord( &vWorldDelta, &m_vDelta, &matCameraRot );
		// 根据偏移量计算视点位置
		m_EyePos += vWorldDelta;
	}
	// 计算观察点位置 
	m_LookAt = m_EyePos + vWorldAhead;

	// 更新视矩阵
	D3DXMatrixLookAtLH( &m_ViewTrans, &m_EyePos, &m_LookAt, &vWorldUp );

	m_Direction = m_LookAt - m_EyePos;
	m_Up = vWorldUp;
	D3DXVec3Cross( &m_Right, &vWorldUp, &m_Direction );
}


void CCamera::ApplyDevice( LPDIRECT3DDEVICE9  pDevice )
{
	if( pDevice )
	{
		pDevice->SetTransform(D3DTS_VIEW, &m_ViewTrans);
		pDevice->SetTransform(D3DTS_PROJECTION, &m_ProjTrans);
	}
}

⌨️ 快捷键说明

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