GAMES101-现代计算机图形学入门-闫令琪 - lecture4 观测变换(viewing transformation) - 课后笔记

本文主要是介绍GAMES101-现代计算机图形学入门-闫令琪 - lecture4 观测变换(viewing transformation) - 课后笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

观测变换(Viewing transformation)

  • 视图 / 相机变换(View / Camera transformation)
  • 投影变换(Projection transformation)
    • 正交投影(Orthographic projection)
    • 透视投影(Perspective projection)

视图/相机变换(View / Camera transformation)

什么是视图变换?

思考下如何去拍摄一张照片:

  • 找到一个好地方,并且调整人的姿势,(只对模型进行了变换(model transform))
  • 调整一个合适的角度,放置摄像机(view transformation)
  • 茄子!(将3d转化为2d,投影变换(projection transformation))

图形就是按照上面的步骤进行变换,最终获得屏幕上的2D图像,这之中进行了三次变换,分别是模型变换(model transformation)、视图变换(view transformation)、投影变换(projection transformation),简称MVP ,这节中主要说视图变换。

视图变换操作的主要对象是相机,然后其他的物体跟着变换。

如何实现一个视图变换?

视图变换是对摄像机进行操作,所以需要先定义一个Camera,定义一个Camera需要:

  • Camera的位置 e (Position)
  • Camera的观察方向 g (Look-at / gaze direction),
  • Camera的上方向 t(Up direction),上方向用于固定摄像机的角度,如t指向正上方,那么摄像机就是正的,若t指向斜上方,那么Camera拍出来的图片就是斜的
  • Camera的右方向 g × t

在这里插入图片描述
在这里插入图片描述

如果把Camera看作空间中的一个物体,若将Camera和其他的物体同时进行移动(进行同一种的位移变换),那么其他的物体和Camera就会是一种相对静止则Camera中显示的画面就永远不会发生改变,所以要希望能够通过Camera观察不同的物体以及转换视角,必须要让Camera和空间中的其他物体实现相对运动。

只移动物体或者只移动Camera,最后可能都会得到同一个结果。那么既然这样的话,不如永远把Camera固定到原点的位置,并且Up方向指向y轴方向,Look-at方向指向-z轴的方向。这样就认为其他所有的物体在移动,而相机并不移动,为什么这么做?老师说这是大家约定俗成的一个东西。其实因为相机放在(0,0,0)的位置有很多的好处,相机沿着-z看也会有很多的好处。所以这个约定的相机位置就是一个标准位置

那么怎么操作才能把相机放到原点的位置,并且Up指向y方向,Look-at指向z方向?

相机到达这个标准位置,需要经过平移和变换,那么就用一个变换矩阵来完成相机到原点的过程。该矩阵为:

在这里插入图片描述

那么这个M(view)矩阵在数学上怎么实现?将下面多个变化叠加,最终可以得到M(view)矩阵.

  • 先将Camera的position变换到原点(origin)
  • 将g旋转到-z轴方向
  • 将t旋转到y轴方向
  • 将g×t旋转到x轴方向

在这里插入图片描述

M(view)矩阵的具体实现:

将M(view)矩阵分解为R(view)和T(view)两种变换矩阵,其中T(view)为位移矩阵,将Camera的position移动到原点,R(view)为旋转矩阵,将Camera的几个方向轴旋转到坐标系的位置。

在这里插入图片描述

T(view)矩阵,将Camera的position移动到原点,即将(xe,ye,ze)移动到(0,0,0),则x,y,z上的位移量分别为-xe,-ye,-ze。

在这里插入图片描述

R(view)矩阵要做的事就是将g旋转到-z轴,t旋转到Y轴,(g × t)旋转到x轴。如果这样直接旋转太麻烦,-z轴的方向向量为(0,0,-1),y轴的方向向量为(0,1,0),x轴的方向向量为(1,0,0),明显可以看出,从-z旋转到g,从y旋转到t,从x轴旋转到(g×t)更为简单,这个旋转矩阵为:
在这里插入图片描述

再求这个矩阵的逆矩阵,即逆变换,就可以得到Camera的三个方向旋转到坐标系的三个轴的变换矩阵。因为旋转矩阵都是正交矩阵,所以其逆矩阵 = 转置矩阵。

在这里插入图片描述

得到了以上的两个变换矩阵后,就可以将Camera的位置设置在原点,并以-z轴为look-at方向,以y轴为up方向。就可以认为Camera是始终不动,变换的一直是Camera以外的其他的物体

相机/视图变换总结

投影变换(Projection transformation)

在图形学中,投影就是将3D的图形投影到2D的平面上,即将三维物体转换成能在能在屏幕上显示的二维图像。

投影变换分为正交投影和透视投影

在这里插入图片描述

左图为正交投影,右图为透视投影。透视投影进大远小,更符合人眼的观察效果;正交投影不具有进大远小的性质,正交投影是假设Camera位于无限远的位置,投影出来的物体不论近处还是远处,大小都是一样大,更适用于工程制图。具体情况如下所示:
在这里插入图片描述

左图为透视投影,透视投影的近平面和远平面的大小不同,会将平截头体内部的物体投影到近平面上(绿球在外面,所以没有投影进来),并且离近平面(near clip plane)近的物体较大,远的物体的投影较小。右图为正交投影,而正交投影则是将正方体内物体投影到近平面上,假设Camera在无限远处,那么所有的投影都是以平行光的方式进行投影到近平面上,所以不具有近大远小的效果。(只有在近平面(near clip plane)和远平面(far clip plane)内的物体才能被投影到近平面上)。

正交(射)投影(Orthographic Projection)

