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

转自:图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵_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,一经查实,立即删除!

相关文章

【转】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…

【转】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。以下内…

【转】DICOM开发工具总结

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

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

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

修改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;只要是中国人…

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

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

【转】软件工程能力漫谈:比质量更重要的,是项目管理能力

转自&#xff1a;软件工程能力漫谈&#xff1a;比质量更重要的&#xff0c;是项目管理能力 | ArchSummit 章淼老师在软件工程能力方面&#xff0c;积累了多年的经验&#xff0c;这个话题他之前也分享过多次&#xff0c;整体上内容有修改调整。 章老师博士毕业后在清华待了 12…

【转】DICOM文件格式剖析(初识)

转自&#xff1a;DICOM文件格式剖析&#xff08;初识&#xff09;_MoreThinker的博客-CSDN博客_dicom格式 初识DICOM&#xff08;适合初学者&#xff09; 初识DICOM文件&#xff0c;发现网上的资料有点少&#xff0c;大部分的资料都不全&#xff0c;在这里做一下总结&#xf…

【转】进阶 JavaScript 必知的 33 个点【进阶必备】

转自&#xff1a;进阶 JavaScript 必知的 33 个点【进阶必备】 进阶 JavaScript 必知的 33 个点【进阶必备】 Original 前端小菜鸡之菜鸡互啄 前端开发爱好者 2022-04-11 08:32 收录于话题#javaScript进阶1个 点击下方“前端开发爱好者”&#xff0c;选择“设为星标” 第一…

【转】自动化构建、自动化部署发布一览

转自&#xff1a;自动化构建、自动化部署发布一览 - 知乎 在软件系统开发的过程中&#xff0c;一个项目工程通常会包含很多的代码文件、配置文件、第三方文件、图片、样式文件等等&#xff0c;是如何将这些文件有效的组装起来最终形成一个可以流畅使用的应用程序的呢&#xff…

承博士:让云计算落地生根的中国云计算平台

2010-01-22 09:48:41 [0评论 ] 金蝶中间件秉承自主创新&#xff0c;努力打造自主知识产权的云计算平台;金蝶Apusic云计算解决方案是为大型企业和组织提供私有云的解决方案&#xff0c;通过云计算中间件平台&#xff0c;为云计算提供落地的务实价值。金蝶中间件与国际厂商合作&…

Microsoft Windows CE .NET 中的中断体系结构

概述 通过 Microsoft Windows CE .NET&#xff0c;Microsoft 已经升级了 Windows CE 的中断体系结构。该操作系统 (OS) 所具有的处理共享中断的能力极大地扩展了 Windows CE .NET 支持许多中断体系结构的能力。本文从原始设备制造商 (OEM) 和应用程序开发人员的角度探讨了处理…

微软企业库5.0学习笔记(三十三)数据访问模块

前言 鉴于企业库5.0已经发布正式版&#xff0c;同时有广大读者的要求&#xff08;臭屁一下&#xff0c;o(∩_∩)o...&#xff09;&#xff0c;后面文章的内容和代码将基于Enterprise Library5.0和Unity2.0来写&#xff0c;感谢大家的一贯支持。 正文 数据库访问模块都能实现哪些…

ARM中断分析之一:中断控制器和CPU、外设的关系

“中断控制器”也是CPU众多外设中的一个&#xff0c;不同的是&#xff0c;它一方面接收其它外设中断引脚的输入&#xff0c;另一方面&#xff0c;它会发出中断信号给CPU。下图是一张中断控制器外设的框图&#xff0c;s3c2410的框图。 为了把中断控制器、CPU、外设联系起来&…

【转】Jenkins项目常用三种构建类型风格详解

转自&#xff1a;Jenkins项目常用三种构建类型风格详解_ぃ小小宇宙的博客-CSDN博客_jenkins项目类型 Jenkins构建的项目类型介绍 jenkins 的安装配置请参考&#xff1a;《jenkins war包安装部署&#xff0c;tomcatJDKmaven》 Jenkins中自动构建项目的类型有很多&#xff0c;…

ARM中断分析之二:裸机下面的中断处理

EINT4中断的裸机处理 这是基于S3C2410的EINT4中断的裸机处理&#xff0c;当中断发生时就把LED灯取反显示。下面是电路图。 上面是外部KEY连接到CPU的EINT4引脚上面&#xff0c;即&#xff1a;按下键就会产生一个中断。 按照先前介绍的&#xff0c;中断处理流程来介绍&#xff0…