图形学初识--空间变换

文章目录

  • 前言
  • 正文
    • 矩阵和向量相乘
    • 二维变换
      • 1、缩放
      • 2、旋转
      • 3、平移
      • 4、齐次坐标下总结
    • 三维变换
      • 1、缩放
      • 2、平移
      • 3、旋转
        • 绕X轴旋转:
        • 绕Z轴旋转:
        • 绕Y轴旋转:
  • 结尾:喜欢的小伙伴可以点点关注+赞哦

前言

前面章节补充了一下基本的线性代数中关于向量和矩阵的背景知识,这一节咱们讲解一下在二维和三维中常用的空间变换,主要包括:平移、旋转、缩放等!

正文

矩阵和向量相乘

假设有一个矩阵 M M M,有一个向量 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy),则令 P ⃗ ′ = M × P ⃗ = ( x ′ y ′ ) \vec P' = M \times \vec P = \begin{pmatrix} x'\\y' \end{pmatrix} P =M×P =(xy).

从上节,我们已经知道矩阵和向量相乘结果还是个向量,假设我们把向量 P P P 看作一个坐标,那么 P ′ P' P 的坐标就是矩阵 M M M 应用之后的结果,此时我们称对点 P P P应用矩阵 M M M的变换。

二维变换

假设在二维空间下,矩阵 M M M 是2x2的,向量 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy) 是二维向量。

矩阵乘向量在二维空间本质理解: 假设我们将 M M M 按照列方向,分解成两个列向量 ( α 1 ⃗ , α 2 ⃗ ) (\vec{\alpha_1}, \vec{\alpha_2}) (α1 ,α2 ),则 P ′ ⃗ = ( x α 1 ⃗ + y α 2 ⃗ ) \vec{P'} = (x\vec{\alpha_1} + y\vec{\alpha_2}) P =(xα1 +yα2 )

结果表明: 矩阵和向量相乘,就相当于向量的轴分量作为权重,给矩阵的列向量加权求和!

类似的,我们也可以把矩阵按照行向量分解,也可以表达成矩阵的行向量加权相加的形式。只不过列向量分解形式更为常见!

1、缩放

缩放矩阵M如下, S x S_x Sx 为x轴向的缩放因子, S y S_y Sy 为y轴向的缩放因子。
[ s x 0 0 s y ] \begin{bmatrix} s_x & 0\\ 0 & s_y\\ \end{bmatrix} [sx00sy]
P ′ = M P = [ s x 0 0 s y ] ∗ ( x y ) = ( s x ∗ x s y ∗ y ) P' = MP = \begin{bmatrix} s_x & 0\\ 0 & s_y\\ \end{bmatrix} * \begin{pmatrix} x\\y \end{pmatrix} = \begin{pmatrix} s_x * x\\s_y * y \end{pmatrix} P=MP=[sx00sy](xy)=(sxxsyy)

举个例子: M = [ 0.5 0 0 0.5 ] M = \begin{bmatrix} 0.5& 0\\ 0 & 0.5\\ \end{bmatrix} M=[0.5000.5] P = ( 2 2 ) P = \begin{pmatrix} 2\\2 \end{pmatrix} P=(22),则 P ′ = ( 1 1 ) P' = \begin{pmatrix} 1\\1 \end{pmatrix} P=(11),如下图所示:

在这里插入图片描述

2、旋转

默认地,正角度旋转代表逆时针,如下图所示的红色正方形,就是旋转45°

在这里插入图片描述

旋转矩阵 R θ R_\theta Rθ 如下:
[ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta\\ \end{bmatrix} [cosθsinθsinθcosθ]

基本推导如下图:

在这里插入图片描述

我们使用最笨的待定系数法求解,将矩阵 R θ R_{\theta} Rθ 设为 [ A B C D ] \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix} [ACBD],然后将两个点的前后结果带入计算,如下:
[ A B C D ] ( 1 0 ) = ( cos ⁡ θ sin ⁡ θ ) , [ A B C D ] ( 0 1 ) = > ( − sin ⁡ θ cos ⁡ θ ) \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix}\begin{pmatrix} 1\\0 \end{pmatrix} = \begin{pmatrix} \cos{\theta}\\\sin{\theta} \end{pmatrix}, \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix}\begin{pmatrix} 0\\1 \end{pmatrix} => \begin{pmatrix} -\sin{\theta}\\\cos{\theta} \end{pmatrix} [ACBD](10)=(cosθsinθ)[ACBD](01)=>(sinθcosθ)
所以自然得到:
A = cos ⁡ θ B = − sin ⁡ θ C = sin ⁡ θ D = c o s θ \begin{align} A &= \cos \theta\\ B &= -\sin \theta\\ C &= \sin \theta\\ D &= cos \theta\\ \end{align} ABCD=cosθ=sinθ=sinθ=cosθ