正交投影是把Camera固定在原点上,look-at方向为-z轴,up方向为y轴,如果要对物体进行正交投影,只需要将三维坐标中的z坐标直接丢弃,就能够得到投影的结果,如图所示,投影平面为z = 0,直接丢弃z坐标或者直接令z坐标为0,就可以得到投影的效果。

在这里插入图片描述

正交投影最后会被缩放到一个[-1,1]的区间范围内,即所有的点的坐标的分量都是在[-1,1]之间的,如果在范围之外则会缩放到[-1,1]之间,这是一个约定俗成的规定。

但是正交投影无法区分前后关系,如上图所示,得到的投影面如下:
在这里插入图片描述

你并不能判断E在前面还是方块在前面。

那么,如果我有一个立方体,我应该如把它转换到[-1,1]之间?

在坐标系统,使用六个数即可定义个立方体(如x=1代表一个面,x=-1代表一个面,六个数定义6个面,包围起来的立体就是立方体),用 l(left) , r(righit) , b(bottom) , t(top) , f(far) , n(near)六个数定义一个立方体.

在这里插入图片描述

最右边的立方体经过位移,缩放,最终投影的立方体在[-1,1]之间。而转换的矩阵是:

在这里插入图片描述
右边的矩阵先与点(表示点的坐标的向量)结合,将物体位移到原点,然后左边的矩阵对其进行缩放。

透视投影(Perspective Projection)

  • 在图形学、艺术以及视觉上最常用的投影。(正交投影并不行,更适用于工程制图)
  • 远处的物体更小,近处的物体更大
  • 平行线不再平行,最后会汇聚到一个单一的点上

在这里插入图片描述

如图所示,平行的铁轨在透视投影的情况下,最终铁规会汇聚到一个点上。

在学习透视投影之前,要先了解一些知识:齐次坐标的属性!
  • (x,y,z,1),(kx,ky,kz,k!=0),(xz,yz,z^2,z!=0),全都代表了同一个(x,y,z)点。齐次坐标(x,y,z,w)所代表的点为(x/w , y/w , z/w)。
  • 比如:(1,0,0,1)和(2,0,0,2) 都代表着(1,0,0)这个点。
那么如何进行透视投影?

下面有两个透视体
在这里插入图片描述

左边为透视投影的透视范围,是一个平截头体,中间的每一条线最后都会汇聚到Camera所在的位置;右边为正交(射)投影的透视范围,因为默认Camera在一个无限远的地方,所以中间的每一条线都是平行的。

要进行透视投影的话,需要完成两步
  • “挤压”这个平截头体,让其成为一个长方体或者立方体,如正交(射)投影那样
  • 然后对这个长方体进行正射投影,就可以得到透视投影的最终效果。
“挤压”的这种变换的实现:

所谓挤压,就是将远平面f按照比例,挤压成近平面n的那种大小,远平面f上的点的坐标就会发生变化:1.中心点不变,比如中心点为(0,0),挤压之后依旧是(0,0),2.其他的点向中心进行偏移,比如近平面是x和y在[-1,1]这个区间上的正方形 ,而远平面f为[-2,2]的正方形,那么远平面挤压过后,也要变为[-1,1]的正方形,那么远平面的点与原来的位置相比,就更靠近中心了。

在这里插入图片描述

如上图所示,要用矩阵来完成这种变换就要找到这个矩阵,找到这个矩阵就意味着找到(x’ , y’ , z’)和(x , y , z)之间的关系,其中(x’ , y’ , z’)在近平面上,(x , y , z)在远平面上。由相似三角形可以得出他们之间的关系:

在这里插入图片描述

在齐次坐标下就可以表示为:

在这里插入图片描述

中间第二个向量表示的是(x’ ,y’ , z’),因为没有找到z和 z’ 之间的关系,所以目前用unkown来表示,然后四个维度都×z,能够得到一种比较简单的表示方法,但是代表的点仍然是原来那个点,z’仍然是unkown,但是发生了变化。

这种将透视投影“挤压”成正交投影的变换,用矩阵表示如下:

在这里插入图片描述

M(persp->ortho)代表着“挤压变换”,(x,y,z,1)代表原始状态下远平面上的点,(nx , ny , unkown , z)代表挤压后远平面的点。

于是,根据上面的这个式子就能够先写出矩阵的一部分信息:

在这里插入图片描述
接下来的任务就是寻找第三行的数值:

第三行的值是有关于z的变换的关系,如果能找到z和 z’ 之间的关系,就能够写出第三行的数值,由观察可以得出:

  • 所有近平面上的点都没有发生变换(因为所有的平面都要挤压的近平面的大小,近平面并不需要挤压,所以不发生变化)
  • 所有远平面上的点的z的分量不会发生变化(因为挤压只挤压了平面的大小,并没有移动远平面的位置)

根据上述第一点,近平面点不变,可以得到:

在这里插入图片描述

因为近平面的点不变,所以输入的点和输出的点应该是相等的,同一个点
在这里插入图片描述

由这个式子可以得出:第三行必定是为(0,0,A , B)的格式,并且

在这里插入图片描述

进一步推到得到:

在这里插入图片描述
然后再利用上述的第二点:在远平面上的任何点的z值都不会发生变换,比如选一远平面上的点为(0,0,f,1),则:

在这里插入图片描述

根据两个等式,就可以求A和B的值:

在这里插入图片描述

最后就能够获得”挤压变换“的矩阵
在这里插入图片描述
接下来应该做什么?

  • 先做正射投影
  • 透视投影的变换就是正射投影和挤压变换的叠加:

在这里插入图片描述

这篇关于GAMES101-现代计算机图形学入门-闫令琪 - lecture4 观测变换(viewing transformation) - 课后笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237529

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念