图形学初识--空间变换

news2025/4/5 16:11:11

文章目录

  • 前言
  • 正文
    • 矩阵和向量相乘
    • 二维变换
      • 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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2、C++简单程序设计:工具、数据类型与运算符

C简单编程 C编程工具程序开发基本概念程序工具VS界面简介项目创建项目调试帮助文档 C数据类型C程序基本结构C符号关键字标识符文字运算符分隔符空白 C数据类型基本数据类型常量变量符号常量 C运算符与表达式算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符C 中的运…

光伏设计有哪些工具可以使用?

在光伏系统的设计过程中,选择合适的工具对于提高设计效率、确保系统性能以及优化成本效益至关重要。以下是一些常用的光伏设计工具,它们在不同的设计阶段发挥着重要作用。 一、专业设计软件 专业设计软件是光伏系统设计的核心工具。这些软件提供了从初…

2024 手机端使用现有网络资源在外网预览海康威视摄像头画面

一、适用场景 1、家有老人行动不便时,远离家乡的你,是否想了解一下老人的现状态(如:老人是否摔倒爬不起来、是否遇到救助无人的环境)。 2、天气炎热或寒冷的情况下,离出租房较远,身为出租房老板…

BU01板卡引脚

概述 BU01 是一款高速采集卡,主要用于高带宽数据采集及传输,应用领域多为数据中 心及数据采集领域。 端口提供60Gbps 传输带宽,可兼容2 个SFP万兆网口,和1 个40GE QSFP 光 口。和主机通信采用的是PCIE 2.0 x8 模式,最…

2024-5-29 石群电路-17

2024-5-29,星期三,17:26,天气:晴,心情:晴.今天又是阳光明媚的一天,没有什么特别的事情发生,给女朋友做了好吃的,吃了西瓜,加油学习,嘻嘻嘻~~~~ 今…

【CALayer-时钟练习-旋转 Objective-C语言】

一、好,接下来呢,我们要让它旋转出来, 1.让它先旋转起来啊,这根秒针,让它先转着, 把之前的代码复制粘贴一份,改个名字,叫:07-时钟练习(旋转) 旋转的话,我现在应该让它,一秒钟,旋转一次,一秒钟,旋转一次, 那么,这个时候,我们应该怎么样去做, 我现在这个是…

打造云计算时代的仿真软件

2024年5月25日,北京云道智造科技有限公司(下称“云道智造”)在深圳成功举办了2024新品发布会暨用户大会。来自全国各地的近500位客户和合作伙伴代表齐聚一堂,共同见证了云道智造新产品的隆重发布,交流分享了仿真领域的…

深入理解哈希加密:md5在保护用户数据中的应用

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、md5加密方法简介 二、md5加密方法的实现 示例代码: 三、md5加密方法在实际…

母亲的爱与妻子的爱,同为“爱“。不同感受!

母亲的爱与妻子的爱,虽然都是一个女人给予男人的爱,却有着本质的不同! 天下父母对儿女的爱大多相同。在母亲眼中,儿女无论是多大年龄,无论你是否长大成人,也无论你做多大的官,有多么大的成就&am…

【ai】livekit服务本地开发模式2:模拟1个发布者

是一个会议用软件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

现场辩论赛活动策划方案

活动目的: 技能竞赛中的辩论环节既可以考核员工的知识点,同时也可以考核员工业务办事能力,表达能力,是一种比较全面且较有深度的竞赛方式。 辩论赛细则: 1、时间提示 : 自由辩论阶段,每方使用时间剩…

【2024.5.29数据库MYSQL史上最详细基础学习汇总】

初识数据库 什么是数据库: DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作; 什么是关系型数据库(SQL)? 关系型数据库是依据关系模型来创建的…

低代码开发难吗?

在软件开发的多样化浪潮中,低代码开发平台以其简化的编程模型,为IT行业带来了新的活力。作为一位资深的IT技术员,我对低代码开发平台的易用性和强大功能有着深刻的认识。今天,我将分享我对YDUIbuilder这一免费开源低代码平台的使用…

超结MOS在全桥电路上的应用-REASUNOS瑞森半导体

一、前言 全桥电路定义 全桥电路是一种常见的电子电路,由四个开关管和一个负载组成,可将直流电转换为交流电。 全桥电路的应用领域 全桥电路广泛应用于电力电子领域,如开关电源、变频器、逆变器、电动汽车、工业自动化等领域 。在电路中&…

JetLinks物联网平台在windows 7搭建(前后端)部署教程

近期对接TCP、modbusTCP等自定义解析,做了很多万能解析的方法,却都不遂人意,而一直在用的ThingsBoard不能直接对接TCP透传(企业版除外),需要在外围做一些自定义解析,然后转json再mqtt上传,感觉来说比较麻烦…

湘潭大学软件工程专业oracle-sqlplus安装教程

前言 笔者在网上找了一些教程,但是没有装好,或者不知道啥原因,反正就是登不进去老师要求的系统,连接不上服务器,非常苦恼,请教了一下同学,终于弄好了,本文希望能帮助到和我一样有相…

微信公众号开发(一):准备工作

微信公众号除了可以用来发文章,但也可以用来做一些自动回复的小工具,比如: 下面,记录一下开发过程,先是一些准备工作: 一:公众号设置 1、申请公众号 2、进入公众号后台,记录AppID…

做视频号小店和达人对接的好,爆单少不了!

大家好,我是喷火龙。 目前,视频号是没有什么自然流量的,所以,想要出单、爆单的话,靠达人带货的方式才是最可靠的,靠达人带货是肯定要对接达人,并和达人沟通带货的。 下面给大家讲一讲应该怎么…

接口的扩展方法 注意点

只把必备的契约定义在接口中,把其他功能留给扩展方法去实现 定义接口的时候,只把必备的功能列出来就行了,而其他一些功能则可以在别的类里面以扩展方法的形式去编写,那些方法能够借助原接口所定义的基本功能来完成自身的任务。 这…

【Python Cookbook】S01E02 从任意长度的可迭代对象中分解元素

目录 问题解决方案讨论 问题 从某个不确定长度的迭代对象中分解出 N N N 个元素。 解决方案 *分解操作和各种函数式语言中的列表处理功能有着一定的相似性。例如,如果有一个列表,可以像下面这样轻松将其分解为头部和尾部。 scores [99, 97, 91, 89…