3、平移

平移就是让x轴和y轴的坐标分别偏移一定的量,如下图所示:

在这里插入图片描述

x ′ = x + t x y ′ = y + t y x' = x + t_x\\ y' = y + t_y x=x+txy=y+ty

我们记 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy) P ′ = ( x ′ y ′ ) P' = \begin{pmatrix} x'\\y' \end{pmatrix} P=(xy) T = ( t x t y ) T = \begin{pmatrix} t_x\\t_y \end{pmatrix} T=(txty) ,则上述可以表示为 P ′ ⃗ = P ⃗ + T ⃗ \vec{P'} = \vec P + \vec T P =P +T

但是我们发现,上述的形式没有用上矩阵,但在数学、物理中,人们都讲究统一,因此人们引入了齐次坐标的概念。

为了迎合平移也能统一使用矩阵进行变换,认为的给二维的向量添加一个维度,升为三维,如下:
p o s i t i o n = ( x y 1 ) , v e c t o r = ( x y 0 ) position = \begin{pmatrix} x\\y\\1 \end{pmatrix},vector = \begin{pmatrix} x\\y\\0 \end{pmatrix} position= xy1 vector= xy0
我们发现,位置向量咱们第三维补充1,方向向量咱们第三维补充0。

于是,咱们自然而然就可以定义出平移矩阵T,如下:
T = [ 1 0 t x 0 1 t y 0 0 1 ] 注: t x 表示 x 轴的偏移量, t y 表示 y 轴的偏移量 T = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix}\\ 注:t_x 表示x轴的偏移量,t_y表示y轴的偏移量 T= 100010txty1 注:tx表示x轴的偏移量,ty表示y轴的偏移量
于是,针对位置点的平移、以及位置向量的平移计算结果如下:

在这里插入图片描述

我们发现,方向向量的结果没有变化,这难道出问题了么?并没有,因为方向向量本身就是位置无关的,不变才是对的,而针对某个顶点是变化了的,这就符合咱们的要求!

4、齐次坐标下总结

引入齐次坐标后,缩放和旋转矩阵多了一个维度,这里列举一下:

缩放矩阵:
S = [ s x 0 0 0 s y 0 0 0 1 ] S = \begin{bmatrix} s_x & 0 & 0\\ 0 & s_y & 0\\ 0 & 0 & 1 \end{bmatrix} S= sx000sy0001
旋转矩阵:
R = [ cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ 0 0 0 1 ] R = \begin{bmatrix} \cos \theta & -\sin \theta & 0\\ \sin \theta & \cos \theta & 0\\ 0 & 0 & 1 \end{bmatrix} R= cosθsinθ0sinθcosθ0001

平移矩阵:
T = [ 1 0 t x 0 1 t y 0 0 1 ] T = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix}\\ T= 100010txty1

三维变换

首先,由于多引入了一个维度,复杂度上升。坐标系自然而然分为两种:左手系、右手系,示意图如下:

在这里插入图片描述

**为了方便,后续三维空间中的矩阵变换讲解以右手系为例!**左手系也是类似,大家熟练之后可自行推导!

同理,在三维坐标系下,同样为了统一平移的操作,引入齐次坐标后,变换矩阵都是4x4的,这里不多赘述!

1、缩放

由于缩放最是容易,也最容易理解,这里直接给出缩放矩阵:
S = [ s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ] 注: s x 、 s y 、 s z 分别为 x 、 y 、 z 轴的缩放比例 S = \begin{bmatrix} s_x & 0 & 0 & 0\\ 0 & s_y & 0 & 0\\ 0 & 0 & s_z & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ 注:s_x、s_y、s_z分别为x、y、z轴的缩放比例 S= sx0000sy0000sz00001 注:sxsysz分别为xyz轴的缩放比例

2、平移

