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

📄 camera.cpp

📁 使用shader语言在vs阶段编写光照效果的演示程序及全部源代码
💻 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 + -