type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
向量(Vector)

- 向量通常表示方向,这里从A指向B。
- 经常用于表示方向和长度
- 没有绝对的起始点,更多指的相对位置
- 单位向量通过原始的向量除以向量的长度求得
向量求和

也可以用笛卡尔坐标来计算向量求和

此时点A也可以表示成
向量乘法
点乘


点乘最后得到的结果是一个数,在图形学通常用于计算向量之间的夹角,如果两个向量都是单位向量的时候计算夹角会更方便。

向量的点乘遵循交换律和分配律

在笛卡尔坐标下的点乘会更加简单
点乘最大的作用用于寻找两个向量间的夹角,比如光照模型中的入射光线和观看角度和法线之间的角度计算。


另外的作用在于一个向量投影到另一个向量是怎样的

还可以计算两个向量之间的方向是否相同,得到的值也能说明向量的方向有多接近
叉乘

向量的叉积可以得到一个新的向量,新的向量垂直于原本的两个向量。新的向量的方向采用右手定则得出。

叉乘满足分配律

叉乘的代数

叉乘在几何上通常用于判定左右和内外。
比如这里的b向量在a的左侧在数学上可以通过叉乘知道。用a叉乘b得到的z是正的说明b在a的左侧,否则在a的右侧。
还有一个常用的应用是判断p是否在三角形ABC内部。依次计算AB叉乘AP,BC叉乘BP,CA叉乘CP得到p点位于哪一侧,如果都位于同一侧那么说明p在三角形ABC的内部。三角形的光栅化会用到这个算法。

通过叉乘也可以用于定义坐标系,这种定义可以将向量通过投影分解到任意定义的向量上。
矩阵(Matrices)

矩阵的乘法
矩阵的乘法不适用交换律,但是可以使用结合律和分配律通过矩阵的乘法可以做到平移、缩放、旋转、对称等效果

矩阵的转置

单位矩阵(只有对角线上值为1,其他为0)

向量点乘叉乘的矩阵形式
线性变换
缩放变换

一个物体要进行等比例的缩放的矩阵,其中s是要缩放的大小。

如果做的事不等比例的缩放,矩阵应该是这样的
对称矩阵

物体相对于y轴对称的矩阵
切变矩阵(Shear Matrix)

有点像是拽着物体上面的边往一个方向拉扯,拉扯的距离为a,通过他们的坐标关系也可以得到这种变换的矩阵。
旋转矩阵
这是非常重要和常见的矩阵

平移矩阵
要完成平移的变换首先要理解齐次坐标。像上面的矩阵乘法是无法完成平移的操作,如果要完成平移操作只能通过相加。但是不想要这个操作变得这么特殊,为了让它可以通过乘法完成变换,于是引入了齐次坐标。
齐次坐标相当于引入了一个维度,来标明这个向量表示的是一个点还是向量。如果这个是二维空间中的一个点,那么会这么表示
如果是一个向量,将会这样表示
所以平移矩阵会变成这样
而向量的齐次坐标为0,经过平移变换其实不会发生变化。这也很符合向量的相对性。

线性变换通过加一个矩阵得到新的矩阵一般称为仿射变换,所有的仿射变换都可以通过添加齐次坐标来变成矩阵乘法得到
逆变换

如果想要撤销所作的操作,可以通过矩阵的逆实现。
组合变换



对于复杂的变换,可以通过一系列复合的变换组合得到。组合的顺序不一样得到的结果也不一样。上面先做平移再做旋转和先做旋转再做平移是不一样的,矩阵的乘法是不符合交换律的。

矩阵的乘法是从右到左的,更像是将这个矩阵映射到向量上。

