?? xcamera.cpp
字號(hào):
#include "XCamera.h"
namespace XGeomLib
{
/*
將眼睛信息轉(zhuǎn)化成視圖矩陣。
*/
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)
{
}
/**
從一個(gè)Camera對(duì)象構(gòu)造出兩個(gè)矩陣。
一個(gè)投影矩陣,
一個(gè)視圖矩陣,
*/
void XCamera::ToMatrix(XMatrix& matView,XMatrix& matProject)
{
/*構(gòu)造視圖矩陣*/
m_Eye.ToMatirx(matView);
/*
注意,這是個(gè)投影矩陣。可能有好幾種投影方式。
平行投影和透視投影在本庫中被支持
*/
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 ;
}
/**
從攝影機(jī)里構(gòu)造出一個(gè)視圖矩陣
*/
void XCamera::ToViewMatrix(XMatrix& matView)
{
m_Eye.ToMatirx(matView);
}
/**
從一個(gè)攝影機(jī)里構(gòu)造出一個(gè)投影矩陣出來
*/
void XCamera::ToProjectMatrix(XMatrix& matProject)
{
/*
注意,這是個(gè)投影矩陣。可能有好幾種投影方式。
平行投影和透視投影在本庫中被支持
*/
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 ;
}
/*****************************************************************
攝影機(jī)的俯仰和旋轉(zhuǎn)函數(shù)
*****************************************************************/
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;
}
/*****************************************************************
攝影機(jī)的位置改變。函數(shù)。
*****************************************************************/
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)
{
//向右移動(dòng)為正
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;
}
};
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -