【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

转自:图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵

图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

  • 图形流水线中坐标变换过程
  • 模型矩阵:模型局部坐标系和世界坐标系之间的桥梁
    • 1.模型局部坐标系存在的意义
    • 2.根据模型局部坐标系中点求其在世界坐标系中的坐标(Model_to_Wrold) or 根据世界坐标系的点求其在模型坐标系中的坐标(Wrold_to_Model)
    • 3.结论:模型矩阵等于模型局部坐标系的矩阵表示法
  • 视角矩阵:世界坐标系和视角坐标系(摄像机坐标系)直接的桥梁
    • 1.视角坐标系如何构成
    • 2.Camera_to_Wrold / World_to_Camera
    • 3.结论:视角矩阵就是视角局部坐标系的矩阵表示法的逆矩阵
  • 投影矩阵:3D to "2D"
    • 1.CG中3D to "2D"原理:小孔成像
    • 2.CG中模拟小孔成像与现实小孔成像的区别
    • 3.区分image plane distace 和 near clipping plane distance 和 focal length
    • 4.投影矩阵推导
  • 窗口变换:渲染到输出对象上
    • 1.Resolution Gate and Film Gate Ratio
    • 2.Resolution Gate and Film Gate Ratio don't match

本文重点介绍图形流水线中出现的各种坐标系,以及实现在这些坐标系之间转换的数学知识。希望能方便大家更加深入了解图形学基础,更好的学习图形学。如果文章中有错误也请大家积极指正。文章的主要参考来源有:
1.Scratchapixel 2.0:Rendering an Image of a 3D Scene: an Overview
2.Scratchapixel 2.0:Computing the Pixel Coordinates of a 3D Point
3.深入探索透视投影变换


图形流水线中坐标变换过程

在这里插入图片描述


模型矩阵:模型局部坐标系和世界坐标系之间的桥梁

1.模型局部坐标系存在的意义

简单用一句话来说:方便建模人员。如果把“经纬度和高程”比作世界坐标系,那么“北京市海淀区学院路37号”就是模型局部坐标系下的一个坐标,而这个模型局部坐标系可以是“北京市”,也可以是“北京市海淀区”,甚至可以是“北京市海淀区学院路”。我们在CG中展现的各种各样物体是很多建模人员努力的结果,我们无法规定一个统一的坐标系,让所有物体都在这个坐标系上建模(一方面是考虑到单位精度,二是在模型局部坐标系下能更方便的描述模型的具体位置)。因此一般模型默认都是在模型坐标系下。

2.根据模型局部坐标系中点求其在世界坐标系中的坐标(Model_to_Wrold) or 根据世界坐标系的点求其在模型坐标系中的坐标(Wrold_to_Model)

那么如何从模型坐标系变换到世界坐标系呢,我们先给出一些默认参数,以及一些矩阵知识:

  • CG中世界坐标系三个基底分别为e1(1,0,0), e2(0,1,0), e3(0,0,1),坐标系原点为O (0,0,0)
  • 坐标系的矩阵表示法(行主序,以世界坐标系为例):
    在这里插入图片描述
  • 不同坐标系下坐标点相互转换满足:
    P1 * M1 = P2 * M2
    其中 M1为坐标系1的矩阵表示,P1为点P在坐标系1下的坐标表示;M2为坐标系2的矩阵表示,P2为点P在坐标系2下的坐标表示

根据上述,我们就可以求得模型局部点在世界坐标系下的表示。
假设世界坐标系矩阵表示为Mworld
模型坐标系矩阵表示为Mmodel
模型上点在世界坐标系下的表示为Pworld
模型上点在模型坐标系下的表示为Pmodel
则有:
Pworld * MworldCoord = Pmodel * MmodelCoord
Pworld = Pmodel * MmodelCoord * M-1worldCoord
由世界坐标系的特点知:MworldCoord = I(单位矩阵)
所以:Pworld = Pmodel * MmodelCoord
反之,我们也可以从世界坐标反求得模型坐标
Pmodel = Pworld * M-1modelCoord

接下来我们来确定模型坐标系的矩阵表示:
假设模型坐标系为下图所示的右上角坐标系,其基底在世界坐标系的表示分别为e1 (0.71, 0.61, -0.32), e2(-0.39, 0.74, 0.53), e3(0.57, -0.25, 0.77),原点在世界坐标系下的表示为 O (0.52, 1.25, -2.53)
在这里插入图片描述
则:
在这里插入图片描述

3.结论:模型矩阵等于模型局部坐标系的矩阵表示法

总结上述推论:
因为图形流水线中模型矩阵的作用是将模型局部坐标变换为世界坐标系下的坐标
所以图形流水线中的ModelMatrix = MmodelCoord。
即模型矩阵就是模型局部坐标系的矩阵表示法。


视角矩阵:世界坐标系和视角坐标系(摄像机坐标系)直接的桥梁

视角坐标系可以看做是一个模型坐标系。转换方法与世界坐标系转模型坐标系方法相同。

1.视角坐标系如何构成

视角也被称为相机。我们在设定相机时,在必须设定的参数中,有三个参数与视角坐标系构成相关

  • LookAt : 相机看向的地方, 用一个向量表示
  • Up : 相机的“头顶”,用一个向量表示
  • Posiiton : 相机放置的地方

在这里插入图片描述
那么如何确定相机坐标系的基底呢?请看下图
在这里插入图片描述
通过三步叉乘求得相机坐标系的基底:

  • Z = cameraPosition - LookAtPostion
  • X = up.Cross(Z)
  • Y = Z.Cross(X)

知道了相机坐标系基底,知道了相机的位置。根据模型局部坐标系和世界坐标系之间的转换我们可以很容易的推导出相机坐标系的矩阵表示法:
在这里插入图片描述

2.Camera_to_Wrold / World_to_Camera

同理根据模型局部坐标系和世界坐标系的相互转换规则,我们可以列出下面的式子:

  • Pview * MviewCoord = Pworld * MworldCoord
  • Pview = Pworld * MworldCoord * M-1viewCoord
    = Pworld * M-1viewCoord
  • Pworld = Pview * MviewCoord

3.结论:视角矩阵就是视角局部坐标系的矩阵表示法的逆矩阵

因为图形流水线中视角矩阵的作用是将世界坐标系坐标转换为视角坐标系的坐标。
所以图形流水线中的ViewMatrix = M-1viewCoord。
即视角矩阵就是视角局部坐标系的矩阵表示法的逆矩阵。


投影矩阵:3D to “2D”

1.CG中3D to "2D"原理:小孔成像

在这里插入图片描述
上图很好的描述了小孔成像的原理。画布(film)记录了经过物体反射/折射等,并顺利 通过光圈(aperture)的光线的颜色。
小孔成像中与成像结果相关的因素:

  • 光圈(aperture)与小孔成像的关系
    当光圈变大时,能够“打到”film的光束更多。但这也意味着,在film上同一个点上,可能有多个光线同时击中。或者反过来说,从观察体上某点P发射出的光线,可能落在film的多个点上。
    在这里插入图片描述
    这样导致的结果就是,光圈越大,成像会越模糊;光圈越小,成像越锋利。
    在这里插入图片描述
    理想情况应该是光圈小到只允许一跟光线通过。但是在现实生活中这无法实现:首先是无法生产出这样的光圈,其次是光具有波粒二象性。

  • 景深与小孔成像的关系
    景深规定了一个最近和最远距离,只有在这个距离范围内的物体才会锋利显示,在景深外的物体成像会模糊。而小孔成像的景深是无限的,所以只要光圈足够小,小孔成像的结果总是锋利的。

  • 焦距(focal length)与小孔成像的关系
    焦距在小孔成像中可以定义为光圈到film的距离。焦距对小孔成像的影响主要体现在焦距变化引起视角的变化:焦距越小,视角越大;焦距越大,视角越小。
    在这里插入图片描述

  • 画布大小(film size)与小孔成像的关系
    画布大小也是通过影响视角大小来影响成像效果:画布越大,视角越大;画布越小,视角越小。

在这里插入图片描述

2.CG中模拟小孔成像与现实小孔成像的区别

  • CG中光圈可以设置为只允许单根光线通过;CG中没有光线用射线代替,不存在波粒二象性问题。且因为小孔成像景深是无限的。因此CG中Camera成像的结果一定是“锋利”的。
  • CG中为了大致模拟景深效果,会设置一个前后裁剪面(near / far clipping plane),在前后裁剪面之间的观察体才能显示,在外部的观察体全部不显示。
  • 现实生活中film都在光圈的后面,因为要提供一个黑盒的环境,让感光材质只接受通过光圈的光线。而CG中允许将film设置到光圈前,且这样更方便成像(因为设置在光圈后的成像是上下颠倒的)。
  • CG中eye即代表小孔成像中那个光圈,CG中视角由小孔成像中焦距和画布大小确定。

3.区分image plane distance 和 near clipping plane distance 和 focal length

  • focal length 和 film size 都是小孔成像中的说法。在小孔成员原理中我们知道,两者都可以改变视角的大小,以水平方向上视角为例,它们的关系为:
    在这里插入图片描述

  • image plane可以放在相机Z负方向上的任何地方。它是作为CG中接收图像的平面。image的大小是由视角和它与eye的距离来确定的。
    在这里插入图片描述

  • 前裁剪面,单纯设定前可视范围
    在这里插入图片描述

  • 这三个变量的定义在本质上是完全不相关的。不过在CG中,一般默认将image plane设置到near clipping plane处

4.投影矩阵推导

在这里插入图片描述
以该图为例进行推导:

  1. 求image Plane大小:
    在这里插入图片描述
  2. 求P的对应点P’
    在这里插入图片描述
  3. 将P’点变换到NDC坐标系中
    在这里插入图片描述
    上图中求解a/b的方程列错了 应该是
    -(aN + b) = -N -(aF + b) = F 不过最终得到的a/b结果是正确的。请大家验证。
    在这里插入图片描述
    在这里插入图片描述

窗口变换:渲染到输出对象上

从规则化设备坐标变换到窗口上,需要考虑窗口的大小,以及窗口坐标原点的位置。以渲染为图像为例,图像的原点在左上角。
在这里插入图片描述
Ppixel.x = [ PNDC.x * Screen.Width ]
Ppixel.x = [ ( 1.0 - PNDC.y ) * Screen.Height ]

1.Resolution Gate and Film Gate Ratio

  • Film Gate Ratio是指film的宽高比
  • Resolution Gate Ratio是指窗口(Screen or Window)的宽高比

2.Resolution Gate and Film Gate Ratio don’t match

当Resolution Gate Ratio 与 Film Gate Ratio比例不一样时,选择哪个比例作为输出会产生不一样结果。因此一般3D建模软件在渲染时,都会让用户选定按哪种比例进行渲染。
在这里插入图片描述

  • Fill:用Resolution Gate Ratio的比例来渲染整个图像
    如果FGR > RGR: X方向需要乘上一个Scale; XScale = RGR / FGR ;
    如果FGR < RGR:Y方向上乘上一个Scale: YScale = FGR / RGR ;
  • Overscan:用Film Gate Ratio的比例来渲染整个图像
    如果FGR > RGR: X方向需要乘上一个Scale; XScale = FGR / RGR ;
    如果FGR < RGR:Y方向上乘上一个Scale: YScale = RGR / FGR ;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

set row count

