文档章节

坐标变换

rise-worlds
 rise-worlds
发布于 2016/06/20 13:42
字数 1334
阅读 6
收藏 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

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

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

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

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

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

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

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

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

长平狐
2013/01/06
1.1K
0
CSS3 2D Transform Matrix

给自己出了一道题如下: 题目 在某个大矩形中心有一个的矩形,对该黄色矩形进行一系列变换得到灰色矩形; 以大矩形中心为,屏幕水平向左为,屏幕垂直向上为,黄色矩形初始位置中心在坐标原点...

NewbieYoung
2019/05/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

npm 发布webpack插件 webpack-html-cdn-plugin

初始化一个项目 npm init 切换到npm源 淘宝 npm config set registry https://registry.npm.taobao.org npm npm config set registry http://registry.npmjs.org 登录 npm login 登录状态......

阿豪boy
32分钟前
55
0
java基础(16)递归

一.说明 递归:方法内调用自己 public static void run1(){ //递归 run1(); } 二.入门: 三.执行流程: 四.无限循环:经常用 无限递归不要轻易使用,无限递归的终点是:栈内存溢出错误 五.递...

煌sir
37分钟前
35
0
REST接口设计规范总结

URI格式规范 URI中尽量使用连字符”-“代替下划线”_”的使用 URI中统一使用小写字母 URI中不要包含文件(脚本)的扩展名 URI命名规范 文档(Document)类型的资源用名词(短语)单数命名 集合(Co...

Treize
今天
57
0
CentOS-配置YUM源加速(阿里云、Nexus3)

备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6 $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/......

-自由人生-
今天
80
0
我如何获取一周中开始的DateTime?

我如何只知道C#中的当前时间来查找一周的开始(星期日和星期一)? 就像是: DateTime.Now.StartWeek(Monday); #1楼 丑陋,但至少可以给您正确的日期 通过系统设置星期开始时间: publ...

javail
今天
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部