专栏首页吹弹牛皮之unity程序设计吹弹牛皮之Unity 引擎基础 - 矩阵(三)

吹弹牛皮之Unity 引擎基础 - 矩阵(三)

小菜介绍矩阵已经有三篇了,本篇将继续来探讨矩阵的那些事。

回顾上篇《吹弹牛皮之Unity 引擎基础 - 矩阵(二)》中介绍的矩阵的分类。

继续来介绍线性变换矩阵。

线性变换

1).旋转

2).缩放

3).正交投影

4).镜像

5).切变

一.旋转矩阵

2D中的旋转

上图中展示了p,q两个基向量(单位向量)绕原点旋转后得到的新基向量p'和q'。根据勾股定理有:

3D中的旋转

在3D空间中,绕轴旋转是指的旋转所绕的直线,不一定是坐标轴x,y,z。

既然有了旋转就有旋转的“正”“负”方向分辨。小菜讨论的内容大多涉及的是和Unity一样的“左手坐标系”。

1).点绕着x轴旋转θ度:

2).点绕着y轴旋转θ度:

3).点绕着z轴旋转θ度:

编码有:

由于每次求取sin和cos是一个不小的消耗,尽管现如今的设备计算能力已经很优越,但类似这样的函数频繁调用。小菜简单包装了UMathf.SinCos(out sin,out cos,theta)来一次求取sin和cos的结果值供矩阵使用。

扩展:

3D中绕任意轴旋转矩阵有:

其中n是单位向量描述的旋转轴。

由于计算过于复杂并不实用。所以小菜并没有在编码中实现,旋转有三种方式,分别是矩阵/欧拉角/四元数,在不同的场合选择不同的方式可能会更加的便捷。关于欧拉角和四元数小菜也会在接下来的篇幅中详尽介绍。

二.缩放矩阵

2D中的缩放

根据上图有:

3D中的缩放

其中Kx = Ky =Kz的缩放称为统一缩放。否则称为非统一缩放。

编码有:

依然是巧用之前的UVector3向量类,来传递不同轴上的缩放分量。

三.正交投影矩阵

和之前介绍的透视投影区分,正交投影是没有近大远小关系的平行投影。

2D中的正交投影

向x轴投影的2D矩阵有:

向y轴投影的2D矩阵有:

向任意直线投影的2D矩阵有:

3D中的正交投影

向xy平面投影的3D矩阵有:

向xz平面投影的3D矩阵有:

向yz平面投影的3D矩阵有:

基本上的规律就是抛弃维度,把不在平面的轴向置0。

由于平面很难来描述,描述平面就借助一个垂直于平面的单位向量来描述,也就上面公式中的向量S。

向任意平面投影的3D矩阵有:

编码有:

首先判断下是否是单位向量。接着是对向任意平面投影的3D矩阵公式简化。

四.镜像矩阵

2D中的镜像

沿任意轴镜像的2D矩阵:

3D中的镜像

沿着任意轴镜像的3D矩阵:

n依旧是单位向量且垂直于镜像平面。

编码:

五.切变矩阵

切变是一种很少用到的变换,也是坐标系“扭曲”变换,非均匀地拉伸它。切变的时候角度会发生变化,但面积和体积保持不变。基本的思想是将某一坐标的乘积加到另一个。

例如2D中,将y乘以某个因子然后加到x上,得到x' = x+sy。

2D中的切变

x坐标根据坐标y被切变。参数s控制着切变的方向和量。

y坐标根据坐标x被切变。参数s控制着切变的方向和量。

3D中的切变

Hxy的意思是x,y坐标被坐标z切变。s是对x切变的控制,t是对y切变的控制。这些3D中不同平面的切变矩阵如下:

编码实现:

常用的复合变换顺序

1)在我们直接给出的(θx,θy,θz)这样的旋转角度时,需要定义一个旋转顺序,在Unity中这个旋转顺序时zxy,这就有,当给定(θx,θy,θz)这样的旋转角度时,得到的组合旋转变换矩阵有:

2)缩放、旋转、平移这三个组合矩阵变换是我们常用的变换。大多数情况下,约定变换顺序就是先缩放-再旋转-最后平移。也就是常说的TRS。

由于矩阵的乘法是讲究先后顺序的,如果不按照约定的顺序去变换,那么得到的结果也是不同的。

线性变换的矩阵内容到这里就介绍结束了。

下面补充两种特殊的矩阵,在矩阵的变换和推广中广泛应用。

矩阵的逆

不是所有的矩阵都有逆矩阵,首先矩阵必须满足是一个方阵。

给定一个方阵M,把M和它的逆矩阵相乘,结果是一个单位矩阵。

