草庐IT

图形学-变换(平移矩阵,旋转矩阵,缩放矩阵,线性变换,仿射变换,齐次坐标)

搬砖怪 2025-05-20 原文

1.变换

1.1 什么是变换?

变换(Transform)是计算机图形学中非常重要的一部分。变换包含模型变换(Modeling transform)以及视图变换(View transform)。模型变换指的是变换模型(被拍摄物体)的位置,大小和角度;视图变换指的是变换照相机的位置和角度。从相对运动的角度来看,两种变换是可以相互转化的。

1.2 模型变换

1.2.1 二维变换

  1. 缩放变换

缩放变换(Scale)中,如果一个图片以原点 (0, 0) 为中心缩放 𝑠 倍。那么点 (𝑥, 𝑦 ) 变换后数学形式可以表示为

写成矩阵形式为:

当然,我们也可以给 x 轴和 y 轴不同的缩放倍数 𝑠𝑥 和 𝑠𝑦。在非均匀情况下,缩放变换的矩阵形式为

  1. 反射变换

反射变换(Reflection)指的是图片对着 x 轴或者 y 轴做对称变换。对于图片上的点 (𝑥, 𝑦 ) 在经过 x 轴
的对称反射变换后,数学形式可以表示为:

表示成矩阵形式为:

同理可以得到 y 轴对称反射变换后的变换矩阵为:

沿原点反射变换的变换矩阵为:

  1. 切变变换

切变变换(Shear),指的是在物理学上指的是两个距离很近、大小相等、方向相反的平行力作用于同一物体上所引起的形变。使用示意图可以更直观的去表示什么是切变。如图2.2所示,是图片在 x 轴方向上发生了切变。从图中我们可以看出所有点在 y 轴上的坐标不变,在 x 轴上的坐标满足:𝑦 = 0 上的点,x 轴坐标不发生变化;𝑦 = 1 上的点水平方向上移动了 𝑎 个长度。因此对于任意一个点来说,水平方向上移动长度为𝑎𝑦。

切变的矩阵变换可以写作:

  1. 旋转变换

我们默认旋转变换(Rotate)都绕着原点 (0, 0) 旋转,并且默认旋转方向为逆时针方向(逆时针方向旋
转角度值为正,顺时针旋转角度值为负)。旋转变换的推导过程比较复杂(见后续推导过程)。结论如下:当一个点 (𝑥, 𝑦 ) 绕着原单 (0, 0) 旋转 𝜃 角时,变换矩阵可以表示为:

  1. 线性变换

对于任何一种变换如果可以写作:

矩阵形式可以表示为:

那么我们认为这种变换是线性变换(Linear transformation)。

2. 齐次坐标

  1. 平移变换

平移变换(Translation)相比于以上的线性变换有特殊的地方。平移变换的数学形式为:

这种数学表示不能写作线性变换的矩阵形式,只能记作:

说明平移操作不是线性变换。但是我们不希望把平移操作看作特殊变换,因此需要把这些变换统一起
来,就引入了齐次坐标。

  1. 齐次坐标的引入

为了统一变换操作,我们引入一个新的维度。对于二维的点 (𝑥, 𝑦 ) 我们可以增加一个维度,对于 2 维的
点可以表示为 (𝑥, 𝑦, 1)𝑇2 维向量的 (𝑥, 𝑦, 0)𝑇。因此,一个点的平移可以用矩阵表示为:


为什么点补充维度大小为 1,但是向量补充维度大小为 0?

对于向量来说,平移变换不应该使向量的结果发生变化。因此补充维度为 0 的时候可以屏蔽
平移带来的影响。
对于加入齐次坐标的点和向量满足:

  • 向量 + 向量 = 向量
  • 点-点 = 向量
  • . 点 + 向量 = 点
  • 点 + 点 = 两个点中点
    对引入齐次坐标的点的扩充定义如下:

因此一个点加上另一个点的结果是两个点的中点。引入了扩充定义点和向量的加法是有意义的。

  1. 仿射变换

仿射变换(Affine)包含线性变换与平移变换。可以用矩阵表示为:

使用齐次坐标后可以写作:

  1. 逆变换

任何变换的逆变换(Inverse transform)的变换矩阵 𝑀 的逆矩阵 𝑀−1 表示。

  1. 变换的组合与分解

变换的组合
可以用矩阵的乘法进行变换的组合(Transform compose)。变换的先后顺序不同,变换的结果不同。矩
阵和向量的乘法是从右到左依次相乘,从右到左依次应用变化。如果我们要依次应用变化 𝐴1, 𝐴2, 𝐴3, ⋯,写成矩阵形式:


根据矩阵运算的结合律, 我们可以先把变换矩阵乘在一起,接下来把这个矩阵的乘积和向量相乘。可
以用一个矩阵表示一个复杂的变换。

变换的分解
所有的复杂变换都可以分解成多个普通的变换。为了使某个图像沿着某个点 𝑐 变换,我们可以分解为
以下步骤:

  1. 把中心点 𝑐 移动到原点
  2. 进行旋转;
  3. 把中心点(0,0)移动到原来的中心点

用变换矩阵表示为:

3. 三维变换

