DirectX学习笔记(十三):取景变换矩阵计算及3D世界摄像机的原理分析和实现

原创 2016年09月24日 14:07:11

前言:


在玩3D游戏中,我们对于整个游戏场景的视野获取就是通过摄像机来完成的。由此可见摄像机的重要性。前面的所有例子都是针对于摄像机固定来说的。这一次我们来设计一个摄像机(模拟游戏场景中的摄像机)。


取景变换计算过程:


在前面我们讲过取景变换。在当摄像机的位置和朝向任意时,进行一些操作会造成效率低下很是麻烦。为了简化运算,我们将摄像机变换到世界坐标系的原点,并旋转摄像机使其光轴与世界坐标系的z轴正方向朝向一致。要特别注意的是,世界中的所有物体都会随之摄像机变换,以保证摄像机的视场恒定。

如下图:




由此可见,我们要描述一个摄像机必须有四个向量:右向量(right)、上向量(up)、观察向量(look)、位置向量(position)。实际上,这些向量的定义意味着我们定义了一个局部的坐标系。

这样,我们就可以通过这四个向量来进行以下变换:

绕向量right的旋转

绕向量up的旋转

绕向量look的旋转

沿向量right方向的扫视

沿向量up的升降

沿向量look的平动

如下图所示:



那么,我们怎么才能实现这些变换呢?答案:通过矩阵运算!!


 
为了讲解方便,我们令向量

                                 p = (px,py,pz)表示位置向量,position
    r = (rx,ry,rz) 向量表示右向量, right
         u = (ux,uy,uz)  向量表示上向量,up
         d = (dx,dy,dz)  向量表示观察向量。look


我们知道,取景变换所解决的其实就是世界坐标系中的物体在以摄像机为中心的坐标系中如何来表示的问题。这就是说,需要将世界坐标系中的物体随着摄像机一起进行变换,这样摄像机的坐标系就与世界坐标系完全重合了。        


第一张图中的的(a)图到(b)图,是一个平移的过程,而(b)图到(c)图则是一个旋转的过程。另外需要注意的一点是,空间中的物体也应该随着摄像机一同进行变换,这样摄像机中看到景物才没有变化。
我们的目的,就是通过一系列的矩阵变换,得到最终的取景变换矩阵V。


我们要得到取景变换矩阵V,说白了就是能够满足如下的条件: 


pV=(0,0,0) 矩阵V将摄像机移动到世界坐标系的原点
rV=(1,0,0)矩阵V将摄像机的右向量与世界坐标系的x轴重合
uV=(0,1,0)矩阵V将摄像机的上向量与世界坐标系的y轴重合
lV=(0,0,1)矩阵V将摄像机的观察向量与世界坐标系的z轴重合


所以,想得到这个取景变换矩阵V,就是进行了先平移,后旋转。




摄像机操作:


1.平移:


将摄像机的位置向量p平移到原点就是实现这个式子:pV=(0,0,0),即摄像机的位置分量乘以V之后等于(0,0,0)。那么很简单,我们假设取景变换矩阵V实现平移操作的的中间矩阵为T来简化一下。
而将摄像机的位置向量p平移到原点可以通过把他和它大小相等,方向相反的-p向量做加法轻松实现,即p-p=0,所以描述取景变换中的平移



2.旋转:


想要让摄像机的各分量与世界坐标系的各轴重合,
即满足之前我们列出的这三个式子:
rV=(1,0,0)
uV=(0,1,0)
lV=(0,0,1)
实现起来,求出如下的一个3x3的矩阵A:




我们可以看出A是B矩阵的逆矩阵。而矩阵B刚好是个正交矩阵,那么因为:正交矩阵的逆矩阵等于其转置矩阵。也就是说B矩阵的逆矩阵等于B矩阵的转置矩阵,而B矩阵的逆矩阵就是A矩阵,那么就是说A矩阵等于B矩阵的转置矩阵。
那么我们求一下B矩阵的转置矩阵,就是求出A矩阵了。
也就是:




最后我们需要把A矩阵扩展成4X4的,然后计算一下两矩阵的值TA=V:



以上就是取景变换的求法也就是以前我们经常用到的D3DXMatrixLookAtLH函数的计算过程。


摄像机旋转实现:

实现摄像机的旋转,我们需要用到DX中的自带函数:

D3DXMATRIX *WINAPI D3DXMatrixRotationAxis(      
    D3DXMATRIX *pOut,
    CONST D3DXVECTOR3 *pV,
    FLOAT Angle
);


创建一个绕任意轴旋转的旋转矩阵。


