坐标变换及视图变换和透视变换(相机透视模型)

news/2025/2/26 8:48:54

文章目录

      • 2D transformation
        • Scale
        • Reflection
        • Shear(切变)
        • Rotation around origin
        • Translation
        • Reverse
        • 变换顺序
        • 复杂变换的分解
      • 齐次坐标(Homogenous Coordinates)
      • 3D transformation
        • Scale&Translation
        • Rotation
      • Viewing / Camera transformation
      • Projection transformation
      • 视口变换
      • 相机内参和相机外参
      • 参考链接

2D transformation

Scale
  • Uniform

image-20240610131838782

  • Non-Uniform

image-20240610131903605

Reflection

image-20240610132151747

Shear(切变)

image-20240610132849601

Rotation around origin

假设旋转矩阵的4个未知数,取特殊点列方程可推导

image-20240610133654334

如果旋转 − θ -\theta θ角度,那么经过推导很容易得出旋转矩阵为原来旋转 θ \theta θ角度的矩阵的转置

image-20240612162331025

又考虑到实际上如果一个图形旋转 θ \theta θ角度再旋转 − θ -\theta θ角度会变回原来的形状,也就是 R − θ R θ X = E X R_{-\theta}R_\theta X=EX RθRθX=EX,即 R − θ R θ = E R_{-\theta}R_\theta=E RθRθ=E​两个矩阵是互逆的。

image-20240612162716886

补充:如果一个矩阵的逆等于它的转置,那么这个矩阵是正交矩阵

以上变换都属于线性变换,都可以写成矩阵相乘的形式:

image-20240610133923619

Translation

需要注意平移(Translation)变换不属于Linear Transformation:

image-20240610134631675

但以上变换可以统称为仿射变换(Affine Transformations)

image-20240610135400637

Reverse

做逆变换相当于把变换后的图形又变回去,假如对 X X X做了变换 M M M,变为 X ′ = M X X'=MX X=MX,再对 X ′ X' X做逆变换 M − 1 M^{-1} M1 M − 1 M X = X M^{-1}MX=X M1MX=X,即变回 X X X

image-20240610141644378

变换顺序

由于矩阵乘法是不可交换的,所以变换的顺序是很重要的,不同的变换顺序得到的结果也不一样,顺序是先线性变换后平移

image-20240610142339298

复杂变换的分解

image-20240610143021276

齐次坐标(Homogenous Coordinates)

将一个 n n n维空间中的点或向量,表示为 n + 1 n+1 n+1维空间中的向量,能够达到合并矩阵运算中乘法和加法操作的目的,简化计算

image-20240610140106905

这样可以定义至少3种有效操作:

image-20240610140352028

Point+Point由于没有什么实质性意义,所以给出一个定义, ( x y w ) \begin{pmatrix}x \\ y \\ w\end{pmatrix} xyw 这个点实际上定义为 ( x / w y / w 1 ) \begin{pmatrix}x/w \\ y/w \\ 1\end{pmatrix} x/wy/w1 这个点,那么这时,两个点相加就被赋予了两个点中点这一意义

那么通过使用齐次坐标,可以将仿射变换改写为:

image-20240610140944932

缩放、旋转、平移可以表示成:

image-20240610141034088

3D transformation

和2D变换中的相似,齐次坐标在3维空间中变成了4维,仿射变换矩阵如下:

image-20240612163848238

注意是先应用线性变换,再应用平移变换!

Scale&Translation

image-20240612164016369

Rotation

三维空间中的旋转和2维相似,绕某个轴旋转就固定哪个轴的坐标不变,其他两个轴应用2维旋转矩阵即可,但我们发现绕y轴旋转的矩阵中 sin ⁡ α \sin α sinα的符号有点不同,这是因为图中y的方向是 z × x z×x z×x得到的,如果y轴是向下的,即由 x × z x×z x×z得到,那么 sin ⁡ α \sin α sinα会刚好相反

image-20240612164412560

留下几个知识点:欧拉角四元数罗德里格兹旋转公式

旋转矩阵不适合做插值,而四元数是可以的

image-20240612172907881

Viewing / Camera transformation

考虑我们现实场景重拍摄一张图片的步骤:

  • 找一个好地方并摆出姿势(model transformation)
  • 找一个好的拍摄角度并放置相机(view transformation)
  • 在相机上投影出相片(projection transformation)

这三部就是图形学中的MVP变换

我们首先考虑视角变换,也即相机变换。通常,相机可以通过三个方向向量来确定一个唯一的视图/相机位置(可以注意到 g ^ \hat g g^ t ^ \hat t t^总是垂直的):

  • Position e ⃗ \vec e e (决定相机的物理位置)
  • Gaze direction g ^ \hat g g^ (决定俯视仰视平视方向)
  • Up direction t ^ \hat t t^ (相机的角度,决定拍出的图像是什么角度,相机旋转,则拍出的照片也会旋转)

