游戏引擎中的相机系统
2008-12-21 12:13
141 查看
下面应用《微分几何》中的欧氏空间等距变换,导出从世界坐标系到观察坐标系的变换,并结合directx9.0和C++来实现一个简单的相机类。
1。假设世界坐标系用I=(i,j,k)和O(0,0,0)来表示,观察坐标系用E=(e1,e2,e3)和P(a,b,c)来表示,其中,E=A*I(这里E和I表示为列向量)。A为正交矩阵,由A1=(a11,a12,a13),A2=(a21,a22,a23),A3=(a31,a32,a33)组成。
2。设世界坐标系中的任意一点Q(x,y,z)在观察坐标系中表示为(x0,y0,z0),于是有OQ = OP + PQ (向量,由于不太方便,在此并未给出图形)
(x,y,z)*I = (a,b,c)*I + (x0,y0,z0)*E, (I,E为列向量)
(x,y,z)*I = (a,b,c)*I + (x0,y0,z0)*A*I; (E=A*I)
于是有(x0,y0,z0)* A= (x,y,z) - (a,b,c);
(x0,y0,z0) = ((x,y,z) - (a,b,c))*A-1; (A-1表示A的逆)
(x0,y0,z0) = ((x,y,z) - (a,b,c))*At; (At表示A的的转置,因为A为正交矩阵,逆等于转置)
用齐次坐标表示为
(x0,y0,z0) = (x,y,z)*B; (B为A的逆矩阵)
B由 B1=(a11,a21,a31,0),B2 =(a12,a22,a32,0),B3 = (a13,a23,a33,0),B4 =(-a*e1,-b*e2,-c*e3,1)组成
因此相机类的代码如下,仅给出部分代码
class CCamera
{
public:
CCamera(); //构造函数
virtual ~CCamera(){}; //析构函数
void GetMatrix(D3DXMATRIX& matrix) ; //获得变换矩阵
void SetPosition(const D3DXVECTOR3& pos); //设置位置
void GetPosition(D3DXVECTOR3& pos) const; //获得位置坐标
virtual void Walk(float units) = 0; //前后移动
virtual void Strafe(float units) = 0; //左右移动
virtual void Fly(float units) = 0; //上下移动
virtual void Pitch(float angle); //仰俯
virtual void Yaw(float angle); //偏航
virtual void Roll(float angle)=0; //滚动
protected:
D3DXVECTOR3 m_position; //位置(P)
D3DXVECTOR3 m_right; //右向量(e1)
D3DXVECTOR3 m_up; //上向量(e2)
D3DXVECTOR3 m_look; //方向向量(e3)
};
//计算观察矩阵
void CCamera::GetMatrix(D3DXMATRIX& matrix)
{
//规范化向量
D3DXVec3Normalize(&m_look,&m_look);
D3DXVec3Cross(&m_up,&m_look,&m_right);
D3DXVec3Normalize(&m_up,&m_up);
D3DXVec3Cross(&m_right,&m_up,&m_look);
D3DXVec3Normalize(&m_right,&m_right);
//计算A的逆矩阵B
matrix._11 = m_right.x; matrix._12 = m_up.x; matrix._13 = m_look.x; matrix._14 = 0; //B1
matrix._21 = m_right.y; matrix._22 = m_up.y; matrix._23 = m_look.y; matrix._24 = 0; //B2
matrix._31 = m_right.z; matrix._32 = m_up.z; matrix._33 = m_look.z; matrix._34 = 0; //B3
//B4
matrix._41 = - D3DXVec3Dot(&m_position,&m_right);
matrix._42 = - D3DXVec3Dot(&m_position,&m_up);
matrix._43 = - D3DXVec3Dot(&m_position,&m_look);
matrix._44= 1.0f;
}
1。假设世界坐标系用I=(i,j,k)和O(0,0,0)来表示,观察坐标系用E=(e1,e2,e3)和P(a,b,c)来表示,其中,E=A*I(这里E和I表示为列向量)。A为正交矩阵,由A1=(a11,a12,a13),A2=(a21,a22,a23),A3=(a31,a32,a33)组成。
2。设世界坐标系中的任意一点Q(x,y,z)在观察坐标系中表示为(x0,y0,z0),于是有OQ = OP + PQ (向量,由于不太方便,在此并未给出图形)
(x,y,z)*I = (a,b,c)*I + (x0,y0,z0)*E, (I,E为列向量)
(x,y,z)*I = (a,b,c)*I + (x0,y0,z0)*A*I; (E=A*I)
于是有(x0,y0,z0)* A= (x,y,z) - (a,b,c);
(x0,y0,z0) = ((x,y,z) - (a,b,c))*A-1; (A-1表示A的逆)
(x0,y0,z0) = ((x,y,z) - (a,b,c))*At; (At表示A的的转置,因为A为正交矩阵,逆等于转置)
用齐次坐标表示为
(x0,y0,z0) = (x,y,z)*B; (B为A的逆矩阵)
B由 B1=(a11,a21,a31,0),B2 =(a12,a22,a32,0),B3 = (a13,a23,a33,0),B4 =(-a*e1,-b*e2,-c*e3,1)组成
因此相机类的代码如下,仅给出部分代码
class CCamera
{
public:
CCamera(); //构造函数
virtual ~CCamera(){}; //析构函数
void GetMatrix(D3DXMATRIX& matrix) ; //获得变换矩阵
void SetPosition(const D3DXVECTOR3& pos); //设置位置
void GetPosition(D3DXVECTOR3& pos) const; //获得位置坐标
virtual void Walk(float units) = 0; //前后移动
virtual void Strafe(float units) = 0; //左右移动
virtual void Fly(float units) = 0; //上下移动
virtual void Pitch(float angle); //仰俯
virtual void Yaw(float angle); //偏航
virtual void Roll(float angle)=0; //滚动
protected:
D3DXVECTOR3 m_position; //位置(P)
D3DXVECTOR3 m_right; //右向量(e1)
D3DXVECTOR3 m_up; //上向量(e2)
D3DXVECTOR3 m_look; //方向向量(e3)
};
//计算观察矩阵
void CCamera::GetMatrix(D3DXMATRIX& matrix)
{
//规范化向量
D3DXVec3Normalize(&m_look,&m_look);
D3DXVec3Cross(&m_up,&m_look,&m_right);
D3DXVec3Normalize(&m_up,&m_up);
D3DXVec3Cross(&m_right,&m_up,&m_look);
D3DXVec3Normalize(&m_right,&m_right);
//计算A的逆矩阵B
matrix._11 = m_right.x; matrix._12 = m_up.x; matrix._13 = m_look.x; matrix._14 = 0; //B1
matrix._21 = m_right.y; matrix._22 = m_up.y; matrix._23 = m_look.y; matrix._24 = 0; //B2
matrix._31 = m_right.z; matrix._32 = m_up.z; matrix._33 = m_look.z; matrix._34 = 0; //B3
//B4
matrix._41 = - D3DXVec3Dot(&m_position,&m_right);
matrix._42 = - D3DXVec3Dot(&m_position,&m_up);
matrix._43 = - D3DXVec3Dot(&m_position,&m_look);
matrix._44= 1.0f;
}
相关文章推荐
- 基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
- atitit ui引擎之道 游戏引擎之道.docx 1. 概念 2 1.1. (cocos,createjs,dom) 2 2. 游戏引擎的构成(图形引擎(渲染系统),控件部件系统,事件系统 ,布局
- TGE游戏引擎--开发初级武器系统-总览(添加并可以自由切换AK47,散弹枪,激光武器等等)一
- libgdx游戏引擎教程(三)libgdx粒子系统的使用
- 从零实现3D图像引擎:(12)构建支持欧拉和UVN的相机系统
- 【Cocos2d-x游戏引擎开发笔记(4)】系统动画
- Atitit 游戏引擎---物理系统(1)------爆炸效果
- 盖莫游戏引擎-GUI系统-布局管理器
- 检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
- 游戏引擎与仿真系统
- 【Cocos2d-x游戏引擎开发笔记(4)】系统动画
- libgdx游戏引擎——libgdx粒子系统的使用
- Atitit 游戏引擎---物理系统(1)------爆炸效果
- 游戏引擎剖析 (6) 声音系统,音频
- 游戏引擎架构1:游戏性系统
- 游戏引擎基础(六)(声音系统,音频APIs)
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理--旧的动画系统)
- Android游戏引擎libgdx使用教程8:相机和观察点
- Javascript识别各种浏览器、渲染引擎、系统平台(操作系统|移动设备|游戏系统)
- 游戏引擎剖析 (8) 脚本系统