一、模型视图变换

模型视图变换主要是为了让摄像机回归到世界坐标的原点并且和拍摄物体一起进行变换,便于计算

模型视图变换的根据就是物体和相机的相对位置不变,那么,投影得到的图片也是不变的

首先规定相机拍摄方向朝向-Z,相机的位置位于e,相机的正上方可以用向量t来表示,那么将相机移动到世界坐标的原点的过程如下图

首先需要将相机平移值世界坐标原点,平移矩阵就可以写成

然后分别需要将g旋转到-Z,将t旋转到Y,将g叉积t的方向旋转到X,然而,这个旋转对应的旋转矩阵并不容易写出,但是如果将Z旋转到-g,将Y旋转到t,将X旋转到g叉积t的方向

那么,这个逆向的旋转矩阵就可以写成

之所以可以这样写,是因为旋转矩阵是正交矩阵,其列向量或列向量可以构成一组正交基向量,而t, -g以及g与t的叉积可以构成一组正交基,所以直接将g与t的叉积方向、t方向与-g方向的三个向量填入旋转矩阵,并且这三个向量可以表示旋转后的向量。于是就有了逆向旋转矩阵

因为旋转矩阵是正交矩阵,所以逆矩阵也是矩阵的转置,所以,此时只需将逆矩阵再次进行转置,就可以得到原来的旋转矩阵

所以,将将g旋转到-Z,将t旋转到Y,将g叉积t的方向旋转到X的旋转矩阵就是逆矩阵的转置

所以,模型视图变换矩阵最终的结果就是

二、投影变换

2.1、正交投影

正交投影假设先把相机移到无穷远处,此时,无论物体离相机多远,投影出来后,物体的大小都是一样的(深度信息被忽略),没有所谓的近大远小的特点,这就是正交投影

2.2、正交投影矩阵

如上图,假设空间中存在一个长方体,最终三个方向均要正交投影到一个标准立方体中,那么首先需要将长方体的中心平移到原点(此时长方体的中心与原点重合,上图画的不太标准),然后该长方体进行一个缩放变换,缩放到标准立方体中,所谓的标准立方体就是在三维坐标中,立方体在XYZ正方向的区域的坐标是(1,1,1),而在XYZ负方向的坐标是(-1,-1,-1),缩放到标准立方体中是为了方便进行后续的视口变换的计算方便。

立方体的坐标表示如下图

所以,平移矩阵可以表示为

平移举例表示中心点要移动的距离,因为是向原点移动,所以需要加负号

平移变换之后,需要进行缩放变换,缩放因子可以表示为

所以,缩放矩阵就可以表示为

所以,最终的正交投影矩阵就是平移矩阵与缩放矩阵的乘积

2.3、透视投影

如下图所示,透视投影并包含深度信息,并因为深度信息而产生近大远小的特点,符合人眼的视觉模型

正交投影中光线的是平行光,而透视投影中的光则是点光源,如下图

2.4、透视投影矩阵

因为透视投影是要通过近大远小表达深度的,而透视投影就是将上图中的棱锥无限切分,然后,全部缩放成近平面的大小。最后,将缩放后的长方体再平移缩放到标准立方体中

所以投影矩阵推导的思路就是:将棱锥模型的四个棱向内挤压内,形成一个长方体,之后将长方体进行一次平移和缩放,使得最终结果处于标准立方体中,也就是说对长方体进行正交投影,最终得到的投影就是透视投影。

将棱锥远平面上的任意一点投影到屏幕后的模型可以表示为

根据相似三角形可得

同理可得

到此,也就是说棱锥内的所有的点的xy坐标都经过了缩放因子为n/z的挤压

所以,变换的形式可以写为

齐次坐标的同乘一个数或者同除以一个不为零的数时,齐次坐标不发生变化,所以,将等号右侧同时乘以z,那么形式就写成

此时,矩阵M可以写成

如何算出pqab这四个值?

首先,棱锥近平面压缩后,近平面上的所有点依然不变,且近平面上的点的z坐标都是n,所以可以得出如下方程

此时,再次利用齐次坐标的不变性,将右边的向量同乘以n,可得

可知,等式右边的结果与xy无关,所以,p=0,q=0

所以,上式最终变为

此外,远平面处的中心点(0,0,f,1)经过挤压后,也没有变化。所以,可以的导入下的方程

联立上述两个方程

最终可得

所以,该转换矩阵可以写为

所以,最终的透视投影矩阵就是该转换矩阵和正交投影矩阵的乘积

三、视口变换

经过了MVP变换,可以将任意三维空间中的物体投影到标准立方体上,但是之后还需要投影到二维平面上进行显示(Z方向暂时不考虑)

所以,就需要将标准立方体中的中的点,转换到屏幕上,所以还是需要先平移,再缩放,形式同正交矩阵

