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

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

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

基于以往的学习,通常都是由易到难然后再到放弃的过程,往往是还没有入门就已经提前结束了。本篇打算倒叙来介绍先从最不好理解的起手。

首先来讨论下矩阵的分类。

是不是看上去有些复杂和头大。那么我们就从按照线性变换的分类开始吧。按照上图做归类。接下来小菜将按如下的类型进行深入的探讨。

线性变换

1).旋转

2).缩放

3).正交投影

4).镜像

5).切变

非线性变换

1).平移

2).透视投影

线性变换的内容,小菜会在下一篇的内容中介绍。本篇就倒着先从非线性变换开始介绍吧。

平移矩阵

关于平移,常被我们所应用的就是Transform中的Position调整来设定GameObject位置。它的基础原理便是这平移矩阵在发挥作用。

构造平移矩阵

编码实现:

巧用小菜之前构造的UVector3向量类,将平移的参数传递给平移矩阵。并且提供了一个get方法用于反向获取平移单位量。

透视投影矩阵

"透视"一词,这不得不联想到我们的Camera摄像机组件。没错我们的摄像机区分两种正交和透视。而这里小菜讨论的透视和摄像机的透视略有区别,但原理都是相同的,原因是我们的场景中的Camera要更为复杂。有远近裁切面,有FOV等等。

从原理说起先来看我们初中时候学习过的小孔成像。

注:一般的会令z=-d平面投影,将投影平面移到投影的前面。于是有:

将上述公式变形得:

借助我们的UVector3去表达这一变换的4D形式:

同样的,对于任意的向量我们都有。

这便是我们的透视投影变换矩阵。

编码实现:

对于一个三维向量的变换后,得到的结果任然的需要去对结果的w分量去做除法,也就是下面的过程:

注:有一种特殊的情况除外,就是z=d,这种情况下矩阵转换后得到的结果就是我们的平移结果。而这个做除法的过程同样也被叫做“透视除法”。

扩展讲解:

有没有想过为什么小菜一开始要构造的是4 x 4的矩阵而不是3 x 3的,构造的向量为什么不是[x, y, z]而是[x, y, z, w]呢? 本篇将非线性的矩阵先分析的原因就在这里。

当小菜构造的UVector3的[x, y, z, w]中的w分量为1时(我们暂且认为它表示的是点)首先并不会影响线性变换的结果。

但对于平移而言,却是可以叠加上平移的变换

但如果w分量为0时(我们暂且认为它表示的是向量),由于平移对向量而言并不会改变什么,而切好矩阵的运算结果忽略了平移分量的叠加,这正好符合我们的设计。

同时4 x 4矩阵的出现也正好解决了我们线性变换和非线性结合变换的难题。

谢谢大家的观看和阅读,下篇内容介绍矩阵的线性变换部分。

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

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

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

    用户7698595
  • 吹弹牛皮之Unity Shader光圈遮罩效果

    ,时刻砥砺自己要不断学习进步。接上篇小菜的《吹弹牛皮之Unity Shader放大镜效果》发布之后,小菜一直在想同样的实现原理还能改造下做些什么事情呢?殊途同归...

    用户7698595
  • 超越Alpha Zero!DeepMind升级版MuZero:无需告知规则,观察学习时即可掌握游戏

    DeepMind的使命是证明AI不仅可以精通游戏,甚至可以在不知道规则的情况下做到这一点,最新的MuZero就实现了这一目标。

    新智元
  • 为什么Java程序员的薪资一直居高不下?

    众所周知,随着科技发展,国家政策的支持,IT行业可谓是目前最火、也是众多行业中薪资待遇最好的行业,其相关工作人员的基本薪资也使得许多传统行业望尘莫及。

    java架构师
  • 大数据开发:Java基础数据类型

    在Java基础入门学习阶段,Java基础数据类型无疑是基础当中的重点,掌握基础数据类型,对于后续去理解和掌握更深入的理论,是有紧密的关联性的。今天的大数据开发学...

    成都加米谷大数据
  • 【DL】Self-Attention与Transformer

    答:编码器-解码器(Encoder-Decoder)模型最初是由Cho等提出应用在机器翻译中。由于在机器翻译中是文本到文本的转换,比如将法语翻译成英语,Suts...

    yuquanle
  • Java 多线程

    黑白格
  • PHP丨PHP基础知识之数据类型

    布尔值(值为false)、整型值(值为0零)、浮点型值(值为0.0)、字符串(空字符串和字符串“0”)、数组(没有诚意的数组)、特殊类型NULL

    大脸猫
  • LeetCode 27. Remove Element题目分析代码

    给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。 元素的顺序可以改变,并且对新的数组不会有影响。

    desperate633

扫码关注云+社区

领取腾讯云代金券