华科_图形学笔记_07_投影变换

article/2025/10/1 15:43:41

计算机图形学_华中科技大学_中国大学MOOC(慕课)


7.1_有趣的投影

由于我们的观察设备是二维的,因此,最终都存在一个三维向二维的映射过程。这个映射过程,按照几何意义来说就是投影。

而在我们之前讲到的观察变换中,其实还有一个隐含着的概念,观察平面。

那么这个平面,也可以叫做投影平面,我们看到的景物,都需要投影到这个平面上。

一个是平行投影。工程上我们用到的三视图,学习几何的时候用到的轴测图,都属于平行投影。

与平行投影相对而言的是透视投影。

最初接触这个概念应该是接触绘画的时候,

老师会说要给出透视的效果。很显然,和平行投影相比,透视投影,有近大远小的感觉,也就有了紧身的感觉。比如这里的树。近处,显得高,远处显得矮。原来的平行线在远处似乎汇聚在了一点,我们通常把这个点叫做灭点。有时在XYZ方向都会产生灭点,比如这幅图。

大家看到在X方向,Y方向的方向都有灭点。我们把这种情况叫做三点透视。

那么怎么区分平行投影和透视投影?这就要看投影中心到投影平面的距离。

如果无穷远,则可以认为投影线是平行的,形成的投影,也就是平行投影。

而投影中心距离投影面的距离如果是有限的,那就是透视投影。

对于平行投影,根据投影方向与投影面的夹角又可以分成两类。正投影和斜投影。

当投影方向与投影面的夹角是90度的时候,得到的投影,就是正投影。否则,就是这里的斜投影。

平行投影变换具有较好的性质,能够精确地反映物体的实际尺寸,也就是不具有透视的缩小性。另外平行线经过平行投影变换以后,还是保持平行。

正投影_根据投影面与坐标轴的夹角可以分成两类。

三视图和正轴测图。

当投影面与某一个坐标轴垂直的时候,得到的投影,就是三视图。

这个时候投影方向与这个坐标轴的方向一致。否则,得到的投影,就是正轴测图。

通常说的三视图,包括主视图,侧视图和俯视图三种,投影面分别与X轴、Y轴和Z轴垂直。

这里就显示了一个三维形体以及他三视图的效果。

它的计算很简单,比如,如果投影面与X轴垂直。且在XP这个位置,投影后,X' 肯定都变成了XP;Y'还是等于原来的Y,Z'还是等于原来的Z

有了这个关系,我们就可以得到对应的变换矩阵了。

那么大家看,其实三视图的特点,是物体的这个投影平面,平行于某一个坐标平面。

所以投影的这个效果能够反映形体的实际的尺寸。工程制图中常常用三视图来测量形体间的距离、角度以及相互之间的位置关系。

但是,它的不足之处是,三视图上只有物体的一个面的投影。

每一副就是一个面的投影。所以三视图难以形象地表示出形体的三维心智,只有将主、辅、侧三个视图放在一起,才能综合出物体的空间形状。下面的这幅图的情况,则发生了变化了,大家看这时的投影平面并不和任意一个坐标轴垂直,而是和任意一个轴,都存在着一个非90度的夹角。

这里的红色轴是投影方向,也就是投影平面的法向量。

我们是不是又会产生联想了?如果我们把这个向量旋转到X轴上,那么投影平面就与YOZ平行了

这时的投影计算就跟刚才的三视图计算一样。其实正轴测图,还有等轴测,正二侧和正三侧3种。

当投影面与三个坐标轴之间的夹角都相等的时候,是等轴测。

同一面与两个坐标轴之间的夹角相等就是正二测。

但是如果与三个坐标轴之间的夹角都不同,就是正三侧。不管是哪一种,我们都可以相应计算出它对应的变换矩阵。

有了正平行投影的基础.我们再来看看斜平行投影。

斜投影图,也就是斜轴侧图。是将这个三维形体像一个单一的投影面做平行投影。但投影方向不垂直于投影面所得到的平面图形。

通常,选择投影面垂直于某一个主轴,于是对平行于投影面的形体表面就可以进行距离和角度的测量。

而对于形体的其他面可以沿着这根主轴测量距离。