也是类似,这里直接给出平移矩阵:
T = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] 注: t x 、 t y 、 t z 分别为 x 、 y 、 z 轴的偏移量 T = \begin{bmatrix} 1 & 0 & 0 & t_x\\ 0 & 1 & 0 & t_y\\ 0 & 0 & 1 & t_z\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ 注:t_x、t_y、t_z分别为x、y、z轴的偏移量 T= 100001000010txtytz1 注:txtytz分别为xyz轴的偏移量

3、旋转

由于三维世界中,旋转并不是绕一个点,而是绕一个旋转轴,所以最简单的旋转就是绕:x、y、z轴的旋转。

旋转规则: 绕某个轴旋转 θ \theta θ 角度,就是表明逆着此轴的方向眼睛看过去,逆时针旋转 θ \theta θ 角度。

例如如下示意图就是绕z轴旋转 θ \theta θ 角度:

在这里插入图片描述

并且我们一定要理解,绕z轴转动时,所有点的z坐标是不会变化的!

这里需要对照二维空间中的旋转矩阵的理解,本质上:二维旋转就是将两个相互垂直的基向量作为坐标轴,逆时针旋转的结果

所以,上述的绕z轴的旋转,可以理解为基向量就是 ( 1 0 0 ) \begin{pmatrix} 1\\0\\0 \end{pmatrix} 100 ( 0 1 0 ) \begin{pmatrix} 0\\1\\0 \end{pmatrix} 010

这里给出一个基本任意正交基向量 i ⃗ 、 j ⃗ \vec{i}、\vec{j} i j 的旋转示意图:

在这里插入图片描述

绕X轴旋转:

示意图如下:

在这里插入图片描述

因此,我们只是将基向量变成 ( 0 1 0 ) \begin{pmatrix} 0\\1\\0 \end{pmatrix} 010 ( 0 0 1 ) \begin{pmatrix} 0\\0\\1 \end{pmatrix} 001

所以,很容易构造出以下等式:
[ 1 0 0 0 0 cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 ] ( x i j 1 ) = ( x cos ⁡ θ ∗ i − sin ⁡ θ ∗ j sin ⁡ θ ∗ i + cos ⁡ θ ∗ j 1 ) \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos{\theta} & -\sin{\theta} & 0\\ 0 & \sin{\theta} & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} x\\i\\j\\1 \end{pmatrix} =\begin{pmatrix} x\\\cos{\theta}*i - \sin{\theta} * j\\\sin{\theta}*i + \cos{\theta} * j\\1 \end{pmatrix} 10000cosθsinθ00sinθcosθ00001 xij1 = xcosθisinθjsinθi+cosθj1

自然而然可以得出,绕x轴的旋转矩阵如下:
R x = [ 1 0 0 0 0 cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 ] R_x = \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos{\theta} & -\sin{\theta} & 0\\ 0 & \sin{\theta} & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rx= 10000cosθsinθ00sinθcosθ00001

绕Z轴旋转:

同理,示意图:

在这里插入图片描述

容易构造出以下等式:
[ cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 0 0 0 0 1 ] ( i j z 1 ) = ( cos ⁡ θ ∗ i − sin ⁡ θ ∗ j sin ⁡ θ ∗ i + cos ⁡ θ ∗ j z 1 ) \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 & 0\\ \sin{\theta} & \cos{\theta} & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} i\\j\\z\\1 \end{pmatrix} =\begin{pmatrix} \cos{\theta}*i - \sin{\theta} * j\\\sin{\theta}*i + \cos{\theta} * j\\z\\1 \end{pmatrix} cosθsinθ00sinθcosθ0000100001 ijz1 = cosθisinθjsinθi+cosθjz1
自然而然可以得出,绕z轴的旋转矩阵如下:
R z = [ cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 0 0 0 0 1 ] R_z = \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 & 0\\ \sin{\theta} & \cos{\theta} & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rz= cosθsinθ00sinθcosθ0000100001

绕Y轴旋转:

Y轴相比X和Z比较特殊,也是新手初学三维空间旋转最容易困惑的地方。但在咱们这里不存在,示意图如下:

在这里插入图片描述

