Chapter 7: Viewing
Viewing Transformations
线框渲染(wireframe rendering):仅绘制对象边缘且较近的表面不会遮挡较远的表面的渲染。
视图变换(viewing transformation):简单来说,就是将一个 3D 物体变成 2D 图像(将 3D 位置 (x, y, z)为坐标的物体变换到以一个个像素位置(x, y)来表示的屏幕坐标系之中。
整个视图变换的过程可以分为如下几个过程:
- 模型变换(modeling transformation):将物体调整到所需的位置。
- 相机变换(camera transformation):将相机以方便的方向放置在原点,取决于相机的位置的方向。
- 投影变换(projection transformation):从相机空间投影点,以便所有可见点都落在坐标轴 x 和 y 的 [-1, 1] 范围内,取决于所需的投影类型。
- 视口变换(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 点:
- 眼睛位置(eye position) e
- 视线方向(gaze direction) g
- 向上看的向量(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 可知:
仔细观察近平面和远平面可知:
- 矩阵 P 变换,不会改变近平面上的点的 z 坐标
- 矩阵 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相关推荐
- CentOS7+MySQL/MariaDB+Galera+HAProxy+Keepalived构建高可用数据库集群
方案优势: Galera能够实现MySQL/MariaDB数据库的主主复制和多主复制等模式,这些复制模式都是同步进行的,同步时间非常短 每一个节点都可以同时写入和读取,当某一节点发生故障时,可自动从集 ...
- Real-Time Rendering——Chapter 7 Advanced Shading
https://blog.csdn.net/yjr3426619/article/details/81098626 介绍brdf https://zhuanlan.zhihu.com/p/213761 ...
- Git Basics - Viewing the Commit History
Git --distributed-even-if-your-workflow-isnt About DocumentationReferenceBookVideosExternal Links Do ...
- 【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 ...
- Chapter 5. The Stack
Chapter 5. The Stack Introduction A Real-World Analogy Stacks in x86 and x86-64 Architectures What I ...
- python使用fpdf生成pdf文件章节(chapter),包含:页眉、页脚、章节主题、数据排版等;
python使用fpdf生成pdf文件章节(chapter),包含:页眉.页脚.章节主题.数据排版等: #仿真数据 The year 1866 was marked by a bizarre deve ...
- python使用fpdf生成pdf章节(chapter)文件包含:页眉、页脚、章节主体、章节内容等;
python使用fpdf生成pdf章节(chapter)文件包含:页眉.页脚.章节主体.章节内容等: 目录
- Chapter 1 快速搭建-服务的注册与发现(Eureka)
Chapter 1 快速搭建-服务的注册与发现(Eureka) 一.Spring Cloud简介 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代 ...
- 吴恩达Coursera机器学习 - Chapter 4 多变量线性回归
Chapter 4 – 多变量线性回归(Linear Regression with Multiple Variables) 相比第二章,这一章无非就是数据集的特征数由一个变为多个,并引入了矩阵的概念 ...
最新文章
- 数据结构(07)— 线性顺序表基本操作
- VR企业深圳瑞立视完成8000万A轮融资,广州科学城集团投资
- IT从业人员必看的10个论坛
- CentOS修改yum源为阿里云
- createprocess失败代码2_极客战记[森林]:边地之叉-通关代码及讲解
- 高并发学习(二)安全发布对象/不可变对象/线程封闭
- Codeforces Round #192 (Div. 2)
- 华为笔记本软件商店_华为应用市场 PC 端体验:干净好用 - 华为
- 【OpenCV 例程200篇】57. 低通高斯滤波器
- 牛x!一款比传统数据库快 100-1000 倍的数据库,来认识一下?
- hdu 4864 task 贪心
- pdf reference官方指南之-内容流、资源字典和数据结构
- Python 条件语句(If else)
- 2019DTCC大会感受
- SuperMap三维复杂模型建模之3D极坐标建模——基础篇
- 【WPS表格】一些简单函数
- 四六级对计算机考研有影响吗,英语四六级对考研有多大影响
- 【数学建模】数学建模学习2---整数规划(例题+matlab代码实现)
- netty系列之IO基础
- 高防服务器高防ip高防cdn和现在的云防护用哪种好呢
热门文章
- mtr-网络分析工具
- 百度地图API:根据起始点经纬度坐标确认最佳路线规划
- 美图祛斑算法实战——雀斑消除
- JavaWeb面试题(持续)
- 在线播放mp3代码(dewplayer)
- Photoshop 简笔效果
- gm不重启服务器修改物品爆率,(搬运) 修改任务物品爆率方法
- (数据结构)[python](11)----链表与栈
- “The local variable XXX may not have been initialized”
- Spring 拦截器配置方法