这样一来,斜轴测图,就将三视图和正轴测图的特性结合起来了。既能像三视图那样在主屏面上进行距离和角度的测量,又能像正轴侧图那样同时反映三维形体的多个面,具有立体效果。

常用的斜轴测图有斜等侧图和斜二侧图。

斜等侧图的投影方向与投影平面的夹角是45度角。

而斜二侧的投影方向与投影平面的夹角是arctg(2)。

这样,在斜等测里面的和投影面垂直的任何直线段。投影以后,它的投影长度不变,比如左图中的op等于OP'。斜二侧里面,和投影面垂直的任何直线段,投影长度就是原来的一半。也就是op等于两倍的OP1'了。

斜投影:常见的有斜等侧和斜二测

 

一个普遍的情况

对于斜等侧和斜二测,我们知道它Alpha的值了,贝塔通常可以取三视或者45度

这几幅图给出了一个单位立方体在XOY平面上几种常见的斜投影

再来看看更加复杂的透视投影

其实大家注意到,在三维几何变换矩阵T3D中,我们给出了四个子矩阵。可是其中的T3投影子矩阵一直都没有涉及。

即使刚才的平行投影也并没有改变T3中的任何一个值。

现在假定投影中心在原点,投影面与Z轴垂直

我们会发现这里存在着一个相似三角形对应边成比例的关系。

我们就看到这时候T3这个子矩阵中第三个元素就变成了D分之一。

由这个矩阵可以看出透视投影的特性了,就是透视缩小效应。

也就是说,三维形体透视投影的大小与形体到投影中心的距离成反比。

这种效应所产生的视觉效果十分类似于照相系统和人的视觉系统。

等长的两条直线段都平行于同一面。

但离投影中心近的,透视投影就比较长。而离投影中心远的线段,透视投影的效果,就是比较短。与平行投影相比,透视投影的深度感更强,看上去,更加真实。但透视投影不能真实地反映物体的精确尺寸和形状。

对于透视投影,一束平行于投影面的平行线的投影。也是可以保持平行的。但是不平行于投影面的平行线,这个投影就会汇聚到一个点。刚才我们已经提到过,这个点叫灭点。灭点可以看作是无限远处的一点在投影面上的投影。

透视投影的灭点,其实是有无限多个的不同方向的平行线在投影面上,就都能形成不同的灭点。

而坐标轴方向的平行线在同一面上形成的灭点,又称做主灭点。因为有XY和Z3个坐标轴,所以,主灭点最多就是三个。

当某个坐标轴与投影面平行的时候。这个坐标轴方向的平行线在同一面上的同影,仍然保持平行,不会形成灭点。

透视投影案主灭点的个数来分类。可以分为一点透视、两点透视和三点透视。

比如这里的a就是一点透视。

而B是两点透视。它有两个主灭点。

而C是三点头是,它有三个主灭点,看到这里的投影面,与三个坐标轴都相交了。

所以三个轴方向的平行线都会形成灭点,也就是主灭点。那么在现实的使用中,三点透视,我们用的是不多的,主要原因在于它难以构造。


7.2_规范化的投影变换

提纲

在几何阶段的最后,我们需要进行屏幕映射

可是在屏幕映射之前,还有一些工作没有做完。之前我们通过模型变换和视图变换之后,已经把世界坐标系转换到观察坐标系了。

那么我们分析一下。观察者最终看到什么结果,

一个当然就是观察坐标系的位置。这部分内容,我们在观察者也能动中给大家讲了。而另一个,就是观察方式。比如平行投影和透视投影看到的结果就不同。

那么这里其实有一个观察空间的概念。

要定义观察空间,首先需要定义观察窗口。

其实在观察的时候,隐含着一个观察平面。

因为感觉最后所有的内容都会投射到这个平面,因此这个平面有时也叫做投影平面。

观察窗口,正是观察平面上的一个有限区域。

观察窗口的边,一般平行于X轴和Y轴。而这里的这两个点分别就是窗口左下角和右上角。

观察窗口可以位于观察平面的任何位置。

定义了观察窗口之后,我们就可以利用观察窗口的边界来定义观察空间。

我们可以将这个观察窗口沿着几轴方向作平移运动。

这时候产生的三维形体,就是观察空间。因此,观察空间的大小是依赖于窗口的大小的。

当然,投影方式不同,观察空间也不同。