3 维变换可以类比于 2 维变换得到引入齐次坐标的点和向量,3 维的点可以表示为 (𝑥, 𝑦, 𝑧, 1)𝑇,3 维向量可以表示为 (𝑥, 𝑦, 𝑧, 0)𝑇。当 𝑤 ≠ 0 的时候:(𝑥, 𝑦, 𝑧, 𝑤 ) = (𝑥/𝑤, 𝑦/𝑤, 𝑧/𝑤, 1)

使用 4 × 4 的矩阵来表示仿射变换:

左上角表示是一个3✖3的线性变换
在仿射变换中的变换矩阵表示先线性变换在平移

  1. 3 维变换中缩放变换

3 维变换中缩放变换的变换矩阵:

  1. 维变换中的平移变换

三维变换中平移变换的变换矩阵:

3. 三维变换中的旋转变换

当空间内的物体绕着 x 轴,y 轴或者 z 轴旋转的时候,变换矩阵为:


对于一般性的旋转问题,可以用简单的旋转描述复杂的旋转。用 x 轴,y 轴和 z 轴上的旋转来定义旋转:

这三个角就被称作欧拉角(Euler angles)

  1. 罗德里格斯旋转公式
    绕着旋转轴 n 旋转角度 𝛼。默认旋转轴是过原点的,对于不过原点的条件可以将图形平移到过原点的
    旋转轴上,旋转后再平移回去。罗德里格斯旋转公式(Rodrigues’ Rotation Formula)是:

有关图形学-变换(平移矩阵,旋转矩阵,缩放矩阵,线性变换,仿射变换,齐次坐标)的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  3. ruby - 图形与 Prawn - 2

    寻找一个gem为prawn添加gtraphing功能,我找到了thisone但它似乎有点过时了。有没有更活跃的gem? 最佳答案 直接在Prawn内部绘图没有什么非常活跃的,但是Gruff是一个高度可配置的活跃gem,可以让你制作各种图表。事实上,prawn-graph基本上是gruff的包装器!我的建议是使用gruff生成所需的图表和图形,然后将它们作为图像嵌入到Prawn文档中。所以代码看起来像这样:g=Gruff::Line.new(400)g.title="TransparentBackground"g.theme={:co

  4. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  5. 欧拉角表示的姿态矩阵(313和312转序) - 2

    一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cos⁡αsin⁡α0−sin⁡αcos⁡α]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx​(α)=​ 100​0cosα−sinα​0sinαcosα​​绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cos⁡α0−sin⁡α010sin⁡α0cos⁡α]R_y(\alpha

  6. 欧拉角、旋转矩阵及四元数 - 2

    欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋

  7. ruby - 如何修改矩阵(Ruby std-lib Matrix 类)? - 2

    我理解RubystdlibMatrix是不可修改的,也就是说,例如。m=Matrix.zero(3,4)不会写m[0,1]=7但我非常想做...我可以用笨拙的编程来做,比如defmodify_value_in_a_matrix(matrix,row,col,newval)ary=(0...m.row_size).map{|i|m.rowi}.map(&:to_a)ary[row][col]=newvalMatrix[*ary]end...或者作弊,比如Matrix.send:[]=,0,1,7但我想知道,这一定是人们一直遇到的问题。有没有一些标准的、习惯的方法可以做到这一点,而不必使用

  8. 线性代数让我想想:快速求三阶矩阵的逆矩阵 - 2

    快速求三阶矩阵的逆矩阵前言一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示)A−1=1[  ][−[  ]−[  ]−[  ]  −[  ]]=A−1=1[  ][   M11−[M12]   M13−[M21]   M22−[M23]     M31−[M32]   M33]⊤\begin{aligned}&A^{-1}=\frac{1}{[\\]}\left[\begin{array}{cccccc}&-[\\]&\\-[\\]&&-[\\]\\\\&-[\\]&\\\end{array}\right]=\\\\&A^{-1}=\frac{1}{[\\]}\left[\b

  9. 相机校准—外参矩阵 - 2

    在本文中,我们将探讨摄影机的外参,并通过Python中的一个实践示例来加强我们的理解。相机外参摄像头可以位于世界任何地方,并且可以指向任何方向。我们想从摄像机的角度来观察世界上的物体,这种从世界坐标系到摄像机坐标系的转换被称为摄像机外参。那么,我们怎样才能找到相机外参呢?一旦我们弄清楚相机是如何变换的,我们就可以找到从世界坐标系到相机坐标系的基变换的变化。我们将详细探讨这个想法。具体来说,我们需要知道相机是如何定位的,以及它在世界空间中的位置,有两种转换可以帮助我们:有助于确定摄影机方向的旋转变换。有助于移动相机的平移变换。让我们详细看看每一个。旋转通过旋转改变坐标让我们看一下将点旋转一个角度

  10. ruby-on-rails - 使用 geokit 或其他 ruby​​ gem 计算一系列地理坐标的中心 - 2

    我使用geokit和geokit-railsgemforrails有一段时间了,但我还没有找到答案的一个问题是如何找到一组点的计算聚合中心。我知道如何计算两点之间的距离,但不会超过2。我的理由是,我在同一个城市中有一系列的点……一切都完美的城市会有一个我可以使用的中心,但有些城市,比如柏林没有一个完美的中心。他们有多个中心,我只想使用我数据库中的所有地点列表来计算特定分布的中心。还有其他人遇到过这个问题吗?有什么建议吗?谢谢 最佳答案 之前从未使用过Geokit,这个操作背后的数学原理相对容易自己实现。假设这些点由纬度和经度组成,您

随机推荐