1).如果一个矩阵有对应的逆矩阵,我们就说这个矩阵是可逆的或者是非奇异的。

2).如果一个矩阵没有对应的逆矩阵,我们就说它是不可逆的或者是奇异的。

3).如果一个方阵的行列式不为0,那么这个矩阵是可逆的或者是非奇异的。

矩阵的逆的求解过程:

用方阵M的标准伴随矩阵去除以它的矩阵的行列式。

例如:

行列式之前专门讲解过,小菜来探讨下标准伴随矩阵。

其中C11/C12……这些代表就是代数余子式矩阵,同样的由行列式求得结果。

对于小菜构造的4 x 4矩阵,其代数余子式矩阵仍然是一个 3 x 3矩阵,可见计算一个普通矩阵的逆的过程,计算量是非常的庞大啊。

一些线性代数的书上,计算矩阵的逆也有“高斯消元法”,具体的可以自行去查阅资料深入研究。

编码:

计算机的除法性能并不好,小菜希望能一次除法然后做矩阵的乘法。

矩阵的逆的重要性质:

矩阵的逆的几何解释:

正交矩阵

如果一个方阵M和它的转置矩阵的乘积是单位矩阵,那么这个矩阵就是正交的。

一个非常重要的性质,如果一个矩阵式正交的,那么它的转置矩阵和逆矩阵式一样的,于是就有:

检测正交矩阵:

将正交矩阵和它的转置矩阵乘法展开有:

将正交矩阵以向量的方式表示:

则有:

可以看出 r1 r2 r3都是单位向量,且r1 r2 r3互相垂直。

如果已知一个矩阵是正交的。那么就有:

一个正交矩阵可能由于浮点数的误差,稍微违反了矩阵的正交性。

这时就需要对矩阵做矫正---施密特正交化

改进后的正交化矫正

最后是所有编码的分享地址:

链接:https://pan.baidu.com/s/1F1z2PByA_dfKBuSQyepZaQ

提取码:k1jv

谢谢朋友的观看和阅读。

本文分享自微信公众号 - 吹弹牛皮之unity程序设计(gh_4f97f8f53f59),作者:赵晋伟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 吹弹牛皮之Unity 引擎基础 - 矩阵(一)

    沉迷于硬笔的练习偷懒了很长时间。过去的7月份仅仅更新了一篇文章,实在是深表遗憾。接着之前的向量篇小菜继续向下探索。谢谢大家长久来的鼓励和支持。

    用户7698595
  • 吹弹牛皮之Unity 引擎基础 - 四元数(二)

    上一篇的四元数内容,简单的介绍了四元数的一些基础运算,继续前篇的内容,继续扩充如下内容:

    用户7698595
  • 吹弹牛皮之Unity 引擎基础 - 矩阵(二)

    在前两篇小菜介绍了矩阵的基础和用于接下来的篇幅内容打基础的矩阵行列式运算。真正的进入矩阵的应用过程小菜就从这篇开始。

    用户7698595
  • 基于协同过滤的SVD的推荐系统

    参考论文:Using Singular Value Decomposition Approximation For Collaborative Filterin...

    张凝可
  • 透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵

    线性代数是用来描述状态和变化的,而矩阵是存储状态和变化的信息的媒介,可以分为状态(静态)和变化(动态)信息来看待。

    周陆军
  • 矩阵相乘法则和技巧

    只有当第一个矩阵(左矩阵)的列数等于第二矩阵(右矩阵)时,两矩阵才能相乘。因为得到的结果矩阵的i一行的第j个元素(Cij)是左矩阵第i行所有元素分别与右矩阵第...

    vv彭
  • 数据分析与数据挖掘 - 06线性代数

    导数是高等数学中非常重要的知识点,也是人工智能的算法应用中比较常用的一个知识,这一章我们的重点就是讲解一下导数和其求导法则。首先我们来看一下导数的基本概念:函数...

    马一特
  • 数学实验(预习)

    也可以用初等变换求逆矩阵,构造一个n行2n列的矩阵(A E),并进行初等变换,A编程单位矩阵的时候,E就变成了A的逆矩阵.

    云深无际
  • 吹弹牛皮之Unity 引擎基础 - 矩阵(一)

    沉迷于硬笔的练习偷懒了很长时间。过去的7月份仅仅更新了一篇文章,实在是深表遗憾。接着之前的向量篇小菜继续向下探索。谢谢大家长久来的鼓励和支持。

    用户7698595
  • 一起来学matlab-matlab学习笔记10 10_1一般运算符

    本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一...

    DrawSky

扫码关注云+社区

领取腾讯云代金券