三维变换矩阵的理解

3D空间中的一个点的坐标,可以用(x,y,z)来表示。

对这个点的坐标变换有三种操作:缩放、平移、旋转。 缩放之后,点的坐标变为(Sx*x,Sy*y,Sz*z);平移之后,点的坐标变为(Tx+x,Ty+y,Tz+z);旋转会比较麻烦一点,在后边的详细内容中描述。

上面的操作其实可以用矩阵运算来简单的表示,但是用矩阵表示变换的时候会有一个问题:用一个矩阵可以同时表示点的缩放、旋转,但是没办法表示平移了。 此时需要引入一个齐次坐标的表示方法,将点的(x,y,z)坐标表示为(x,y,z,1)

1.缩放矩阵

点在x、y、z轴的缩放分别为Sx、Sy、Sz,那么缩放可以用下面的矩阵来表示:

Sx

0

0

0

0

Sy

0

0

0

0

Sz

0

0

0

0

1

(x,y,z,1) * S = (Sx*x,Sy*y,Sz*z,1)

2.旋转矩阵

首先看一下点绕着x、y、z三个坐标轴旋转一定角度时,坐标的表示方法:

用矩阵来表示:

那么当点(x,y,z)绕x、y、z轴分别旋转Rx、Ry、Rz角度时,旋转矩阵R=RxRyRz,得到矩阵如下:

cos(Rx)*cos(Rz)

cos(x)*sin(z)

-sin(y)

0

sin(x)sin(y)cos(z)-cos(x)*sin(z)

sin(x)sin(y)sin(z)+cos(x)*cos(z)

sin(x)*cos(y)

0

cos(x)sin(y)cos(z)+sin(x)*sin(z)

cos(x)sin(y)sin(z)-sin(x)*cos(z)

cos(x)*cos(y)

0

0

0

0

1

3.平移矩阵

点在x、y、z轴的平移分别为Tx、Ty、Tz,那么缩放可以用下面的矩阵来表示:

1

0

0

0

0

1

0

0

0

0

1

0

Tx

Ty

Tz

1

(x,y,z,1) * T = (Tx+x,Ty+y,Tz+z,1)

4.综合变换矩阵

综合上边的三个矩阵,可以得到最终的变换矩阵: M=S*R*T

Sxcos(Rx)cos(Rz)

Sxcos(Rx)sin(Rz)

-Sx*sin(Ry)

0

Sy(sin(Rx)sin(Ry)cos(Rz)-cos(Rx)sin(Rz))

Sy(sin(Rx)sin(Ry)sin(z)+cos(Rx)cos(Rz))

Sysin(Rx)cos(Ry)

0

Sz(cos(Rx)sin(Ry)cos(Rz)+sin(Rx)sin(Rz))

Sz(cos(Rx)sin(Ry)sin(Rz)-sin(Rx)cos(Rz))

Szcos(Rx)cos(Ry)

0

Tx

Ty

Tz

1

简写为

m00

m01

m02

0

m10

m11

m12

0

m20

m21

m22

0

Tx

Ty

Tz

1

不同的编译器在内存管理方式上的不同,会导致有的情况下使用行优先的写法较好,有的情况下使用列优先的写法较好。我这边实践的过程中接触的是列优先的写法:

m00

m10

m20

Tx

m01

m11

m21

Ty

m02

m12

m22

Tz

0

0

0

1

得到这样一个矩阵之后,围绕x、y、z三个轴所做的选择、缩放、平移操作,所影响的矩阵中的位置就一目了然了

4.1左右手系转换

假如我们得到了一个右手坐标系下的变换矩阵,需要把它转换为左手坐标系下的变换矩阵,那么可以将其绕一个平面翻转,假设选择绕xoy平面翻转。

分析一下翻转之后的结果:Tz变为-Tz;Rx变为-Rx;Ry变为-Ry;其他不变。

正弦和余弦函数的曲线:

将这些变化代入上面得到的最终版变换矩阵,可以得到

m02 = -m02; m12 = - m12; m20 = -m20; m21 = -m21; Tz = -Tz

将变换矩阵中这些位置的值都乘以-1,即可得到绕xoy平面翻转之后的左手系变化矩阵。

m00

m10

-m20

Tx

m01

m11

-m21

Ty

-m02

-m12

m22

-Tz

0

0

0

1

也可以换一种思路,当用右手系变换矩阵变换完成之后,将坐标沿着xoy平面做个翻转,这个翻转可以用一个缩放矩阵来表示:

1

0

0

0

0

1

0

0

0

0

-1

0

0

0

0

1

M*S 得到新的矩阵,转换为列优先的写法:

m00

m10

-m20

Tx

m01

m11

-m21

Ty

m02

m12

-m22

Tz

0

0

0

1

也就是说,把第三列都乘以-1就可以了

上面两种思路可以得到等价的坐标系转换结果。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CreateAMind

DeepMind时间序列生成模型GTMM - NTM改进

使用vae推理;lstm 时间相关建模;external memory加强记忆;和神经图灵机 可微分计算机等进行比较。

1362
来自专栏应兆康的专栏

“西瓜书”——第三章_线性模型(笔记)

线性模型形式简单、易于建模,许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。 ? ? ? ? ?

43015
来自专栏和蔼的张星的图像处理专栏

4. 经典卷积网络之AlexNet

原文:《ImageNet Classification with Deep Convolutional Neural Networks》 我没有读原文,这个已...

1762
来自专栏目标检测和深度学习

手把手教你搭建目标检测器-附代码

1302
来自专栏老秦求学

图像旋转

描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。 输入第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <...

4477
来自专栏Coding迪斯尼

用Python从零开始设计数字图片识别神经网络--搭建基本架构

1744
来自专栏Python小屋

Python扩展库scipy.misc中图像转换成pillow图像

众所周知,在数字图像处理领域中有很多基准测试图像,这些图像用来作为科研人员PK自己的算法时的参考,给大家提供一个公平的样本,针对同一个问题进行处理时,可以用这些...

3245
来自专栏机器学习算法工程师

手把手教你搭建目标检测器-附代码

翻译:刘威威 编辑:祝鑫泉 前 言 本文译自:[http://www.hackevolve.com/create-your...

3524
来自专栏计算机视觉战队

深度压缩网络 | 较大程度减少了网络参数存储问题

神经网络是计算密集型和内存密集型,很难使它们用有限的硬件资源去部署在嵌入式系统中。为了解决这种限制,本文引入“深度压缩”,一共有三个阶段的流水线:剪枝、量化和霍...

3605
来自专栏Golang语言社区

转--Golang图像处理工具库,图像相似度计算,图像二值化

imgo golang图像处理工具库,图像相似度计算,图像二值化(golang image process lib) 目前只支持jpg,png 安装 go ge...

65914

扫码关注云+社区

领取腾讯云代金券