平移分量的符号是正的,是因为中心点远离原点;width/2是缩放因子(从[-1, 1]*[-1, 1]->[0, width]*[0, height])

四、其他概念

4.1、相机的视场(FOV,field of view)

相机的视场分为水平方向和垂直方向,上图表示的是水平方向的视场,视场决定相机的视野的大小

FOV的大小与焦距有关

FOV的大小也与成像平面有关

因为屏幕的尺寸是一定的,所以,如果FOV越大,那么,包含进来的物体就越多,那么,成像后,物体在屏幕中就显得比较小比较拥挤,反之,如果FOV越小,包含的物体就越少,那么,成像后,物体在屏幕中就显得比较大

4.2、屏幕的宽高比(aspect ratio)

屏幕的宽高比决定了图像能否正常显示,如果宽高比过大,那么,出现在屏幕上的画面就会变得矮胖,如果宽高比过小,出现在屏幕上的画面就会变得高瘦,所以,合适的宽高比将会使得图像更好的现实在屏幕上

参考:

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

3、计算机图形学——模型视图变换、投影变换与视口变换相关推荐

  1. 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)

    计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...

  2. OpenGL学习笔记:模型变换、视图变换、投影变换 、视口变换、操作矩阵堆栈

    1. 模型变换和视图变换  从"相对移动"的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性.在OpenGL中,实现这两种功能甚至使用的是同样的函数. 由于模型 ...

  3. 计算机图形学(二):三维图形变换及应用(平移、旋转、缩放、仿射)

    三维图形的矩阵变换方法及应用 一个三维位置在齐次坐标中表示为4元列向量.因此,每一次几何变换操作表示成一个从左边去乘坐标向量的4×4矩阵.和二维中一样,任意变换序列可以通过依序合并相应的变换矩阵而得的 ...

  4. 图形学立方体三维观察之立方体视口变换

    // 提示:在合适的地方修改或添加代码 #include <GL/freeglut.h> #include<stdio.h> // 评测代码所用头文件-开始 #include& ...

  5. 计算机图形学基础1——MVP变换

    参考链接: 线性变换 计算机图形学入门教程 视图变换 图形学随笔:MVP变换-视图变换 计算机图形学笔记-专栏 View/Camera Transformation视图变换 MVP变换: 我们知道我们 ...

  6. 计算机图形学 实验3 《图形变换》

    计算机图形学 实验3 <图形变换> 一.实验目的 学习图形的基本几何变换. 二.实验内容 1.投影变换: 2.视口变换: 3.旋转.平移和缩放. 三.实验方法 本次实验将投影变换.视口变换 ...

  7. 实验5 OpenGL模型视图变换

    1.实验目的: 理解掌握OpenGL程序的模型视图变换. 2.实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换: (2)根据示范代码,尝试完成实验作业: 3.实 ...

  8. 计算机图形学14:三维图形的投影变换

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  9. 计算机图学测试题及答,计算机图形学试卷

    1. 计算机图形学考题 一.单项选择题(本大题共10小题,每小题3分,共30分)提示:在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或未选均无分 1)灰度 ...

最新文章

  1. 美团外卖持续交付的前世今生
  2. 网页制作遵循四大原则让网站建设更加优质
  3. 1070 Mooncake (25 分)【难度: 简单 / 知识点: 贪心】
  4. 求二叉树最长路径长度和
  5. 【Linux】一步一步学Linux——nice命令(127)
  6. lamda获取参数集合去空_(转)Java8使用lambda表达式进行集合的遍历
  7. 机器人对话常用语模板_小a电话机器人免费咨询
  8. 入职美团定级P7,最新最全180道高级岗面试题及答案
  9. 10.23 第六次作业 刘惠惠 this关键字
  10. GET请求淘宝H5页面获取商品信息
  11. 返回 代码: E_INVALIDARG (0x80070057)解决方法
  12. php商城系统源码的好处有哪些?
  13. 邯郸云计算中心正式开通运营
  14. android系统方法裁剪图片 华为手机显示为圆
  15. 什么是端口映射?本文详尽解析!
  16. 谷歌java模板_如何创建Google表格模板
  17. 1002 图论专练 解题报告
  18. 性感荷官在线发牌,真的靠谱吗?
  19. it是什么?(详细解释)
  20. Pulsar 社区周报| 2020-11-28 ~ 2020-12-04

热门文章

  1. 老男孩Linux运维第41期20170924开班第五周学习重点课堂记录
  2. OutofMemory之PermGen介绍
  3. FTPVSFTPD安装和参数说明
  4. 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)
  5. ASP.NET 开发知识小结
  6. [导入]ZT笑到内伤:史上最雷,最爆寒的电影字幕
  7. 【特征匹配】BRISK原文内容翻译
  8. pandas替换列值+1
  9. Java中谈尾递归--尾递归和垃圾回收的比较
  10. 三层架构,Struts2,SpringMVC实现原理图