容易构造出以下等式:
[ cos ⁡ θ 0 sin ⁡ θ 0 0 1 0 0 − sin ⁡ θ 0 cos ⁡ θ 0 0 0 0 1 ] ( j y i 1 ) = ( sin ⁡ θ ∗ i + cos ⁡ θ ∗ j y cos ⁡ θ ∗ i − sin ⁡ θ ∗ j 1 ) \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} & 0\\ 0 & 1 & 0 & 0\\ -\sin{\theta} & 0 & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} j\\y\\i\\1 \end{pmatrix} =\begin{pmatrix} \sin{\theta}*i + \cos{\theta} * j\\y\\\cos{\theta}*i - \sin{\theta} * j\\1 \end{pmatrix} cosθ0sinθ00100sinθ0cosθ00001 jyi1 = sinθi+cosθjycosθisinθj1
咱们发现,这里的形式稍微较绕x和绕z不一样了

本质就是因为这里的正交基分别是: ( 0 0 1 ) \begin{pmatrix} 0\\0\\1 \end{pmatrix} 001 ( 1 0 0 ) \begin{pmatrix} 1\\0\\0 \end{pmatrix} 100

自然而然可以得出,绕y轴的旋转矩阵如下:
R y = [ cos ⁡ θ 0 sin ⁡ θ 0 0 1 0 0 − sin ⁡ θ 0 cos ⁡ θ 0 0 0 0 1 ] R_y = \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} & 0\\ 0 & 1 & 0 & 0\\ -\sin{\theta} & 0 & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Ry= cosθ0sinθ00100sinθ0cosθ00001

结尾:喜欢的小伙伴可以点点关注+赞哦

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计计算五|MCMC( Markov Chain Monte Carlo)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法(Expectation-Maximization Algorithm,期望最大化算法) 统计计算三|Cases for EM 统计计算四|蒙特卡罗方法(Monte Carlo Method) 文章目录 系列文章目录一…

彻底理解浏览器的进程与线程

彻底理解浏览器的进程与线程 什么是进程和线程,两者的区别及联系浏览器的进程和线程总结浏览器核心进程有哪些浏览器进程与线程相关问题 什么是进程和线程,两者的区别及联系 进程和线程是操作系统中用于管理程序执行的两个基本概念进程的定义及理解 定义…

今日分享站

同志们,字符函数和字符串函数已经全部学习完啦,笔记也已经上传完毕,大家可以去看啦。字符函数和字符串函数and模拟函数 加油!!!!!

应用上架后的关键!苹果商店(AppStore)运营策略与技巧指南

1、运营期:怎么能活得好? ▍封号和下架问题 14天 在收到苹果封号通知(我们将会在14天后封你的账号)如果觉得冤枉可以在14天内进行申诉。14天并不是一个严格准确的时间,有可能会在第15天或者在第20天,甚至…

开源基于Node编写的批量HTML转PDF

LTPP批量HTML转PDF工具 Github 地址 LTPP-GIT 地址 官方文档 功能 LTPP 批量 HTML 转 PDF 工具支持将当前目录下所有 HTML 文件转成 PDF 文件,并且在新目录中保存文件结构与原目录结构一致 说明 一共两个独立版本,html-pdf 目录下是基于 html-pdf 模…

【考研数学】数学一和数学二哪个更难?如何复习才能上90分?

很明显考研数学一更难! 不管是复习量还是题目难度 对比项考研数学一考研数学二适用专业理工科类及部分经济学类理工科类考试科目高等数学、线性代数、概率论与数理统计高等数学、线性代数试卷满分150分150分考试时间180分钟180分钟试卷内容结构高等数学约60%&…

在 iCloud.com 上导入、导出或打印联系人

想将iPhone上的电话本备份一份到本地电脑上,发现iTunes好像只是音乐播放了,不再支持像电话本等功能,也不想通过其他第三方软件,好在可以通过iCloud进行导入导出。下面只是对操作过程进行一个图片记录而已,文字说明可以…

CSS中的Flex布局

目录 一.什么是Flex布局 二.Flex布局使用 2.1Flex使用语法 2.2基本概念 三.容器的属性 3.1所有属性概述 3.2flex-direction 3.3flex-wrap 3.4flex-flow 3.5justify-content 3.6align-items 3.7align-content 四.项目(子元素)的属性 4.1所有属性概述 4.2order 4…

失落的方舟 命运方舟台服账号怎么注册 游戏账号最全图文注册教程