由于如果我们保持相机和物体的相对位置不变,同时移动二者,可能会得到相同的拍摄图像,因此不妨将相机固定到一个位置,即:

  • 原点
  • up at Y Y Y
  • gaze at − Z -Z Z

对于这样的位置,可以采取如下仿射变换

  • e e e平移到原点
  • g g g旋转到 − Z -Z Z
  • t t t旋转到 Y Y Y
  • ( g × t ) (g×t) (g×t)旋转到 X X X

这个变换实际上也就是世界坐标系转换到相机坐标系的过程。

但实际上,上面这些变换是不好表示的,由于前面提到旋转矩阵是正交的,所以我们可以考虑上述旋转变换的逆变换

image-20240612193435943

这样我们对所有的物体都事先运用这种变换就相当于我们的相机在一个固定位置去拍摄,并且相机位置是原点。这种变换也被称为ModelView Transformation。这实际上是世界坐标系相机坐标系的一个变换。

Projection transformation

投影变换就是从3D物体投影到2D图像的变换,可以分为:

  • 正交投影(Orthographic Projection)
  • 透视投影(Perspective Projection)

二者本质的区别是是否具有近大远小的性质,透视投影具有近大远小的性质而正交投影没有。透视投影中,原本平行的线投影后可能不再平行。如下图所示,正交投影相当于把相机拉到无限远的位置。下图中,Near clip plane是近平面,也相当于相机的成像平面。

image-20250223190053089

正交投影

当按照前面的方式进行视图变换后,正交投影其实就相当于丢弃掉Z轴坐标,然后将物体的中心平移到相机位置,并且将物体缩放到一个小的矩型中(归一化)。如下图,但这里还有一个问题是物体的正反我们无法分辨。

image-20250223191731040

在实际操作中,我们通常是将一个长方体通过平移和缩放映射一个中心位于原点,边长为1的一个立方体中:

image-20250223192051848

变换矩阵就是(先平移后缩放):

image-20250223192537273

在这个过程中,实际上物体是被拉伸了,后面会提到在做完MVP变换后还要进行视口变换

透视投影

首先需要明确齐次坐标中的一个知识点:就是 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1) ( k x , k y , k z , k ) (kx,ky,kz,k) (kx,ky,kz,k)表示的是同一个点。

透视投影实际上可以拆分为两步:

  • 将远平面到近平面内的frustum(截锥体)挤压变换成一个长方体。变换需要满足:近平面的所有点坐标不变。远平面只有xy变换而z不变。该变换表示为 M p e r s o − > o r t h o M_{perso->ortho} Mperso>ortho。注意近平面和远平面的中心连线是和z轴平行的。相机位置在中心连线上。
  • 对长方体进行正交投影。

image-20250223195710817

实际上,远平面(右)要挤压成与近平面(左)一样的大小,实际上是一个相似变换。

image-20250223200429050