比如这里平行投影观察空间,就是一个四边平行于投影方向,两端没有底面,横截面为长方形的管道。

对于透视投影,观察空间,是顶点在投影中心,而棱边穿过观察窗口,四个角点没有底面的棱锥。

这样定义的观察空间是无限的。但是大多数场合观察空间是有限的。

因为我们不是千里眼,很远的地方我们看不见,同时我们眼睛也没长在脑后。鼻尖之前的景物才可能看见。因此,我们需要定义观察空间的前截面和后截面。前截面和后截面,都平行于观察平面,用Z等于Zfronth和Z等于Zback来定义。对于正投影,有限的观察空间就是一个矩形的平行管道。

对于斜投影,有限的观察空间就是一个斜平行管道。

而对于透视投影,观察空间,就被截成了棱台。

有限的观察空间,又叫做裁剪空间,也叫视景体,因为三维形体是相对于这个空间进行裁剪的。很显然,观察空间不同,裁剪和屏幕映射的结果就不同了。

可是这样一来,之后的裁剪和屏幕映射就比较复杂了,需要针对不同的情况分别处理。

顶一个规范化的空间,在遇到不同的观察空间的时候,只需要把它们规范化

基于这样的考虑,这里我们定义了一个规范化的观察空间。

一个中心在原点的立方体

那么接下来要考虑怎么规范化了。首先看最简单的证平行投影。为了分析简单,我们去掉干扰信息,就会发现除了位置的改变之外,其实就是把一个长方体变成一个正方体

进行比例变换,再加上平移变换。这个空间就可以变换到规范化的观察空间中去了。

再看看斜平行投影,显然,刚才的平移和比例还是需要的,可是不够。

为了简化这个问题,我们做了这样的一个投影。这样Xoy平面就变到一个轴上了,这时我们需要把这个平行四边形变成一个正方形。显然,这中间如果我们能够把它变成上面这样的长方形,再往右边的正方形变

把一个长方形变成了平行四边形,其实反过头来也可以把平行四边形变成长方形。因此,我们就可以通过错切变换把它变成上面这个样子,之后再进行平移和比例,就可以完成规范化了。

当然,最复杂的还是透视投影观察空间的规范化。很显然,刚才的平移比例错缺都少不了,可是还不够。

比如。看上面这个长方体,在一点透视之后,看起来是不是就是这样的。前面的这条边长,后面的这条边短。体现了近大远小。那么,我们是不是可以通过一个一点透视,让近处的红色的前截面变大,而远处的后截面变小,显然是可以的,因此,这里需要一个透视投影变换。

通过分析,我们知道不管是以上哪种观察空间的规范化都是通过几何变换来处理的,所以也都可以用矩阵运算来解决,这里再次证明了几何阶段矩阵运算的重要性。

值得庆幸的是,在opengl中并不需要我们自己来计算这个变换矩阵,而是通过一个函数的调用就可以进行计算了。

以3D场景中最常见的观察方式透视投影为例。我们只需要通过这个perspective函数,就可以得到对应的变换矩阵。

总之,有了这样的规范化之后,我们就把观察到的内容,放在一个规范化的观察空间了,也就是裁剪空间了。

这之后的裁剪和屏幕映射也会变得比较简单。


http://chatgpt.dhexx.cn/article/9Vfv9RHl.shtml

相关文章

Opengl投影变换理解

坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。 而[-1.0,1.0]构成的正方体又叫规则观察体(Canonical View Volume, CVV) 一、流程 计算机显示器是一个 2D 表面。OpenGL 渲染…

图形学-(视图变换,投影变换)

1.视图变换 在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是视图变换 (Viewing/Camera transformation)。 我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性: 相…

4.3 投影变换

投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。 投影也是使用矩阵来实现的。计算一个用于实现透视投影或者平行投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。 OpenGL支持两种类型的投影变换,即透视投影…

读书笔记-opencv-投影变换

读书笔记-opencv-投影变换 原理解析 ​ 透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x′,y′)空间的映射.相对于仿射变换,它提供了更大…

计算机图形学 | 投影变换

计算机图形学 | 投影变换 计算机图形学 | 投影变换7.1 有趣的投影投影的概念平行投影正投影斜投影 透视投影 7.2 规范化的投影变换观察的要素观察空间规范化的投影变换 华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 计算…

