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

📄 xcamera.cpp

📁 XMathLib是一个通用的3D图形数学库。 其中包含两个部分: XMathLib和XGeomLib。分别处理数学和几何运算。 数学部分包含向量、矩阵、四元数的运算。以及其它的运算。 几何部分
💻 CPP
字号:
#include "XCamera.h"
namespace XGeomLib
{
	/*
	将眼睛信息转化成视图矩阵。
	*/
	void XCamera::XEye::ToMatirx(XMatrix& matView)
	{
		XM_LookAt(matView,m_EyePos,m_EyeTarget,m_Up);
		return ;
	}
	XCamera::XEye::XEye():
	m_EyePos(0,0,0),m_EyeTarget(0,0,-1),m_Up(0,1,0)
	{
	}

	/**
	从一个Camera对象构造出两个矩阵。
	一个投影矩阵,
	一个视图矩阵,
	*/
	void XCamera::ToMatrix(XMatrix& matView,XMatrix& matProject)
	{
		/*构造视图矩阵*/
		m_Eye.ToMatirx(matView);

		/*
		注意,这是个投影矩阵。可能有好几种投影方式。
		平行投影和透视投影在本库中被支持
		*/
		if(m_ProjectType == PT_PROJECT)
		{
			XM_Perspective(matProject,m_fFov,m_fAspect,m_fNear,m_fFar);
		}
		else if(m_ProjectType == PT_ORTHO)
		{
			XM_Ortho3D(matProject,m_fNear,m_fFar,m_ViewRect.m_top,m_ViewRect.m_bottom,m_ViewRect.m_left,m_ViewRect.m_right);
		}
		else
		{
			matProject.LoadIdentity();
		}
		return ;

	}

	/**
	从摄影机里构造出一个视图矩阵
	*/

	void XCamera::ToViewMatrix(XMatrix& matView)
	{
		m_Eye.ToMatirx(matView);
	}

	/**
	从一个摄影机里构造出一个投影矩阵出来
	*/
	void XCamera::ToProjectMatrix(XMatrix& matProject)
	{

		/*
		注意,这是个投影矩阵。可能有好几种投影方式。
		平行投影和透视投影在本库中被支持
		*/
		if(m_ProjectType == PT_PROJECT)
		{
			XM_Perspective(matProject,m_fFov,m_fAspect,m_fNear,m_fFar);
		}
		else if(m_ProjectType == PT_ORTHO)
		{
			XM_Ortho3D(matProject,m_fNear,m_fFar,m_ViewRect.m_top,m_ViewRect.m_bottom,m_ViewRect.m_left,m_ViewRect.m_right);
		}
		else
		{
			matProject.LoadIdentity();
		}
		return ;

	}

	/*****************************************************************
	摄影机的俯仰和旋转函数
	*****************************************************************/
	void XCamera::Yaw(float angle)
	{
             XVector vDir  = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
             XVector newDir;
             float len = vDir.len();

             vDir.normalize();
             XMatrix matRot ;
             XM_Rotate(matRot,m_Eye.m_Up,angle);
             XMatrix_Mul(vDir,matRot,newDir);

             newDir = newDir * len;
	     m_Eye.m_EyeTarget = m_Eye.m_EyePos + newDir;

	}
	void XCamera::Pitch(float angle)
	{
		XVector vDir  = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
		float len = vDir.len();
		vDir.normalize();
		XVector vLeft = vDir.cp(m_Eye.m_Up);

		XVector newDir;
		XVector newUp;

		XMatrix matRot;
		XM_Rotate(matRot,vLeft,angle);

		XMatrix_Mul(vDir,matRot,newDir);
		XMatrix_Mul(m_Eye.m_Up,matRot,newUp);
		m_Eye.m_Up = newUp;
                newDir = newDir * len;
		m_Eye.m_EyeTarget = m_Eye.m_EyePos + newDir;
	}

	void XCamera::Roll(float angle)
	{
		XVector vDir  = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
		vDir.normalize();
		XVector vLeft = vDir.cp(m_Eye.m_Up);

		XVector newUp;

		XMatrix matRot;
		XM_Rotate(matRot,vDir,angle);

		XMatrix_Mul(m_Eye.m_Up,matRot,newUp);
		m_Eye.m_Up = newUp;
	}

	void XCamera::Circle(float angle)
	{
             XVector vDir  = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
             XVector newDir;
             float len = vDir.len();

             vDir.normalize();
             XMatrix matRot ;
             XM_Rotate(matRot,m_Eye.m_Up,angle);
             XMatrix_Mul(vDir,matRot,newDir);

             newDir = newDir * len;
	     m_Eye.m_EyePos = m_Eye.m_EyeTarget - newDir;
	}


	/*****************************************************************
	摄影机的位置改变。函数。
	*****************************************************************/
	void XCamera::Toward(float dist)
	{
		XVector vDir = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
		vDir.normalize();
		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)
	{
		XVector 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)
	{

		//向右移动为正
		XVector vDir  = m_Eye.m_EyeTarget - m_Eye.m_EyePos;
		XVector vLeft = vDir.cp(m_Eye.m_Up);
		vLeft.normalize();
		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;	
	}


};

⌨️ 快捷键说明

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