📄 xcamera.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 + -