使用 OpenCV 进行图像投影变换

投影变换(仿射变换) 在数学中,线性变换是将一个向量空间映射到另一个向量空间的函数,通常由矩阵实现。如果映射保留向量加法和标量乘法,则映射被认为是线性变换。 要将线性变换应用于向量(即,一…

Opencv之投影变换

学习资料参考: 张平.《OpenCV算法精解:基于Python与C》.[Z].北京.电子工业出版社.2017. 原理 平面的物体若在三维空间发生了旋转,那么这就是投影变换。平面的物体可以借助二维投影变换进行三维变换模型化得到修正。 处理函数 c中的getPersp…

ArcMap 投影变换

在投影变换之前,首先需要理清出我们拿到的工程数据到底是哪一个投影坐标系,只有清楚是哪一个坐标系才能给我们矢量化出来的数据进行定义投影(如果是当地的投影坐标系,可以查看自定义投影坐标系文章,新建出当地的投影坐…

OpenCV : 投影变换

投影变换 物体在三维空间发生了旋转,叫做投影变换.由于可能出现阴影或遮挡,所以变换后较难复原.如果物体时平面的,就可以通过投影变换物体三维变换进行模型化,这叫做专用的二维投影变换. 矩阵表示: [ x ~ y ~ z ~ ] [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] [ x …

Halcon 第七章『图像的几何变换』◆第2节:投影变换

一、介绍 投影变换也叫透射变换、投影映射。透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。 透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式。其特殊性在于变换后图像的形状仍然维持原状。投影变换包括的…

投影变换原理和用法

一、定义:投影变换也叫透射变换、投影映射。透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。 透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式。其特殊性在于变换后图像的形状仍然维持原状。投影…

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。

MFC调用vlc动态库libvlc.dll实现简单播放器 中文路径处理

一、简单说明 本文讲解利用MFC调用vlc&#xff08;2.0.0&#xff09;的动态库实现简单的播放器&#xff0c;实现播放、暂停、停止、音量控制、进度控制&#xff0c;支持中文路径等。 VLC 中文路径转码问题<转> 最近用MFC编写调用libVLC的程序时碰到中文路径不能打开的问题…

VLC-Android编译

1.环境 硬核条件----------linux(这里用ubuntu代替)15.5.1 build-15018445 PS&#xff1a;这里安装好虚拟机以后&#xff0c;尽可能分配大内存(8GB起步)&#xff0c;如果电脑本地不允许开这么大的内存给虚拟机&#xff0c;则本博文后面的内容可能帮助不大。 安装好虚拟机后&am…

VLC介绍以及库的使用

VLC原指VideoLAN客户端(VideoLANClient)&#xff0c;是一款开源的、跨平台的、可扩展的、多媒体播放器、流媒体服务器及框架&#xff0c;可播放大多数多媒体文件&#xff0c;以及DVD、音频CD、VCD及各类流媒体协议&#xff0c;现更名为VLC media player&#xff0c;最新版本为2…

LibVLC —— 常用函数解析

函数 ● LIBVLC_API libvlc_instance_t *libvlc_new( int argc , const char *const *argv ); 功能&#xff1a;创建libvlc_instance_t对象。 用法&#xff1a; libvlc_instance_t *VlcInstance libvlc_new(0, nullptr);参数&#xff1a;                具体…

【玩转VLC】--- 基于libvlc写个最简单的播放器

通过【玩转VLC】--- ubuntu下编译vlc 我们已经把vlc编译哦了。生成了一系列的bin和libvlc.so. 接下来我们就用编译好的libvlc.so搞一个最简单的播放器。 我认为vlc的伟大之处有一点就是他并没有把整个播放器写成一个硬生生的bin。而是独立出来个libvlc库&#xff0c;其他的玩…

最简单的基于libVLC的例子:最简单的基于libVLC的推流器

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

C++调用libVLC播放视频

1、下载libVLC的sdk Index of /pub/videolan/vlc/ 注意下载.7z结尾的 2、Visual Studio建立C的windows控制台项目 3、文件准备 &#xff08;1&#xff09;sdk文件夹解压缩到项目文件夹下 &#xff08;2&#xff09;在Debug下方压缩包内的几个文件 、 4、配置项目属性 注意…

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版)

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…