A Swift and Brutal Introduction to Linear Algebra
计算机图形学依赖于线性代数、微积分、统计...物理方面涉及到光学(波动光学:不再假设光是直线传播,作为一种光波与物体表面材质进行作用接触,如何生成不同的外观)和力学,还涉及到信号处理(分析走样、反走样技术,解决信号处理的事情),数值分析也很重要(解决一些复杂的数学计算:积分、渲染,解决递归定义的积分、模拟仿真、拓展方程...),还需要一点点美学
一个例子
旋转的小蜗,壳上的亮晶晶随着旋转来回摆动,不是匀速旋转,到中间速度达到峰值,不是以固定速度旋转,用到了旋转矩阵的知识
向量
基础认识
名称上有区别,在数学中他叫向量,物理学(照亮世界)的诨名叫矢量,表示方向(B坐标 - A坐标),平移向量不发生变化,还是最初的美好
向量的两个重要属性:方向 + 长度
回忆单位向量,在图形学里用单位向量可直接表示方向(a头顶一个hat,在图形学中用于表示单位向量)
操作
相加
涉及平行四边形法则、三角形法则
表示
笛卡尔坐标系表示向量
X、Y通常垂直且定义成单位向量,好处:可用(4,3)表示向量
向量的缺省设置是列向量(矩阵左乘方便)
为什么这样设置捏?
如果这样定义,两坐标轴垂直,以单位向量为单位,算向量长度就很简单啦
Dot product
在图形学中的应用: 做简单变换,给定两个向量可算出夹角余弦,可帮助我们快速得到两个向量的夹角,在两个向量都是单位向量的时候尤为方便
点乘满足这些定律:
相乘后相加,定律可扩展到高维(2D -- > 3D)
点乘在图形学中的应用:找到两个方向的夹角(光照模型的光照进来的方向,物体表面法线,从哪个方向看)
找到向量的投影长什么样:
现在a、b两个向量方向不一样,希望将b向量投影到a向量上去,假如有一束光线垂直于a向量的方向照射过来,则b向量会在a向量上投射出一片阴影(b在a上的投影),那我们具体应该怎样计算呢?需要用到向量的基本属性:长度和方向,既然b向量投影到a向量上了,那投影一定是沿着a方向的,b perpu(perpendicular)的方向确定,可以用它表示成a向量的单位向量x长度,最终长度为b向量的长度x b向量与a向量夹角的余弦,夹角的余弦用点积求:
算出投影有什么好处呢?
我们可以把一个向量分解成两个向量,一个方向平行于某个方向,另一个方向垂直于某个方向
叉乘,根据平行四边形法则可推导出上面的结果,点乘带来的好处是可以对任意一个向量进行垂直与平行的分解,在图形学中,点乘还可以带来另外的好处:可以计算两个向量的方向有多接近,接近:算两个向量点乘的结果,根据点乘的结果知道两个方向是接近还是远离
点乘还可帮助大家获取前与后的信息
给定向量a的方向,从a的方向上下割据形成两个半圆,如果向量的终点是落在虚线以上的,那可以认为a和b向量都是向前的,c向量的终点落在了下半部分,可以认定a向量和c向量方向基本上是相反的,点乘的好处这就体现出来了:a和b点乘会获得一个正数,a和c点乘会获得一个负数,假如还有一个向量刚好落在虚线上,那最终结果是0
向量的点乘可以告知我们方向性:基本一致,相反,垂直
同样的,点乘还可以告诉我们两个向量有多接近,如果比较接近,点乘出来的结果就会比较接近1,远离后渐渐变成0,再远一点会渐渐变成-1,直到完全变成-1,可以告诉我们值有多接近
那点乘看两个向量是否接近又有什么应用呢?
比如一束光打在一面镜子上,肯定是会反射的,如果眼睛从出射光方向看过去,就会发现一个反光点很亮,如果错开一点点就看不到闪烁的光亮(比如金属的发光,入射光打到金属表面,会反射,在周围观测会得到这样的结果,离远则看不到,需要方法提供两个向量是否接近标准)
Cross product
向量的叉积虽然也是乘法,但是和点积完全不一样的运算
叉积会输入两个向量a和b,会计算出另外一个向量,两向量叉积的结果和原本的两个向量都垂直,即该向量垂直于ab所在的平面内,那方向怎么确定捏?需要根据右手定则来弄了!
什么是右手定则(你不是学过吗)
其实有两种右手定则,一种是伸出三根手指(拇指食指中指),摆成互相垂直的方向
但更为常见的是右手螺旋定则,算叉积从a旋转到b方向,拇指指向的方向就是叉积结果向量的方向,我们可以发现从b到a方向是相反的(叉积并不满足交换律),那向量的叉积有什么作用呢?
我们可以用向量的叉积建立三维空间中的直角坐标系
可以通过x轴叉乘y轴的方式算出z轴,如果x轴和y轴叉乘得到z轴建立三维空间直角坐标系,那这个坐标系就被称为右手坐标系
自己叉乘自己得到零向量
向量叉乘在代数上也可写出,但是相对复杂,a向量叉乘b向量得到的是一个列向量,在笛卡尔坐标系中,向量的叉乘也可以重新写出来,向量的叉乘可以表示成对应的矩阵形式,矩阵相乘一样可得出以上结果
向量的叉积(叉乘)的重要应用:判定左右、判定内外
为什么给定两个向量的叉积就能判定左和右的信息呢?
那怎么判断左右呢?左面这幅图的右手系xyz都有,判定b在a的左侧还是右侧,从直观上看图我们可以判断b向量在a向量的左侧,在数字上如何表示呢?也很简单,就是a叉乘b得到的结果是正的,就可以判定b在a的左侧,反过来则在右侧
判断左右是一方面,叉积还可判断内外,已知有三角形ABC,想要判断P点是否在三角形内部,就需要应用到叉积了,我们可以这样做叉积:AB和AP做叉积,BP和BC做叉积,CP和CA做叉积,得到的结果都是正的,也就是说P点在AB、BC、CA的左边(如果顺时针排布也没关系,如此就是P都在三条边的右边),如果擦边就自己说了算
Orthonormal bases and coordinate frames
定义u、v、w都是单位向量,点乘等于零互相垂直,叉乘后得到三维右手直角坐标系,这样定义有什么好处呢?好处就是我们可以把任意向量分解到这三个坐标轴上去,投影做需要点积
Matrices
计算机图形学很多地方都会涉及到矩阵
矩阵在变换上应用较多,应用矩阵可做基础变换:移动、旋转、缩放...
矩阵是什么捏?
很简单,矩阵是一堆数安排在平面上变成几行几列的结构,上面矩阵三行两列(3×2)
矩阵×数即把矩阵中每个数都×这个数
最困难且有用的操作是矩阵的乘积
给定两个矩阵也要它们能乘才可以 (第一个矩阵的列数=第二个矩阵的行数)
矩阵相乘不满足交换律:
结合律很有用
矩阵和向量相乘(列向量)
通过算变换,将x和y变成-x和y,可用于求镜像
矩阵转置
行列互换,没什么好说的 (乘积转置顺序要做调换)
单位矩阵
单位矩阵基本上不用来做任何操作,但可以用来计算矩阵的逆,两个矩阵相乘得到单位阵,则这两个矩阵互逆
向量的点乘和叉乘都可以写成矩阵形式,叉乘则是A*和b相乘(后续旋转的 推导方面很有用)
场景实例:相机(视角)在场景中移动,可以向各个方向看,涉及到旋转,如何定义相机的运动和变换
哼哼,,,