[3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射

2023-12-26 03:40

本文主要是介绍[3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章内容主要是一些概念的理解~

1. 将坐标系从原先的三维拓展到了四维,从线性变换拓展到了仿射变换,简单理解就是从旋转/缩放变换增加了位移变换的功能。

2. 注意一下 刚体变换 这个概念,指的是只有 [旋转+位移] 的变换, 因为在这两种变换中,对象点与点之间的点乘关系不变,也就是说保持了刚体状态。

3. 最后讨论了仿射变换中,如何计算法线向量的问题

文章结束有本章内容的PDF链接~


Chapter_3 Affine 仿射


3.1 Points and Frames 点与坐标系

[点与向量]
将点与向量作为两种不同的类型来思考很有帮助。点是在几何体世界中的某个固定的位置,而向量则描述两点间的运动。我们会使用两种不同符号来区分点和向量。向量 v⃗  顶部有一个箭头,而点 p~ 顶部则有波浪线。

如果我们将向量看作两点间的运动,那么向量运算(加以及与标量的乘法)就有了明显的意义。如果我们将两向量相加,我们表示的是两个运动的连接。如果我们将向量与标量相乘,我们是将该运动以一定系数增大或减小。零向量是一个特殊的表示没有运动的向量。

这些运算对点来说并没有太多意义。将两个点相加应该得到什么结果(例如,将哈佛广场与肯德尔广场相加)?将点与标量乘应该意味着什么?用法7乘以南极点应该意味着什么?存在着一个与其他点不同的零点吗?

有一种两点间的运算确实具有某些层面的意义:减法。当我们将一个点与另一个点相减时,我们应该得到从第二个点到第一个点的向量。

p~q~=v⃗ 

相反,如果我们从一个点开始,沿着某一向量运动,我们应该得到另一个点

p~+v⃗ =p~

[仿射变换]
对点进行线性变换是有意义的。例如我们可以将一点绕着某一固定原点旋转。对于点,位移也是有意义的操作(位移的概念对向量没有意义)。为了表示位移,我们需要使用仿射变换(affine transform)这一概念。为了实现它,我们需要4x4的矩阵。4x4矩阵不仅仅有助于在这里处理仿射变换,随后我们描述摄影机投影运算时也很有用(见第10章)。

3.1.1 Frames 坐标系

[在仿射空间中用 [原点+向量] 来描述点]
在仿射空间中,我们这样描述一个点,从某一原点 o~ 开始,再将它与向量的线性组合相加。该向量由一组向量基和坐标系向量 ci 表示

p~=o~+icib⃗ i=[b⃗ 1b⃗ 2b⃗ 3o~]c1c2c31=f⃗ tc.

其中 1o~ 定义为 o~

横向的行

[b⃗ 1b⃗ 2b⃗ 3o~]=f⃗ t

称为一个仿射坐标系(affine frame),它与向量基相似,但由三个向量和一个点组成。

[仿射坐标系的第四个分量: 1表示点, 0表示向量]
用坐标系来指定一个点,我们使用一组4项的坐标系向量,其中最后一项总是为1。用坐标系来表示一个向量时,我们使用最后一项为0的坐标系向量(也就是说,它是向量基的组合)。使用4项的坐标系向量来表示几何体(以及4x4矩阵)也会在第10章我们研究针孔相机模型的时候派上用场。

3.2 Affine Transformations and 4 by 4 Matrices 仿射变换与4乘4矩阵

与线性变换的情况相同,我们会在坐标系向量与坐标系之间放置一个合适的矩阵,以此来定义作用于点的仿射变换的概念。

我们来定义一个4乘4矩阵形式的仿射矩阵(affine matrix)

aei0bfj0cgk0dhl1

[对点进行仿射变换量]
用以下方式对点 p~=f⃗ tc 进行仿射变换:

[b⃗ 1b⃗ 2b⃗ 3o~]c1c2c31[b⃗ 1b⃗ 2b⃗ 3o~]aei0bfj0cgk0dhl1c1c2c31

或者简写为

f⃗ tcf⃗ tAc.

我们可以验证上面公式的第二行描述了一个合法的点,根据乘法

xyz1=aei0bfj0cgk0dhl1xyz1

我们得到了一个4项的向量,其中第4项为1。此外,我们可以看到

[b⃗ 1b⃗ 2b⃗ 3o~]=[b⃗ 1b⃗ 2b⃗ 3o~]aei0bfj0cgk0dhl1

其中 0o~ 定义为 0⃗  ,我们得到了一个由3个向量和一个点组成的坐标系。

需要注意如果矩阵的最后一行不是 [0,0,0,1] ,那它通常会给我们一个非法的结果。

[对坐标系进行仿射变换]
与线性变换相似,我们可以对坐标系进行仿射变换

[b⃗ 1b⃗ 2b⃗ 3o~][b⃗ 1b⃗ 2b⃗ 3o~]aei0bfj0cgk0dhl1c1c2c31

或者简写为

f⃗ tf⃗ tA.

3.3 Applying Linear Transformations to Points 对点进行线性变换

[将3x3线性矩阵嵌入到4x4仿射矩阵]
假设我们有一个表示一个线性变换的3乘3矩阵。我们可以将它嵌入到4乘4矩阵的左上角,并使用这个更大的矩阵来对点(或坐标系)进行变换:

[b⃗ 1b⃗ 2b⃗ 3o~]c1c2c31[b⃗ 1b⃗ 2b⃗ 3o~]aei0bfj0cgk00001c1c2c31

这一变换与线性变换对 ci 有同样的效果。如果我们将点 p~ 看作从原点 o~ 偏移了向量 v⃗  ,我们可以看出这一变换与对该向量进行线性变换具有同样的效果。所以,例如,如果该3乘3矩阵是一个旋转矩阵,则这一线性变换会将该点绕着原点旋转(图3.1)。我们将会在第4章中看到,当对点进行线性变换时坐标系原点的位置会起到很重要的作用。

这里写图片描述
对一个点进行线性变换。由对从原点出发到该点的向量进行线性变换来完成。

[4x4矩阵的简写形式]
我们使用以下简写方式来描述只进行线性变换的4乘4矩阵:

L=[l001]c1c2c31

其中 L 是一个4乘4矩阵,l是一个3乘3矩阵,右上角的0是一个由0组成的3乘1矩阵,左下角的0是一个由0组成的1乘3矩阵,而右下角的1是一个标量。

3.4 Translations 位移

[对点进行位移操作]
对点的位移操作非常有用。这一变换不是线性的(见练习2.4)。仿射变换主要的新功能就在于,它能够表示位移。特别是,如果我们进行以下变换

[b⃗ 1b⃗ 2b⃗ 3o~]c1c2c31[b⃗ 1b⃗ 2b⃗ 3o~]100001000010txtytz1c1c2c31

我们可以看出它对坐标系向量造成的影响为

c1c1+txc2c2+tyc3c3+tz

对于位移,我们使用以下方式简写

T=[i0t1]c1c2c31

其中 T 是一个4乘4矩阵,i是一个3乘3单位矩阵,右上角的 t 是一个表示位移的3乘1矩阵,左下角的0是一个由0组成的1乘3矩阵,而右下角的1是一个标量。

注意,如果c的第4项为0,那么它表示向量而不是一个点,那么它就不会受到位移的影响。

3.5 Putting Them Together 综合这些要素

[综合线性与位移]
任意仿射矩阵都可以被分解为一个线性部分和一个位移部分:

aei0bfj0cgk0dhl1=100001000010dhl1aei0bfj0cgk00001

或者简写为

[l0t1]A=[i0t1][l001]=TL(3.1)(3.2)

注意矩阵相乘是不满足互易性的, TL 相乘的顺序有意义,一个仿射矩阵也可以用一个不同的位移矩阵 T 被分解为 A=LT ,但我们不会使用这个形式。

[刚体变换]
A=TR(3.3)

在这个情况中,我们将矩阵 A 称作一个刚体矩阵(rigid body matrix),它所进行的变换称为刚体变换(rigid body transformation),或RBT。一个刚体变换保持了向量间的点乘关系,向量基的手性信息,以及点与点之间的距离关系。

3.6 Normals 法线

[在仿射变换中处理法线信息]
在计算机图形学中,我们常常使用表面的法线信息来决定表面上的一个点应当如何被着色。因此,我们需要了解当表面上的点发生由矩阵A所描述的仿射变换时,表面的法线会如何变化。

有人会猜测我们可以将法线坐标系简单的与 A 相乘。例如,当我们旋转几何体时,法线会以同样的方式旋转。但是使用矩阵A,事实上,并不总是正确。例如,如图3.2所示,我们沿着 y 轴方向挤压一个球体。在此情况中,实际上法线被沿着y方向拉伸而不是挤压。在这里,我们需要在所有情况下都能适用的正确变换。

[定义法线为垂直于无穷接近的两个点相减的向量]
让我们定义一个光滑表面上某一点的法线(normal)为一个向量,垂直于表面在该点处的切线平面。切线平面是由在该表面上接近(无穷小)的点相减得到的向量来定义的,由此,我们得到了

n⃗ (p1~p0~)=0

对于法线 n⃗  和两个在表面上非常近的点 p1~ p0~ 。在某些固定的正交坐标系统当中,它可以被表示为

[nxnynz]x1y1z11x0y0z01=0(3.4)

我们在第4项使用”*”,因为它会与0相乘因而无关紧要。

[推导变换后的法线向量]
假设我们使用一个仿射矩阵 A 来对我们所有的点进行仿射变换。那么什么向量对于所有切线向量都保持垂直呢?我们将等式(3.4)重写为

([nxnynz]A1)Ax1y1z11x0y0z01=0(3.5)

如果我们定义 [x,y,z,1]t=A[x,y,z,1]t 为一个变换后点的坐标系向量,并且让 [nx,ny,nz,]=[nx,ny,nz,1]A1 ,那么我们有

[nxnynz]x1y1z11x0y0z01=0(3.6)

由此我们可以看出 [nx,ny,nz] 是形状变换后法线的坐标系向量(由缩放决定)。

注意,我们不关心”*”处的取值,因此我们也不关心 A1 的第4列。同时, A 是一个仿射矩阵,因此A1也是,由此得出余下3列的第4行全部为0可以安全的被忽略。因此,使用简写

A=[l0t1](3.7)

我们可以看出

[nxnynz]=[nxnynz]l1(3.8)

[最终的法线向量]
并将整个表达式转置,我们就得到了

nxnynz=l1nxnynz(3.9)

其中 l1 是3乘3矩阵的逆转置(与转置的逆相等)。注意如果 l 是一个旋转矩阵,该矩阵是正交的,因此它的逆转置实际上与l相同。在这个情况下,一个法线的坐标系向量与一个点的坐标系向量表现相同。对于其他的线性变换,它们却有不同的表现(图3.2)。也需要注意下, A 的位移部分对法线没有影响。

这里写图片描述
左:有色形状和黑色的法线。中:形状在y方向上被减小,并且(未被归一化的)法线在 y 方向被拉伸。右:法线被重新校正为对挤压后形状来说正确的单位法线。

Exercises 练习

3.1 如果给出以下定义的对于点的运算:对于实数αi,有 α1p~1+α2p~2 ,其中 1=iαi 。证明它可以被解释为在3.1节开始部分描述过的对于点和向量的运算。

本章的PDF版可以去这里拿~

这篇关于[3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)