探索奇幻大陆阿克拉西亚的奥秘,加入《失落的方舟》(Lost Ark)这场史诗般的冒险。这是一款由Smilegate精心雕琢的MMORPG巨作,它融合了激烈动作战斗与深邃故事叙述,引领玩家步入一个因恶魔侵袭而四分五裂的世界。作为勇敢…

非量表题如何进行信效度分析

效度是指设计的题确实在测量某个东西,一般问卷中使用到。如果是量表类的数据,其一般是用因子分析这种方法去验证效度水平,其可通过因子分析探究各测量量表的内部结构情况,分析因子分析得到的内部结构与自己预期的内部结构进行对比…

Websocket助手

功能介绍 WS助手是WebSocket调试的开发工具,该客户端工具可以帮助开发人员快速连接到测试/生产环境,它可以帮助您监视和分析 Websocket 消息,并在开发过程中解决问题;可以模拟客户端实现与服务器的数据交互,并完成批量…

QT基础初学

目录 1.什么是QT 2.环境搭建 QT SDK的下载 QT的使用 QT构建项目 快捷指令 QT的简单编写 对象树 编码问题 组件 初识信号槽 窗口的释放 窗口坐标体系 1.什么是QT QT 是一个跨平台的 C 图形用户界面库,支持多个系统,用于开发具有图形界面的应…

乡村振兴与农业科技创新:加大农业科技研发投入,推动农业科技创新,促进农业现代化和美丽乡村建设

一、引言 在当代中国,乡村振兴已成为国家发展的重要战略之一。作为国民经济的基础,农业的发展直接关系到国家的稳定和人民的福祉。随着科技的不断进步,农业科技创新在推动农业现代化和美丽乡村建设中发挥着越来越重要的作用。本文旨在探讨如…

线下实体店相亲机构不靠谱!靠谱的相亲交友婚恋软件有哪些?单身找对象必看!

当下大龄剩男剩女矛盾越来越大,单身市场越来越火热,相亲市场需求也在逐渐变大,线下相亲实体店也越来越多。但是从个人经历来说,实体店相亲不靠谱,收费很高,拖又多,根本脱不了单。现在呢&#xf…

echarts-dataset,graphic,dataZoom, toolbox

dataset数据集配置数据 dataset数据集,也可以完成数据的映射,一般用于一段数据画多个图表 例子: options {tooltip: {},dataset: {source: [["product", "2015", "2016", "2017"],["test&q…

视频汇聚EasyCVR视频监控平台GA/T 1400协议特点及应用领域解析

GA/T 1400协议,也被称为视图库标准,全称为《公安视频图像信息应用系统》。这一标准在公安系统中具有举足轻重的地位,它详细规定了公安视频图像信息应用系统的设计原则、系统结构、视频图像信息对象、统一标识编码、系统功能、系统性能、接口协…

亚马逊VC账号产品热销,在美国哪些智能小家电产品最好卖?

亚马逊VC账号产品在美国市场的热销,反映了消费者对于特定智能小家电产品的强烈需求。智能小家电产品因其实用性、便捷性和科技感,近年来在美国市场备受追捧。 以下是一些在亚马逊VC账号上热销的智能小家电产品: 智能扫地机器人 这类产品在美…

重庆耶非凡科技选品师项目大揭秘:成功背后的故事与经验

在电商行业迅猛发展的今天,选品师这一职业愈发受到市场的关注。重庆耶非凡科技有限公司凭借其专业的选品团队和科学的选品方法,成为众多商家关注的焦点。那么,该公司的选品师项目是否真的有成功的案例呢?接下来,我们将从多个角度…

计算机算法中的数字表示法——原码、反码、补码

目录 1.前言2.研究数字表示法的意义3.数字表示法3.1 无符号整数3.2 有符号数值3.3 二进制补码(Twos Complement, 2C)3.4 二进制反码(也称作 1 的补码, Ones Complement, 1C)3.5 减 1 表示法(Diminished one System, D1)3.6 原码、反码、补码总结 1.前言 昨天有粉丝让我讲解下定…

Java实现异步的4种方式

文章目录 异步1、Future与Callable2. CompletableFuture3. Spring框架的异步支持3.1 启动类开启对Async的支持 EnableAsync3.2 配置自定义线程池3.3 异步业务3.4 调用异步业务方法 4. 使用消息队列4.1 安装RabbitMq4.2 使用4.3 MQ消息丢失以及重复消费问题 5、总结 异步 异步&…