Viewing Transformations

线框渲染(wireframe rendering):仅绘制对象边缘且较近的表面不会遮挡较远的表面的渲染。

视图变换(viewing transformation):简单来说,就是将一个 3D 物体变成 2D 图像(将 3D 位置 (x, y, z)为坐标的物体变换到以一个个像素位置(x, y)来表示的屏幕坐标系之中。

整个视图变换的过程可以分为如下几个过程:

  1. 模型变换(modeling transformation):将物体调整到所需的位置。
  2. 相机变换(camera transformation):将相机以方便的方向放置在原点,取决于相机的位置的方向。
  3. 投影变换(projection transformation):从相机空间投影点,以便所有可见点都落在坐标轴 x 和 y 的 [-1, 1] 范围内,取决于所需的投影类型。
  4. 视口变换(viewport transformation):将单位图像矩阵映射到像素坐标中所需的矩阵,取决于输出图像的大小与位置。

整个过程如下图所示:

The Viewport Transformation

标准视景体(canonical view volume):

如果我们正在 nx✖ ny 像素的屏幕里绘图,那么就需要将正方形 [-1, 1]2 映射到矩阵 [-0.5, nx - 0.5] ✖ [-0.5, ny - 0.5] ,即进行视口变换,其变换式子如下:

请注意,上述矩阵忽略了标准视景体中的 z 坐标,因为点沿投影方向的距离不会影响该点在图像中的投影位置。在正式称其为视口变换矩阵 Mvp 之前,需要将 z 轴加上,以方便进行其他变换,如下所示:

The Orthographic Projection Transformation

正交视景体(orthographic view volume):
其中有:
正交视景体到标准视景体的变换其实也就是上述所说的视口变换,故而可以使用上述视口变换的式子,从而有正交投影变换矩阵 Morth

The Camera Transformation

相机变换需要注意 3 点:

  1. 眼睛位置(eye position) e
  2. 视线方向(gaze direction) g
  3. 向上看的向量(view-up vector) t


其中:
相机变换就是将上述 xyz 轴坐标变换到 uvw 轴坐标。相机变换矩阵 Mcam 如下所示:

结合上述所有变换,转换点从世界坐标系到相机坐标系的程序如下:

Projective Transformation

透视(perspective)的重要特性是屏幕上物体上的大小与原点处的眼睛在 z 轴负方向上的 1/z 成正比。如下图所示:

对一个点 (x, y, z)T 而言,它可以表示为齐次坐标下的点 (x, y, z, 1)T;其实可以更进一步的用点 (x, y, z, w)T 表示点 (x/w, y/w, z/w)。

由此,线性变换允许我们计算新的坐标:x = ax + by + cz

仿射变换由此可以得出:x = ax + by + cz + d

点 (x/w, y/w, z/w) 中的 w 可以表示为:w = ex + fy + gz + h

故而有变换后的新坐标如下:

表示成一个矩阵形式:

Perspective Projection

基本的透视投影(perspective projection)由视点 E 和视平面 P 两部分构成;视点可以认为是观察者的位置,也是观察三维世界的角度,视平面就是渲染三维对象透视图的二维平面。

透视投影详细介绍可以看这篇博文:透视投影的原理和实现


透视投影可以看成先对物体进行一个挤压,其变换矩阵为 P;然后再对物体进行正交投影变换,其矩阵为 Mper

对于远平面上的点而言,矩阵 P 的作用就是将点的 x、y 坐标变成和近平面对应点的 x、y 坐标一样。其实就是 y’ = (n/z)·y 和 x’ = (n/z)·x ,至于 z 坐标,现在还不知道该如何变换,那么就是 unknown,故而有:

我们现在对于矩阵 P 可知:

仔细观察近平面和远平面可知:

  1. 矩阵 P 变换,不会改变近平面上的点的 z 坐标
  2. 矩阵 P 变换,不会改变远平面上的点的 z 坐标

故而有:


不妨设上述矩阵 P 中 4个问号分别为 A、B、C、D,那么就有:

很显然,A = 0,B = 0,解之得 C = n + f, D = -fn。故而有矩阵 P:


矩阵 P 和正交投影矩阵 Morth 结合就为透视投影矩阵 Mper:Mper =MorthP

Chapter 7: Viewing相关推荐

  1. CentOS7+MySQL/MariaDB+Galera+HAProxy+Keepalived构建高可用数据库集群

    方案优势: Galera能够实现MySQL/MariaDB数据库的主主复制和多主复制等模式,这些复制模式都是同步进行的,同步时间非常短 每一个节点都可以同时写入和读取,当某一节点发生故障时,可自动从集 ...

  2. Real-Time Rendering——Chapter 7 Advanced Shading

    https://blog.csdn.net/yjr3426619/article/details/81098626 介绍brdf https://zhuanlan.zhihu.com/p/213761 ...

  3. Git Basics - Viewing the Commit History

    Git --distributed-even-if-your-workflow-isnt About DocumentationReferenceBookVideosExternal Links Do ...

  4. 【Wireshark】Chapter 3. User Interface

    Chapter 3. User Interface 3.1. Introduction 3.2. Start Wireshark 3.3. The Main window 3.3.1. Main Wi ...

  5. Chapter 5. The Stack

    Chapter 5. The Stack Introduction A Real-World Analogy Stacks in x86 and x86-64 Architectures What I ...

  6. python使用fpdf生成pdf文件章节(chapter),包含:页眉、页脚、章节主题、数据排版等;

    python使用fpdf生成pdf文件章节(chapter),包含:页眉.页脚.章节主题.数据排版等: #仿真数据 The year 1866 was marked by a bizarre deve ...

  7. python使用fpdf生成pdf章节(chapter)文件包含:页眉、页脚、章节主体、章节内容等;

    python使用fpdf生成pdf章节(chapter)文件包含:页眉.页脚.章节主体.章节内容等: 目录

  8. Chapter 1 快速搭建-服务的注册与发现(Eureka)

    Chapter 1 快速搭建-服务的注册与发现(Eureka) 一.Spring Cloud简介 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代 ...

  9. 吴恩达Coursera机器学习 - Chapter 4 多变量线性回归

    Chapter 4 – 多变量线性回归(Linear Regression with Multiple Variables) 相比第二章,这一章无非就是数据集的特征数由一个变为多个,并引入了矩阵的概念 ...

最新文章

  1. 数据结构(07)— 线性顺序表基本操作
  2. VR企业深圳瑞立视完成8000万A轮融资,广州科学城集团投资
  3. IT从业人员必看的10个论坛
  4. CentOS修改yum源为阿里云
  5. createprocess失败代码2_极客战记[森林]:边地之叉-通关代码及讲解
  6. 高并发学习(二)安全发布对象/不可变对象/线程封闭
  7. Codeforces Round #192 (Div. 2)
  8. 华为笔记本软件商店_华为应用市场 PC 端体验:干净好用 - 华为
  9. 【OpenCV 例程200篇】57. 低通高斯滤波器
  10. 牛x!一款比传统数据库快 100-1000 倍的数据库,来认识一下?
  11. hdu 4864 task 贪心
  12. pdf reference官方指南之-内容流、资源字典和数据结构
  13. Python 条件语句(If else)
  14. 2019DTCC大会感受
  15. SuperMap三维复杂模型建模之3D极坐标建模——基础篇
  16. 【WPS表格】一些简单函数
  17. 四六级对计算机考研有影响吗,英语四六级对考研有多大影响
  18. 【数学建模】数学建模学习2---整数规划(例题+matlab代码实现)
  19. netty系列之IO基础
  20. 高防服务器高防ip高防cdn和现在的云防护用哪种好呢

热门文章

  1. mtr-网络分析工具
  2. 百度地图API:根据起始点经纬度坐标确认最佳路线规划
  3. 美图祛斑算法实战——雀斑消除
  4. JavaWeb面试题(持续)
  5. 在线播放mp3代码(dewplayer)
  6. Photoshop 简笔效果
  7. gm不重启服务器修改物品爆率,(搬运) 修改任务物品爆率方法
  8. (数据结构)[python](11)----链表与栈
  9. “The local variable XXX may not have been initialized”
  10. Spring 拦截器配置方法