跟紧工作需求学习,于是抽了点时间看了看用于2D3D转换的矩阵内容。

  矩阵在3D数学中,可以用来描述两个坐标系间 的关系,通过定义的运算能够把一个坐标系中的向量转换到另一个坐标系中。在线性代数中,矩阵就是以行和列形式组织的,向量是标量的数组,矩阵是向量的数组。

  一般来说,方阵能够描述任意线性变换。线性变换保留了直线和平行线,但是原点没有移动。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能在变换中发生了改变。线性变换可能“拉伸”,但不会“弯折”、”卷折“坐标系。

  任意向量的一种扩写形式

  

  右边的单位向量就是x、y、z轴。向量的每个坐标都表明了平行于相应坐标轴的有向位移。一个坐标系能用任意3个线性无关的基向量定义,我们以笛卡尔坐标轴为例子,指定p q r为x y z轴正方向的单位向量,构建一个3 x 3矩阵M。

  

  

  此时如果用一个向量乘以该矩阵,就相当于一次坐标转换。(我们可以把”转换“和”乘法“等价)

  而在使用矩阵运算时,矩阵的乘积不能表示平移变换。因此引入了第四个分量w,w称为比例因子,一般为1。当w不为0时,表示一个坐标当w为0时,在数学上代表无穷远点,即并非一个具体的坐标位置,而是一个具有大小和方向的向量。从而,通过w我们就可以用同一系统表示两种不同的量。

  在OPENGL中,作为坐标点时,w参数为1,否则为0,如此一来,所有的几何变换和向量运算都可以用相同的矩阵乘积进行运算和变换,当一个向量和一个矩阵相乘时所得的结果也是向量。

  

  下图显示了应用到点 (2,1) 的多个线性转换。

                                 

  某些其他转换(如转换)不是线性的,并且不能表示为2×2矩阵的乘法。 假设要从点开始 (2,1) ,将其旋转90度,将其在 x 方向上转换为3个单位,并在 y 方向转换为4个单位。 可以通过使用矩阵乘法后跟矩阵加法实现此目的。

                                                      

  线性转换 (按 2 x 2 矩阵相乘) 后接 (添加1×2矩阵) 称为仿射转换。 将仿射转换存储在一对矩阵中的替代方法 (一个用于线性部分,另一个用于平移) ,用于在3×3矩阵中存储整个转换。 若要执行此操作,平面中的点必须存储在具有虚第三坐标的1×3矩阵中。 常见的方法是使所有第三个坐标等于1。 例如,点 (2,1) 由矩阵 [2 1 1] 表示。 下图显示了一个仿射转换 (旋转90度;在 x 方向上转换3个单位,在 y 方向上4个单位的) 表示为按单一3×3矩阵的乘法。

  点 (2,1) 映射到点 (2,6) 。 请注意,3 x 3 矩阵的第三列包含数字0,0,1。 这对于仿射转换的 3 x 3 矩阵总是如此。 重要数字是第1列和第2列中的六个数字。 矩阵的左上2×2部分表示转换的线性部分,第三行中的前两个条目表示平移。

                    

                    

  复合转换是一系列转换,一个后跟另一个。 对矩阵[2 1 1]表示的点(2,1)先后进行转换A B C。

    [2 1 1]ABC = [-2 5 1]

  不是将复合转换的三个部分存储在三个单独的矩阵中,而是可以将 A、B 和 C 相乘,以获取存储整个复合转换的单个3×3矩阵。

    [2 1 1]D = [-2 5 1]

  

  复合转换的顺序很重要。 通常,旋转,然后缩放,然后平移与缩放、旋转和平移不同。 同样,矩阵相乘的顺序也非常重要。

  参考链接:https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/advanced/matrix-representation-of-transformations?view=netframeworkdesktop-4.8

数学:3D和矩阵的更多相关文章

  1. 3D数学读书笔记——矩阵基础番外篇之线性变换

    本系列文章由birdlove1987编写.转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25102425 前面有一篇文章 ...

  2. 浅谈数学上的矩阵——矩阵的乘法运算的概念及C++上的实现模板

    首先让我们来谈一谈数学意义上的矩阵(在座各位也可以简单地将它理解为一个二维数组) 这样可以帮助我们理解矩阵加速及其运用的原理(矩阵加速是一个及其玄学的东西,所以请重点理解矩阵乘法)  这里给出一段严格 ...

  3. 3D数学读书笔记——矩阵基础

     本系列文章由birdlove1987编写,转载请注明出处.    文章链接:http://blog.csdn.net/zhurui_idea/article/details/24975031   矩 ...

  4. 3D数学读书笔记——矩阵进阶

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25242725 最终要学习矩阵 ...

  5. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  6. P3216 [HNOI2011]数学作业 (矩阵快速幂)

    P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...

  7. 机器学习中的数学-强大的矩阵奇异值分解(SVD)及其应用

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  8. BZOJ 2326 数学作业(矩阵)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2326 题意:定义Concatenate(1,N)=1234567……n.比如Concat ...

  9. [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】

    题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...

随机推荐

  1. python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()

    主要讲类的内部方法 __setattr__  __getattr_  __delattr__  hasattr  __getattribute__  __getitem__(),__setitem__ ...

  2. Linux shell sed命令在文件行首行尾添加字符

    昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed命令上,今天不总结一下都对不起昨天流逝的时间啊~~~ 用sed命令在行首或行尾添加字符的命令有以下几种: 假设处理的文本为test.f ...

  3. 《SystemVerilog验证-测试平台编写指南》学习 - 第3章 过程语句和子程序

    <SystemVerilog验证-测试平台编写指南>学习 - 第3章 过程语句和子程序 3.1 过程语句 3.2 任务.函数以及void函数 3.3 任务和函数概述 3.4 子程序参数 3 ...

  4. linux .tar.xz 文件解压和压缩

    场景:centos7.0下文件格式为xxx.tar.xz,解压和压缩命令: 压缩 tar -Jcf linux-3.10.0-123.13.1.el7.tar.xz(文件名) linux-3.10.0 ...

  5. zabbix监控之自动发现/自动注册

    一.自动发现 1.概述 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,zabbix可以在你的机器上自动开始监控文件系统或者网络接口,而无需为每个文件系统或网 ...

  6. 6.1 tar:打包备份

    tar命令     在Linux系统里,tar是将多个文件打包在一起,并且可以实现解压打包的文件的命令.是系统管理员最常用的命令之一,tar命令不但可以实现对多个文件进行打包,还可以对多个文件打包后进 ...

  7. python文件处理(对比和筛选)

    #!/user/bin/python #!coding=utf-8 # -*- coding: utf-8 -*- # 2017-9-25 #author:jingwenshuai import sy ...

  8. 我眼中的WebViewJavascriptBridge(图解)

    工作中涉及到一段时间iOS开发,在开发中有个小小的框架让我非常深刻,就是WebViewJavascriptBridge,用于原生控件与前端交互通信.我觉得WebViewJavascriptBridge ...

  9. GO学习-(9) Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  10. NVIDIA GPU自动调度神经网络

    NVIDIA GPU自动调度神经网络 对特定设备和工作负载进行自动调整对于获得最佳性能至关重要.这是有关如何使用自动调度器为NVIDIA GPU调整整个神经网络. 为了自动调整神经网络,将网络划分为小 ...