SET ROWCOUNT 使 Microsoft&reg; SQL Server 在返回指定的行数之后停止处理查询。 语法 SET ROWCOUNT { number | number_var } 参数 number | number_var 是在停止给定查询之前要处理的行数&#xff08;整数&#xff09;。 注…

【转】C#开发PACS医学影像处理系统(二):界面布局之菜单栏

转自&#xff1a;C#开发PACS医学影像处理系统(二)&#xff1a;界面布局之菜单栏 - 乔克灬叔叔 - 博客园 在菜单栏布局上&#xff0c;为了使用自定义窗体样式和按钮&#xff0c;我们需要先将窗体设置为无边框&#xff0c;然后添加一个Grid作为菜单栏并置顶&#xff0c;Vertical…

WF4.0 基础篇 (二十九) WorkflowInspectionServices

本文例子下载: http://files.cnblogs.com/foundation/WorkflowInspectionServicesSample.rar WorkflowInspectionServices 类 WorkflowInspectionServices可以得到流程中的Activity&#xff0c; 由于WF4.0的ActivityTree相对复杂,并不是象WF3.X的结构那样清晰, 在WF4.0中Activi…

Linux 命令平时积累

我是Windows Live Writer 写博客&#xff0c;来记录我平时遇到的一些问题和解决的方法。 记得刚刚接触Linux的时候&#xff0c;自己真是一名不折不扣的菜鸟&#xff0c;通过一年的努力&#xff0c;自己可以单独操作Linux了&#xff0c;我将把以后遇到的比较有用的命令积累在这篇…

【转】C#开发PACS医学影像处理系统(三):界面布局之工具栏

转自&#xff1a;https://www.cnblogs.com/Uncle-Joker/p/13650330.html 工具栏布局采用WPF中Grid作为容器&#xff0c;按钮采用自定义样式和图标&#xff0c;并采用Separator分割线&#xff1a; XAML设计器代码&#xff1a; 其中 Style"{StaticResource ButtonStyle}&…

WinCE6.0 修改开机Logo方法

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将 Logo 图片的数据写入到 Nand Flash 中&#xff0c;在启动初始化 LCD 的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。实验平台&#xff1a;WinCE6.0Android6410 4.3寸CLD。以下内…

sql 替换text字段中的指定字符

--text不能直接替换 --mbody未目标字段update b_mail set mbodyreplace(convert(varchar(max),mbody),_viewstate,viewstate) where mno124转载于:https://www.cnblogs.com/stealther/archive/2010/04/02/1703191.html

【转】DICOM开发工具总结

转自&#xff1a;DICOM开发工具总结_qimo601的专栏-CSDN博客 网上流行的DICOM协议开发工具&#xff1a; 1、DICOM开发类库主要有&#xff1a; &#xff08;1&#xff09;DCMTK(3.6.0), 官方下载网站,&#xff08;如何安装编译DCMTK3.6.0&#xff09; DCMTK实现了对DICOM图像…

Wince6.0编译错误经验总结

Wince6.0编译错误经验总结 一 编译wince系统并模拟运行应注意的问题 1&#xff09;&#xff1a; Public目录下的代码最好不要擅自修改。在确认需要修改时&#xff0c;得拷贝出来放到BSP目录下&#xff0c;再根据实际情况进行修改。 另外&#xff0c;编译WinCE系统时&#xff…

使用Combres 库 ASP.NET 网站优化

网站优化理论方面可以看杨正祎同学的文章如何提高网页的效率&#xff08;上篇&#xff09;——提高网页效率的14条准则&#xff0c;如何提高网页的效率&#xff08;下篇&#xff09;——Use YSlow to know why your web Slow&#xff0c;本文给你介绍一个实际的类库帮助你完成网…

【转】foreach for each for_each引发的探讨:c++世界中的循环语句

转自&#xff1a;foreach for each for_each引发的探讨&#xff1a;c世界中的循环语句_w_419675647的博客-CSDN博客 一 背景&#xff1a; 代码中看到 for each&#xff0c;注意&#xff0c;两个单词中间没有下划线&#xff0c;有同事问这个是不是和 for_each一样&#xff1f;…

