草庐IT

计算机图形学-正交投影与透视投影

苏剑涛@XM 2023-07-12 原文

本专栏内容整理了GAMES101的计算机图形学课程的主要内容,作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误,或有其他建议,欢迎大家指出。

附上GAMES101计算机图形学课程:GAMES101: 现代计算机图形学入门正在上传…重新上传取消https://sites.cs.ucsb.edu/~lingqi/teaching/games101.htmlhttps://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibiliGAMES101-现代计算机图形学入门-闫令琪共计23条视频,包括:Lecture 01 Overview of Computer Graphics、Lecture 02 Review of Linear Algebra、Lecture 03 Transformation等,UP主更多精彩视频,请关注UP账号。正在上传…重新上传取消https://www.bilibili.com/video/BV1X7411F744https://www.bilibili.com/video/BV1X7411F744

开始讲解前让我们先回忆下我们平时拍照的一个过程:
首先找一个地方,把所有人都集中在这个地方中。这个过程就是模型变换(改变人的位置)
然后找一个好的位置,和一个好的角度,把相机放好。这个过程就是视图变换(改变相机)
最后按下快门把相机中看到的场景投影到相片上。这就是投影变换

在图形学中,要得到一个画面跟我们平时拍照的过程是类似的。主要就是通过三个变换过程来得到要显示的画面。

视物变换

怎么做视图变换,即我们刚刚说的该如何摆放相机,
即确定:相机放置的位置(position),
和相机应该看向哪里(lookAt)。
此外,还需要定一个相机的向上方向(up),可以理解为相机是竖着拿还是横着拿。

通常,我们把相机永远放在原点上(0,0,0,)。相机沿着-z方向上看。向上方向是y。
position:(0,0,0,1);
lookAt:(0,0,-1,0);
up:(0,1,0,0)

写成矩阵形式:先平移后旋转 ==》

平移:

旋转:当我们要写一个由任意方向向量旋转到x轴上的矩阵会比较困难。但是我们可以利用旋转矩阵是个正交矩阵的特性。先写出由x轴旋转到原方向向量的矩阵,即是方向向量转到x轴的旋转矩阵的逆矩阵。再为原向量应用这个再去求矩阵转置即可把向量旋转到x轴上。

应用矩阵:

到x(1,0,0,0)T 可得到 ,把y,和-z带入可以得到t和g向量。所以这个矩阵就是相机的旋转矩阵的逆矩阵。对其转置就能得到相机的旋转矩阵:

再将相机放置好后,其他的物体与相机的相对位置发生了变化,所以我们还需要对场景中的物体做跟相机一样的变换使其相对位置和相对角度都不变。(比如我现在渲染的是一副从上向下看的图,再移动相机后,相机接收到的画面就会变成正视图,所以还需要将被观察的物体做相同的平移和旋转。之后相机接收到的画面就还是和之前的俯视图一样。注意旋转都是围绕原点旋转。)
 

投影

视图和模型变换结束后,接下来就是吧三维的场景变成观测到的二维的图像。这就是投影。
投影分为正交投影和透视投影。其中透视投影跟我们平时人眼观测到的成像差不多。正交投影就比较难以理解,其实就是不发生近大远小的变化,成像后会人类会觉得远处的东西更大。几何上来说就是,正交投影中平行的线成像后依旧平行。

                       

正交投影(Orthographic Projection)

 在三维空间中规定可观测区域,这个区域是个立方体。需要设置它的宽度(right-left),
高度(top-bottom)和深度(near-far(看向-z所以n比f大))六个数据。在将这个立方体移动、缩小或放大到挤满X(-1~1),Y(-1~1),Z(-1~1)的立方体区域内(这里是约定俗成的做法,是为了后续一些计算)。

 所以正交投影的变换矩阵

透视投影(Perspective Projection)

在透视投影中会发生近大远小的情况,由近到远的平行线,看起来会在非常非常远的地方相交,该怎么处理出这种成像效果呢?这就是透视投影变换需要做的事。

首先我们观察下图中的几何体:

这是类似自然人的视野范围,或者叫做视锥体,它有一个比较小的近平面和一个比较大的远平面,这两个平面是近似等比关系。他们的中心点的x,y坐标都是0(观察点在原点)。

我们发现,当我们将远缩小成跟近平面一样的大小后,锥体会变成一个长方体,接下去我们只要做正交投影即可完成一个透视投影了。

锥体变换成长方体(FrustumToCuboid)Mpersp->ortho
首先我们观察在变换的过程中有以下几个特点:
1.变换后近平面的任何点都不变
2.变换后远平面的z不变(但是并不是说在近平面和远平面之间的平面z的值不会变)
3.变换后远平面的中心点不会变

然后由上图我们可以根据相似三角形知道,在任意z点的平面上,缩小后的平面的x和y会变成n/z倍,只剩变化后的z值我们还未可知。
由此我们可以写出矩阵运算过程如下图:

要求的变换矩阵只剩第三行的元素我们还不清楚了。接下来根据之前列出来的三点变换特点,我们可以对第三行的元素进行推算。
首先根据第一点,我们将近平面的点(x,y,n,1)T 带入变换矩阵运算可以知道第三行的运算如下:

 ?x +?y +?n +? = n² ;所以可以确定n²跟x和y没有关系,也就确定了第三行前两个元素是0;我们把后两个元素标记为A,B。

于是我们可以根据第一点列出:An + B = n²  (在近平面上的点不会变)
       根据第二点和第三点列出:An + B = f² (在远平面上的z不会变,远平面中心点(0,0,f,1)不变)
        这里采用特殊点带入的方式即可列出方程;
解方程:

于是我们得到最终的锥体变换成长方体的变换矩阵:Mpersp->ortho


最后透视投影的变换矩阵:Mpersp =  Mpersp->ortho

最后的最后,思考一个问题:在近平面和远平面之间的平面经过Mpersp->ortho变换后z的值会如何变化?变大?变小?不变?

思路:找到图中铁路的中心点,可以看到在图片的上方木枕越来越多,铁路的中心点则肯定在上部分,也就是越来越远的地方,所以可以看出,中间的z会变小(看向的是-z)。或者说会离观察点越来越远。或者使用-1和-3的中间点-2应用Mpersp->ortho矩阵运算也会得到z变小的结果(带入其他特殊点运算也可,0~-1会不一样)。

下一节:计算机图形学-光栅化(三角形的离散化)_苏剑涛@XM的博客-CSDN博客

有关计算机图形学-正交投影与透视投影的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  6. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  7. ruby-on-rails - 如何计算 Ruby/Rails 中 JSON 对象的数量 - 2

    Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包

  8. ruby - 如何计算自 Ruby 中给定日期以来的周数? - 2

    目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks

  9. ruby - 图形与 Prawn - 2

    寻找一个gem为prawn添加gtraphing功能,我找到了thisone但它似乎有点过时了。有没有更活跃的gem? 最佳答案 直接在Prawn内部绘图没有什么非常活跃的,但是Gruff是一个高度可配置的活跃gem,可以让你制作各种图表。事实上,prawn-graph基本上是gruff的包装器!我的建议是使用gruff生成所需的图表和图形,然后将它们作为图像嵌入到Prawn文档中。所以代码看起来像这样:g=Gruff::Line.new(400)g.title="TransparentBackground"g.theme={:co

  10. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

随机推荐