根据矩阵符合结合律可以先将所有的矩阵相乘得出的矩阵再映射到物体上
三维变换
三维的变换矩阵也就是再二维的变换矩阵上加一个维度。
三维的点
三维的向量
三维的变换会变成这样,对于这样的变换矩阵都是先进行线性变换再进行平移变换。
三维的缩放
三维的平移
三维的旋转相对复杂一些
绕x轴旋转
绕y轴旋转
绕z轴旋转
可以通过罗德里格斯旋转公式将复杂的旋转分解成xyz的旋转
n是旋转轴,α是旋转角度。n是一个起始点在原点的向量。如果想要绕任意轴就需要做一个平移操作再旋转再平移回去。
还有一个非常常用于旋转的是四元数。
一个四元数通常表示为:
w是实部,xyz是虚部系数,ijk是虚数单位,满足:
一个单位四元数表示旋转操作的具体形式是这样的:
θ是旋转角度,(x,y,z)是旋转轴的单位向量
使用四元数旋转一个向量v的方式是
v也会被转换成四元数,是q的共轭除以模的平方
Viewing Transform
这一变换可以将三维空间中的物体变换成一张图片,比如展示在显示器屏幕上。
可以思考一下怎么拍一张照片。
首先要找一个地方将所有人集合起来,在图形学上叫做模型变换(Model Transform)
然后要找一个好的角度和好的位置将相机放好,让相机往某个角度拍摄,这也叫做视图变换(View Transform)
最后就是按下快门,这里会做一个投影变换(Projection Transform)。
上面三步也是非常著名的MVP变换
View Transform
这一变换是摆放相机,需要定义相机的位置e、方向g和向上方向t。
在观察和拍照片上,如果保证相机和物体的相对位置一定,那么最后得出的结果应该是一致的。如果保持相对位置一定,那这里先假设相机位置为原点,方向为-z轴,上方向为y轴。
如果要这么做的话需要做几个步骤
- 将位置e位移到原点
- 绕y轴旋转使得方向g为-z
- 绕z轴旋转使得上方向t为y
然后将这几个步骤写成一个矩阵
首先是平移矩阵
后者的旋转矩阵并不好写,并不知道相机的旋转位置是怎么样的。但是这里可以反过来写。先将标准化的x轴旋转到的角度上,再旋转另外两个轴,于是可以写出矩阵的逆:
因为旋转矩阵也是正交矩阵,因此它的逆也是它的转置
Projection Transform
投影变换分为两种一种是正交投影,一种是透视投影。人眼的成像更类似与透视投影,正交投影更常用于工程视图,不会给人近大远小的现象。

透视投影认为摄像机在某个位置上是一个点,从空间中的物体到成像的屏幕上到这个点形成一个锥。而正交投影则是假设相机离我们的位置是无限远的,那么远近的平面大小是一样的。
正交投影
要做正交投影需要3步
- 先将相机放到原点上,向-z看,向上方向是y
- 丢弃z坐标
- 再将物体缩放到的成像屏幕上

更加正规的做法是先将空间中的物体映射到上再做成像。
这一平移缩放的矩阵可以这么写出来
透视投影

透视投影需要将远平面的物体投影到近的成像屏幕上。也可以将透视投影拆分成两步,先将远平面做一个缩放,使得大小和近平面相同,再做一次正交投影得到。
这个挤压的过程z值不会发生变化,并且远平面的中心也不发生变化。

从侧面看经过挤压之后可以找到y的对应关系,是一个相似三角形。
对于x也是一样的,所以可以得到一下关系
目前并不知道z,但可以先试着将矩阵写出来
根据齐次坐标可以将z消除
那么矩阵应该是
现在需要推出第三行是怎样的,首先知道两个信息,在近的平面上z为n,经过运算这些点的值是不变的。远处平面的缩放运算z也是不会变的。
先将z的值认为是n,并做齐次坐标的运算。
那么可以设矩阵的第三行为
由此得到
同时远平面也满足这个性质
由此解出
于是矩阵为
接下来再做正交投影就能得到正确的结果。
- Author:lltouchingfish
- URL:https://tangly1024.com/article/1f1be847-332a-808d-9c28-e31927d0022a
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!