利用相似变换的性质,可以求出 ( x , y , z ) (x,y,z) (x,y,z) ( x ′ , y ′ , z ′ ) (x',y',z') (x,y,z)的变换。
y ′ = n z y x ′ = n z x y^{\prime}=\frac{n}{z} y \quad x^{\prime}=\frac{n}{z} x y=znyx=znx
对于截锥体内的所有平面,xy变换都满足上述关系,但z的关系目前还不知道,只知道远平面和近平面的z不变。表示成齐次坐标为:

image-20250223200933762

M p e r s o − > o r t h o M_{perso->ortho} Mperso>ortho的目标就是:

image-20250223201044878

至此我们可以推导出 M p e r s o − > o r t h o M_{perso->ortho} Mperso>ortho矩阵的一部分:

image-20250223201130878

至于第三行,我们利用近平面的任意一点和远平面的任意一点z都不会改变可以推导出第三行,最终的 M p e r s o − > o r t h o M_{perso->ortho} Mperso>ortho矩阵就是:
M p e r s o − > o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{perso->ortho}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{pmatrix} Mperso>ortho= n0000n0000n+f100nf0
n n n是近平面的z值, f f f是远平面的z值。

然后就是用正交变换矩阵再去做一次变换即得到最终的投影变换矩阵。
M persp  = M ortho  M persp  →  ortho  M_{\text {persp }}=M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp =Mortho Mpersp  ortho 
这也是相机坐标系图像坐标系的过程。

透视投影中还涉及到两个概念,视锥的长宽比(aspect ratio)垂直可视角度(vertical field-of-view,fovY)。实际含义可以从下图看出:

image-20250224165545646

我们假设前面经过矩型块是对称的,即 l = − r ( x 方向 ) , b = − t ( y 方向 ) l=-r(x 方向),b=-t(y方向) l=r(x方向),b=t(y方向)。那么可以从 t , r t,r t,r推出两个概念的表达式:
tan ⁡ f o v Y 2 = t ∣ n ∣  aspect  = r t \begin{aligned} \tan \frac{f o v Y}{2} & =\frac{t}{|n|} \\ \text { aspect } & =\frac{r}{t} \end{aligned} tan2fovY aspect =nt=tr
image-20250224165606254

视口变换

在MVP变换过后,我们的目标就是将前述的小立方块投影到一个图片上,这实际上也是图像坐标系到像素坐标系的变换。

首先我们假设像素坐标系是如下形式:坐标原点在左下角,每个像素是有单位宽度和高度的小颜色块,像素内部每一点颜色都一样,像素坐标系放的是像素的索引。如下图。

image-20250224170145528

设定y轴方向的长度为高度(height),x轴方向的长度是宽度(width),整个屏幕的范围就是上图灰色区域。

视口变换的目标是:

  • 保持相机坐标系的z不变
  • xy平面要从原来小立方体 [ − 1 , 1 ] 2 [-1,1]^2 [1,1]2的范围变换到 [ 0 , w i d t h ] × [ 0 , h e i g h t ] [0,width]\times[0,height] [0,width]×[0,height]的范围

变换矩阵很容易写出,就是缩放+平移操作。视口变换矩阵 M v i e w p o r t M_{viewport} Mviewport
M viewport  = (  width  2 0 0  width  2 0  height  2 0  height  2 0 0 1 0 0 0 0 1 ) M_{\text {viewport }}=\left(\begin{array}{cccc} \frac{\text { width }}{2} & 0 & 0 & \frac{\text { width }}{2} \\ 0 & \frac{\text { height }}{2} & 0 & \frac{\text { height }}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) Mviewport = 2 width 00002 height 0000102 width 2 height 01
经过视口变换后,下一步就是光栅化(Rasterization)的过程。

相机内参和相机外参

外参就是上面从世界坐标系到相机坐标系的变换矩阵,可以简单理解为相机的位置、角度。

内参是上面另外两个变换矩阵的叠加,简单理解就是相机的内部特性,如焦距,畸变系数等。

参考链接

[1] https://www.bilibili.com/video/BV1X7411F744?spm_id_from=333.788.videopod.episodes&vd_source=bac8ddf04ec0b6386d58110f67353bc7&p=4

[2] https://www.bilibili.com/video/BV1r8411f72j/?spm_id_from=333.337.search-card.all.click&vd_source=bac8ddf04ec0b6386d58110f67353bc7

[3] https://zhuanlan.zhihu.com/p/692565077

还有一些不太理解的地方以及一些概念以后再更新。


http://www.niftyadmin.cn/n/5868418.html

相关文章

https:原理

目录 1.数据的加密 1.1对称加密 1.2非对称加密 2.数据指纹 2.1数据指纹实际的应用 3.数据加密的方式 3.1只使用对称加密 3.2只使用非对称加密 3.3双方都使用对称加密 3.4非对称加密和对称加密一起使用 4.中间人攻击 5.CA证书 5.1什么是CA证书 CA证书的验证 6.https的原理 1.数据…

刷题日记5

2025.2.17 1358. 包含所有三种字符的子字符串数目 1358. 包含所有三种字符的子字符串数目 class Solution { public:int numberOfSubstrings(string s) {int l0,r0,res0;vector<int>num(3,0);while(r<s.size()){int tmps[r]-a;num[tmp];while(num[0]&&num[…

在自己的数据上复现一下LlamaGen

git仓库&#xff1a;https://github.com/FoundationVision/LlamaGen 数据集准备 如果用ImageFolder读取&#xff0c;则最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

web安全——web应用程序技术

文章目录 一、HTTP1.1 HTTP方法1.2 HTTP消息头1.3 cookie1.4 状态码 二、web功能2.1 服务器端功能2.2 客户端功能——同源策略 三、编码方案3.1 URL编码3.2 Unicode编码3.3 HTML编码3.4 Base64编码 一、HTTP HTTP&#xff08;超文本传输协议&#xff09;是web应用程序使用的通…

【CSS 选择器的特异度 CSS 继承 CSS 求值过程解析 CSS 布局方式及相关技术】

以下是关于 CSS 选择器特异度、继承、求值过程及布局技术 的详细解析&#xff0c;结合核心概念和实际应用场景&#xff1a; 一、CSS 选择器特异度&#xff08;Specificity&#xff09; 1. 特异度规则 特异度用于决定当多个选择器作用于同一元素时&#xff0c;哪个样式优先级更…

布署elfk-准备工作

建议申请5台机器部署elfk&#xff1a; filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客&#xff0c;搜索人自己的社区 官方…

当AI搜索撕开传统搜索的裂缝,警惕AI搜索的“信息茧房”

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…

鸿蒙NEXT开发-用户通知服务

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 用户通知服务基本介绍 2. 能力范围 …