基于ArcEngine实现分组统计面积的功能

可以使用IQueryFilterDefinition里的PostfixClause来实现SQL语句里的group by, order by等的功能。 例如&#xff1a; IQueryFilter pQueryFilter new QueryFilterClass(); pQueryFilter.subfield"qsdwdm,qsxz,dlbm,sum(mj) as mj,sum(tkmj) as tkmj" pQueryFilter.w…

【转】CT中的“层“与“排“的区别

转自&#xff1a;CT中的"层"与"排"的区别 自从离开医院&#xff0c;专业培训磁共振&#xff0c;有差不多5年时间没有接触CT了。影像技术及影像医学诊断说到底是一门经验技术累积学科&#xff0c;这种学科的特点就是熟能生巧&#xff0c;几年不碰&#xff0…

交易机项目工作日志--2013-01-30

又是一个不眠之夜。 昨天王哥做的新板子&#xff0c;用我编译的内核无法启动&#xff0c;卡在串口的初始化。但用开发板光盘上自带的内核确可以启动。 对比两个内核的打印信息。 [31m[UART] DMA init CH:0 [0m[31m[UART] DMA init CH:1 [0m [31m[UART] DMA init CH:1 [0m[3…

开机显示c:\windows\windows32\config\system文件损坏或丢失的解决方法(收集)

开机显示"c:\windows\windows32\config\system文件损坏或丢失。提示用软盘或光盘启动&#xff0c;用安装盘。 XP系统system文件损坏的修复 2009-04-15 Cbsi中国PChome.net 类型: 转载 来源: 163博客 责编: 吴宏 [评论1条] 方法一&#xff1a;用原盘XP光驱启动&#xff0c;…

修改SMDK6410的调试串口为普通串口(wince系统)

环境&#xff1a; 飞凌OK6410A开发板&#xff0c; Windows CE6.0系统 最近在做GPRS通信&#xff0c;可是手头上的GPRS模块&#xff08;Q2403A&#xff09;是五线串口的&#xff08;RXD、TXD、GND、RCS、CTS&#xff09;&#xff0c;老板又不愿买新的模块。所以考虑将调试串口CO…

【转】CTA图像

转自&#xff1a;CTA图像 CT检查在临床中应用十分广泛&#xff0c;CT以其扫描速度快&#xff0c;对骨头及钙化敏感而具有部分优势。 CTA是CT血管成像&#xff0c;是CT临床应用中一个非常重要的部分&#xff0c;由于血管及其背景软组织自然对比差&#xff0c;常规CT平扫往往难以…

大白话系列之C#委托与事件讲解(一)

从序言中&#xff0c;大家应该对委托和事件的重要性有点了解了吧&#xff0c;虽然说我们现在还是能模糊&#xff0c;但是从我的大白话系列中&#xff0c;我会把这些概念说的通俗易懂的。首先&#xff0c;我们还是先说说委托吧&#xff0c;从字面上理解&#xff0c;只要是中国人…

wince的调试串口作为普通串口使用

目前wince的串口0是作为调试串口用的&#xff0c;但是因为我的案子需要3个串口&#xff0c;所以要把它改为普通串口&#xff0c;但是开机时候还是需要打印debug信息&#xff0c;鉴于此&#xff0c;我修改如下&#xff1a;debug.c中加入一行&#xff1a;int DebugConsoleEnabled…

【转】医学影像处理相关知识整理(一)

转自&#xff1a;医学影像处理相关知识整理&#xff08;一&#xff09; - 知乎 Segmentation to RT structure 近日做医疗影像处理相关的内容&#xff0c;感慨于这方面资料不全、散碎&#xff0c;遂记录自己获得的一些资料以供日后查阅。 DICOM DICOM 是医学图像和相关信息…