文档章节

坐标变换

rise-worlds
 rise-worlds
发布于 2016/06/20 13:41
字数 1334
阅读 1
收藏 0

1)世界变换

我们在建立三维实体的数学模型时,通常以实体的某一点为坐标原点,比如一个球体,很自然就用球心做原点,这样构成的坐标系称为本地坐标系(Local Coordinates)。实体总是位于某个场景(World Space)中,而场景采用世界坐标系(World Coordinates),如图所示,因此需要把实体的本地坐标变换成世界坐标,这个变换被称为世界变换(World Transformation)。

clip_image001

屏幕剪辑的捕获时间: 2007/6/22, 15:58

在Direct3D中,坐标变换通过一个4X4矩阵来实现,对于世界变换,只要给出实体在场景中的位置信息,就可以借助Direct3D函数得到变换矩阵,具体计算步骤如下:

  • 首先把实体旋转在世界坐标系的原点,使两个坐标系重合;
  • 在世界空间中,对实体进行平等移动,其对应的平移变换阵TT可由函数D3DXMatrixTranslation求得;
  • 把平移后的实体沿自身的Z轴旋转一个角度(角度大于0,表示从Z轴的正向朝原点看上去,旋转方向为顺时针;反之为逆时针,下同),对应的旋转变换阵TZ用D3DXMatrixRotationZ计算;
  • 把实体沿自身的Y轴旋转一个角度,用D3DXMatrixRotationY求出变换阵TY;
  • 把实体沿自身的Y轴旋转一个角度,用D3DXMatrixRotationX求出变换阵TX;
  • 最后对实体进行缩放,假设三个轴的缩放系数分别为SX、SY、SZ,该操作对应的变换阵TS可由函数D3DXMatrixScaling求得;
  • 最终的世界变换矩阵TW=TS·TX·TY·TZ·TT,在Direct3D中,矩阵乘法用函数D3DXMatrixMultiply实现,注意相乘顺序为操作的逆序。

从以上描述中,我们很容易得出:实体的运动可以通过不断的改变世界变换矩阵来实现。

2)视角变换

实体确定后,接下来确定观察者在世界坐标系中的方位,换句话说,就是在世界坐标系中如何放置摄像机.观察者(摄像机)所看到的景象,就是Direct3D窗口显示的内容.

确定观察者需要三个量:

  • 观察者的点坐标;
  • 视线方向,为一个矢量,不过Direct3D用视线上的一个点来替代,此时视线方向就是从观察者指向该目标点,这样表示更直观一些;
  • 上方向,通俗地说,就是观察者的头顶方向,用一个矢量表示.

确定后,以观察者为原点,视线为Z轴,上方向或它的一个分量为Y轴(X轴可由左手法则得出,为右方向),构成了视角坐标系,如下图所示.我们需要把实体从世界空间转换到视角空间,这个坐标变换被称为视角变换(View Transformation).

clip_image002

屏幕剪辑的捕获时间: 2007/6/22, 20:56

与世界变换相比,视角变换矩阵的获取要容易得多,只需调用一个函数D3DXMatrixLookAtLH,其输入参数就是决定观察者的那三个量.

3)投影变换

实体转换到视角空间后,还要经过投影变换(Projection Transformation)三维的实体才能显示在二维的计算机屏幕上.

Direct3D使用透视投影变换(Perspective Transformation),此时在视角空间中,可视区域是一个以视线为轴心的棱台(Viewing Frustum),如下图所示.想象一下你处在一个伸手不见五指的房间里,面前有一扇窗户,你可以透过窗户看到各种景物.窗户就是棱台的前裁剪平面,天空、远山等背景是后裁剪平面,期间的可视范围是景深。投影变换把位于可视棱台内的景物投影到前裁剪平面,其间的可视范围是景深。投影变换把位于可视棱台内的景物投影到前裁剪平面,由于采用透视投影,距离观察者远的对象会变小,从而更具有真实感。在Direct3D中,前裁剪平面被映射到程序窗口,最终形成了我们在屏幕上版的画面。

clip_image003

屏幕剪辑的捕获时间: 2007/6/22, 21:10

透视投影变换由四个量决定:

  • 前裁剪平面的宽度W;
  • 前裁剪平面的高度H;
  • 前裁剪平面到原点的距离Z1;
  • 后裁剪平面到原点的距离Z2。

由于W、H用起来不是很直观,因此实际应用中,常用fov和aspect代替W、H,其中fov是Y方向上的可视角度,通常取π/4;aspect是前裁剪平面的高度与宽度之比,通常取1(由三角函数定义,易知H=2·z1·tg(fov/2),W=H/aspect)。用这四个量来调用函数D3DXMatrixPerspectiveFovLH,即可获得投影变换矩阵。

得到三个变换矩阵后,还需要调用方法 IDirect3DDevice9::SetTransform把它们设置到渲染环境中。

最后,可以用三句话来概括这些变换的作用:世界变换决定实体的位置;视角变换决定观察者的位置;投影变换决定观察者的可视区域。

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/10/13/923287.html

共有 人打赏支持
上一篇: 蚂蚁的故事
下一篇: 重构代码
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
opencv 几何变换 二维仿射变换和三维的透视变换

二维仿射变换,相当于将二维平面上的每个坐标点与一个2X3的矩阵相乘,得到新的坐标,而透视变换则是与3X3的矩阵相乘,原本平行的两条直线在经过仿射变换后依然平行,但经过透视变化之后,可能...

阿豪boy
2018/08/25
0
0
GDAL影像投影转换

GDAL影像投影转换 又有一段时间没有写博客了,今天就把影像(DEM/遥感影像等)投影转换的经验和大家分享下。那么关于GDAL影像投影转换的文章在网上可以说是有很多,如果你还不清楚地图投影那...

长平狐
2013/12/25
745
0
图形系统中的仿射变换

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 在学图形学的时候,仿射变换肯定会遇到,那到底什么是仿射变换了?在做仿射变换时一...

乾初
2018/02/07
0
0
Qt坐标系统

坐标变换 World Corrdinates ==> Window Coordinates ==> Device Coordinates (逻辑坐标) 世界变换 中间态坐标 窗口视口变换 (物理坐标) 在默认情况下,3个坐标系是一致的。 世界变换 世界变...

长平狐
2013/01/06
1K
0
cesiumjs开发实践(五) 坐标变换

cesium中常用的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系。我们平时常用的以经纬度来指明一个地点就是用的WGS84坐标,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放等等。二者...

kamijawa
2014/07/14
0
2

没有更多内容

加载失败,请刷新页面

加载更多

租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
43分钟前
1
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
2
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
1
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部