Unity Shader学习日记 part 3 线性代数--矩阵变换

之前我们学到了矩阵的相关基础,了解矩阵使用了进行变幻的。可是在三维空间中我们不管是表示点还是向量,都是通过x,y,z来表示的。那我们如何在三维向量中,表示出来变换的呢?

齐次坐标

齐次坐标:将原本的n维向量用n+1维来表示。

原因:1.不论是点还是向量,都是三维坐标,无法区分,我们给他在加上1维做区分。(x,y,z,w)w为0,向量,为1,点

2.三维向量无法表示平移变换,只能进行旋转,缩放的线性变换。

既然提到了变换,那就来看看这些变换矩阵是什么样的。、

在此之前,我们先来看看基础变换矩阵的构成

基础变换矩阵

在4*4的矩阵中,分成了四个部分,右边的[t1,t2,t3]是用于平移变换,而m区域的3*3矩阵则是用于旋转和缩放变换,其他的两个部分,0和1都是写死的。不论是何种变换,都是在基础变换矩阵转换来的,接下来我们在看看他们。

平移矩阵

如图就是平移矩阵了,将m区域的3*3矩阵变为单位矩阵,就可以得到平移矩阵,通过修改右侧的tx,ty,tz来完成变换。

平移矩阵的计算

了解了平移矩阵,来看看怎么使用

如图,就是将点 x,y,z进行了平移变换后的位置

这个则是向量通过平移矩阵之后的样子,现在我们可以看到,为什么需要使用4*4的矩阵来进行变换,以及为什么需要给列向量加1维。

那为什么向量变换之后,还是原本的样子呢?

这是因为,向量表示的是大小与方向,而不是位置,不论如何变换,向量的大小与方向是不变的。

平移矩阵是否是正交矩阵

为什么需要在意是不是正交矩阵呢?这里的正交矩阵,我们主要是想要快速的得到它的逆矩阵,这一点我们之前提过为什么。

而得到逆矩阵之后,我们可以通过逆矩阵进行反向变换。

那么如何判断是否是正交矩阵,之前也提过,我们再来看看

显然,平移矩阵不是正交矩阵,不过虽然他不是正交矩阵,我们也可以通过计算得到,结果也简单,记一下就好

旋转矩阵

旋转矩阵比较复杂,如何推导就不说了,记住就行

旋转矩阵是否是正交矩阵

结论:旋转矩阵是正交矩阵,意味着旋转矩阵得转置矩阵就是它得逆矩阵。

缩放矩阵

缩放矩阵就是对点或者向量进行某一个方向上得放大缩小。他的构成也非常简单

需要注意得是:缩放对于点或者向量都是有意义的。

缩放矩阵是否是正交矩阵

通常来说,缩放矩阵不会是正交矩阵,因为kx,ky,kz需要为1的时候才能使正交矩阵,所以通常来说,不是。

不过,他的逆矩阵也非常简单

复合运算

由于矩阵的乘法是不满足交换律,所以变换的顺序很重要。

举个列子,先往前一步,再向左左转。和先向左转,再往前一步的结果是不一样的。

Unity 的规则

在进行符合运算是,遵循先缩放,再旋转,最后平移。

如果是旋转,先z轴,再x轴,最后y轴。

以上就是基本的变换矩阵相关的基础了

相关推荐
flashier2 小时前
C语言 进阶指针学习笔记
c语言·笔记·学习
大白的编程日记.3 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
螺旋式上升abc3 小时前
GO语言学习笔记
笔记·学习·golang
W起名有点难3 小时前
前端学习——CSS
前端·css·学习
Moonnnn.4 小时前
51单片机——汇编工程建立、仿真、调试全过程
汇编·笔记·嵌入式硬件·学习·51单片机
EnigmaCoder4 小时前
蓝桥杯刷题周计划(第二周)
学习·算法·蓝桥杯
银河小铁骑plus5 小时前
Go学习笔记:基础语法6
笔记·学习·golang
汤姆和杰瑞在瑞士吃糯米粑粑6 小时前
【Linux学习篇】--开发工具第一期
linux·运维·学习
sealaugh327 小时前
aws(学习笔记第三十二课) 深入使用cdk(API Gateway + event bridge)
笔记·学习·aws
江小年7 小时前
Gin学习笔记
笔记·学习·gin