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

article/2025/10/1 16:07:06

1.视图变换

在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是视图变换
(Viewing/Camera transformation)。

我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性:

  1. 相机位置(视点)(Position)
  2. 相机拍摄方向(视线)(Look-at/Gaze direction)
  3. 相机向上方向(Up direction,假设垂直于 look-at direction)

根据相对运动我们可以知道,只要相机和被拍摄物体相对位置不变,那么拍摄出来的照片应当是一样
的。我们可以通过对被拍摄物体做相同的变换来把相机变换到标准位置。相机的标准位置为

  1. 相机位置在原点 (0, 0);
  2. 相机拍摄方向是-z 轴方向;
  3. 相机的向上方向是 y 轴方向。

将任意位置的相机移动到标准位置需要以下操作:

  1. 将摄像机中心点移动到原点;
  2. 把视线旋转到-z轴方向;
  3. 把上方向旋转到y轴方向;

平移变换的变换矩阵可以写作:
在这里插入图片描述
旋转矩阵的写法比较麻烦。从 ̂𝑔 旋转到-z 轴方向,𝑡̂旋转到 y 轴方向以及 ̂𝑔 × 𝑡̂旋转到 x 轴方向比较难
写,但是旋转变换的逆变换非常的简单
在这里插入图片描述
我们用 x 轴方向单位向量 (1, 0, 0, 0),y 轴单位向量 (0, 1, 0, 0),z 轴单位向量 (0, 0, 1, 0) 代入后结果是正确的。我们知道旋转矩阵的逆矩阵是正交矩阵,因此旋转变换矩阵的逆是旋转变换矩阵的转置矩阵。也是说

在这里插入图片描述
在这里插入图片描述
以上就是我们得到的视图变换矩阵。

2.投影变换

投影变换(Projection transformation)是把 3 维模型投影到 2 维平面的变换。投影变换分为正交投影(Orthographic projection)以及透视投影(Perspective projection)。正交投影中,投影后原本平行的线保持平行关系但是透视投影中平行的线在投影后不一定能保持平行关系,会相交到某一点上(这也就是近大远小现象)
在这里插入图片描述

2.1 正交投影

正交投影将相机放在原点上,拍摄方向是-z 轴方向,向上方向是 y 轴方向。只需要去掉 z 轴后,xy 平面
上的图像就是投影结果。为了能够正交投影,我们会把所有模型移动到 [−1, 1]3 的区间范围内。
在空间中描述一个立方体(立方体中包含了所有需要绘制的模型),将立方体变换到 [−1, 1]3 的区间范
围内
在这里插入图片描述
定义空间中的立方体的左右在 x 轴的坐标,上下在 y 轴的坐标,远近在 z 轴的坐标。这个立方体就可以
被描述 [𝑙, 𝑟 ] × [𝑏, 𝑡] × [𝑓 , 𝑛]。对于 z 轴来说,越远 z 值更小,越近 z 值更大。远是小于近的,保证了右手坐标系下从-z 方向看过去 z 值的规律。

将这样的立方体映射到正则/标准/规范(canonical)立方体 [−1, 1]3
变换方法是先将中心平移到原点,之后对每个边进行缩放到大小为 2。

变换矩阵为:
在这里插入图片描述

2.2 透视投影

透视投影(Perspective projection)是最为广泛的投影方式。透视投影满足近大远小的性质。接下来我们定义视锥。视锥就是一个透视相机渲染时能看到区域的形状,相机放在平面的中心,一个视锥包含 4 个元素:

在这里插入图片描述

  1. 近平面:渲染的区域里相机最近的平面;
  2. 远平面:渲染的区域里相机最远的平面;
  3. 视野(Field of view,FOV):平面顶部和底部中心到相机连线的夹角;
  4. 宽高比:平面宽度和高度之比。

从一个点射出的四棱锥定义了远和近两个平面。我们可以把远平面缩小成和近平面一样大的长方形,
这样视锥就会变成一个立方体。再做一次正交投影就可以得到最终的投影结果了。
在这里插入图片描述
我们需要对这些点进行变换,变换满足三个条件:

  1. 任何一个在近平面上的点不会发生变化;
  2. .远平面处的点 z 值不发生变化;

在这里插入图片描述
从 YZ 平面看过去,对于远平面上的点 (𝑥, 𝑦, 𝑧) 在投影变换后,根据相似三角形的性质,点的位置变为
( 𝑛𝑧𝑥,𝑛𝑧𝑦, 𝑧)。对于任意一个点点 (𝑥, 𝑦, 𝑧) 来说,变化过程为:
在这里插入图片描述
中间点的 z 值变化目前是不确定的。但是对于以上的变化结果我们可以得到变换矩阵的部分结果:

在这里插入图片描述
接下来求出未知量。对于近平面的上的点,应当满足变换:
在这里插入图片描述
因此可以得到方程:
在这里插入图片描述
𝑛2 显然和 x,y 的值没有什么关系,因此 x,y 的系数为 0。但是方程不能解出,还需要一个方程。
对于远平面,我们选择中心点,变换应当满足:
在这里插入图片描述
可以得到方程:
在这里插入图片描述
方程展开后可以得到:
在这里插入图片描述

解得:
在这里插入图片描述
因此我们就解出了变换矩阵:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/pH7y0Gk4.shtml

相关文章

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;最简…

基于libVLC的视频播放器之二:使用VLC-Qt播放RTSP流

此篇是 使用VLC浏览器插件播放RTSP流的姊妹篇。 一.直接使用libVLC libVLC是VLC media player多媒体框架的核心引擎和接口&#xff0c;开发者使用它能轻松的创建大量具有VLC特性的应用。 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器详细介绍了libVL…

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

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