参数:
pOut
[in, out] 指向D3DXMATRIX 结构的操作结果矩阵。
pV
[in] 指向任意轴向量。请参考 D3DXVECTOR3。
Angle
[in] 绕着任意轴旋转的角度(单位是弧度)。角度计算方法是当朝着旋转轴的原点看去时,顺时针方向为正值。
返回值:
指向绕着任意轴旋转的旋转矩阵。
说明:
函数返回值跟pOut 参数返回值是一样的。这样可以让函数D3DXMatrixRotationAxis作为其它函数的参数使用。


如果我们要绕向量(0.7,0.07,0.7)所确定的轴旋转90度:

	D3DXMATRIX R;
	D3DXVECTOR3 axis(0.7f, 0.7f, 0, 7f);
	D3DXMatrixRotationAxis(&R, &axis, D3DX_PI / 2.0f);



摄像机的俯仰、偏航、滚动:


请先看以下几张图:



俯仰:绕摄像机的right向量旋转图1

偏航:绕摄像机的up向量旋转图2

滚动:绕摄像机的look向量旋转图3


摄像机的升降、行走和扫视:




行走:沿着摄像机的观察方向(即:沿着向量look方向)的平动。

扫视:沿着right方向从一边走到另一边

升降:沿着up方向的平动。


附加注释代码

点击打开链接

运行效果:





有问题的朋友请留言交流。

版权声明:本文为博主原创文章,未经博主允许不得转载。

摄像机、观察矩阵与取景变换

重看DX龙书,发现之前想不通的地方居然一下就懂了,可能是我太笨,把一些简单问题搞复杂了。 本文记录的是我对取景变换的一些心得。 首先要弄清楚相机代表什么 其实它就是我们的眼睛,因为最终绘制出来的东西...
  • razor87
  • razor87
  • 2013年11月21日 02:04
  • 2442

DirectX 中矩阵得用法

简单来说,DirectX中矩阵得使用分为3个步骤:1. 定义世界变换矩阵。2.定义视口变换举证。3.定义投影变换矩阵。其中第一步中:D3DXMATRIX matWorld;D3DXMatrixRota...
  • NowhereFish
  • NowhereFish
  • 2007年07月28日 23:17
  • 942

Direct-X学习笔记--三维摄像机

一.介绍 哇!到了传说中的3D摄像机啦! 之前我们写的东东,都是观察点不动,通过世界变换让东西动,今天,通过三维摄像机我们就可以改变我们的观察点,观察方向,随意在三维空间中驰骋。之前我们所设定的视角都...
  • puppet_master
  • puppet_master
  • 2015年07月11日 16:19
  • 1548

摸爬滚打DirectX11_day05——三维世界中的四大变换

四大变换: 世界变换 在指定位置绘制图形 取景变换 从不同视角观察图形 投影变换 较劲较远的图形在同一个平面显示可以呈现出近大远小的效果 视口变换 控制显示图形的窗口大小,比例以及深度 前三个变...
  • qq_23225317
  • qq_23225317
  • 2016年12月14日 13:52
  • 247

DX 中的坐标变换

Directx中的坐标变换 (1)世界变换和世界坐标系:物体在三维空间的运动和变形过程称为世界变换,如平移、旋转、缩放等。物体在其中运动的三维空间称为世界空间,它的三维坐标系表示称为世界坐标系,物体顶...
  • Henzox
  • Henzox
  • 2015年05月12日 16:27
  • 1852

OpenGL 矩阵变换(讲的太好了~!)

Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本...
  • lyx2007825
  • lyx2007825
  • 2013年04月12日 15:39
  • 82916

坐标变换 及矩阵变换

为了对一个点进行变换(平移、伸缩、旋转等),可以用一个4 × 4 的的变换矩阵来表示,如最常见的是使用一个模型视图变换矩阵,来变换点、线、多边形以及其它几何体,也可以变换多边形表面的切向量。变换思路...
  • luyuncsd123
  • luyuncsd123
  • 2013年10月31日 11:32
  • 12123

笔记----DX11.0转为DX11.2

在DX11.2中已经移除了D3DX,xnamath等文件 数学库由DirectXMath,D3DX由DirectXTK,DirectXTex代替 DirectXTex:点击打开链接 Direct...
  • u010897187
  • u010897187
  • 2014年12月06日 17:28
  • 1331

3D坐标系、矩阵变换、视景体与裁剪

背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL。曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭。曾几何时微软搞IDE borland公...
  • czh3642210
  • czh3642210
  • 2016年06月16日 11:54
  • 1449

3D 图形编程的数学基础(3) 矩阵基本变换

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 这里开始,是真正的与3D图形编程相关的知识了,前两节只能算是纯数学。   ...
  • vagrxie
  • vagrxie
  • 2009年12月16日 03:19
  • 12204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectX学习笔记(十三):取景变换矩阵计算及3D世界摄像机的原理分析和实现
举报原因:
原因补充:

(最多只允许输入30个字)