目录
一、矢量
1.什么是矢量
矢量是一种既有大小又有方向的量,又称向量。
2.矢量的运算
2.1.矢量的加减
矢量的加减法遵循三角形定则
矢量的加法:a+b=(ax+bx,ay+by,az+bz)
矢量的减法:a-b=(ax-bx,ay-by,az-bz)
2.2.矢量和标量的乘除
即是矢量的每一个分量乘或者除以标量,可以乘除负数,则方向相反
矢量和标量的乘法:ab=(bax,bay,baz)
矢量和标量的除法:a/b=(ax/b,ay/b,az/b)
2.3.矢量的模、单位矢量和归一化
2.3.1.矢量的模:
矢量的模是一个标量,是矢量在空间的长度
二维矢量的模:a²+b²=c²
三维矢量的模:
2.3.2.矢量的单位矢量:
单位矢量就是归一化后模为1的矢量
二维空间:半径为1的单位圆,单位矢量从圆心出发,到圆边界的矢量
三维空间:单位矢量就是从一个半径为1的球心出发、到达球面的矢量
2.3.3.矢量的归一化(normalization):
把非零矢量转换为单位矢量的过程就是归一化(矢量)
矢量除以矢量的模
2.3.4.为什么要归一化?
归一化其实就是数据缩放,一种线性变换。为了数据处理方便,也能加快程序的运行。 在计算光照模型的时候我们往往关心的只是矢量的方向而不是模。
2.4.矢量和矢量的乘法
2.4.1.点积(Dot product)
又称内积,结果是一个标量,可能是负数也可能是零,经常用于计算光照模型,即对应分量相乘再求和。点积的几何意义很重要,其中一个几何意义就是投影
a.b=axbx+ayby+azbz
当两个矢量方向相同(即夹角<90°)时,点积大于0。
当两个矢量方向垂直(即夹角=90°)时,点积等于0。
当两个矢量方向相反(即夹角》90°)时,点积小于0。
两个矢量的点积也可以用模相乘乘以夹角的余弦,即:a.b=|a||b|cos夹角。
2.4.2.叉积(Cross product)
又称外积,结果会得到同时垂直于两个矢量的新矢量。常用于计算一个面的法线,也可以用来判断面是正面还是反面。
V1*V2=((y1*z2 – z1*y2, z1*x2 – x1*z2, x1*y2 – y1*x2))
注意:叉积不满足交换律和结合律,但满足反交换律,即a*b=-(b*a)。
2.4.3.叉积的模
叉积的长度等于两个矢量模相乘再乘以夹角的正弦值,即|a*b|=|a||b|sin夹角
注意:叉积不管是用左手坐标系还是右手坐标系,对于计算结果是不会产生影响的,只会影响在三维空间的视觉表现(比如当右手坐标系转换为左手坐标系时,计算结果不变,但是在渲染到屏幕上时,图像可能相反)
二、矩阵(Matrix)
1.什么是矩阵
一个矩阵可以把一个矢量从一个坐标空间转换到另一个坐标空间,从外观上就是一个长方形的网格,每个格子都放有一个数字。它是由m*n个标量组成的长方形数组。
只有一行的成为行矩阵,只有一列的成为列矩阵。
2.矩阵的运算
2.1.矩阵和矩阵的加减
前提:两个矩阵的行数和列数必须相同
对应位相加减
2.2.矩阵和标量的乘法
矩阵每一位都乘以标量
2.3.矩阵和矩阵的乘法
前提:矩阵和矩阵相乘时,只有满足第一个矩阵的列数和第二个矩阵的行数相等的条件时,才可以相乘。即r×n矩阵,才能和n×c矩阵相乘,得到的结果是一个r×c矩阵
相乘得到的结果矩阵的行数是第一个矩阵的行数,而列数是第二个矩阵的列数
注意:矩阵乘法一般不满足交换律,但一些特殊情况会存在,但满足结合律
3.特殊矩阵
3.1.方块矩阵
简称方阵,即行数和列数都相等的矩阵。
3.2.对角元素
方阵的对角元素指的是行号和列号相等的元素,比如M11、M22、M33
3.3.对角矩阵
如果一个方阵除对角元素外所有元素都为0,则这个矩阵叫做对角矩阵
3.4.单位矩阵
一个特殊的对角矩阵是单位矩阵,其对角元素都为1,且任何矩阵和它相乘结果都是原来的矩阵
即MI=IM=M
3.5.转置矩阵
实际上是对原矩阵的一种运算,即转置运算。即将同号数的行转换为同号数的列
转置矩阵的一些性质:
3.6.逆矩阵
前提:该矩阵必须是一个方阵,但不是所有方阵都有逆矩阵(比如所有元素都为0的方阵)
最重要的性质:矩阵和矩阵的逆矩阵相乘为一个单位矩阵
如果一个矩阵有对应的逆矩阵,则说这个矩阵是可逆的,或者说是非奇异的。反之就是不可逆的,或者说是奇异的
3.7.正交矩阵
正交矩阵是一种特殊的方阵,如果一个方阵和它的转置矩阵的乘积是一个单位矩阵,则称这个矩阵是正交的。
即如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的。
4.矩阵的几何意义:变换
4.1.什么是变换
变换,指的是我们把一些数据(如点、方向矢量甚至是颜色等)通过某种方式进行转换的过程
4.2.变换类型
4.2.1.线性变换
线性变换指的是那些可以保留矢量和标量的变换(即可以保留矢量加和标量乘的变换),如缩放、旋转、错切、镜像、正交投影
对于所以的线性变换都可以用3x3的矩阵来表示
4.2.2.仿射变换
仿射变换就是合并线性变换和平移变换的变换类型,因为平移变换不包含于线性变换中,仿射变换就诞生了。
仿射变换可以用一个4x4矩阵来表示
为此,我们需要把矢量扩展到四维空间下,也就是齐次坐标空间下
齐次坐标
3x3矩阵不能表示平移操作,就必须扩展到4x4矩阵,那么就必须三维矢量转换到四维矢量。
对于点,三维坐标转换为齐次坐标系,w分量设为1
对于方向矢量,其w分量设为0
4.3分解基础变换矩阵
我们可以使用一个4x4的矩阵来表示平移、旋转和缩放,我们把表示纯平移、纯旋转和纯缩放的变换矩阵叫做基础变换矩阵。
我们可以将这个基础变换矩阵分解成4个组成部分:
其中, 左上角的矩阵M 3 x 3 用于表示旋转和缩放, t 3x1 用于表示平移,0 1x3 是零矩阵, 即0 1 x 3 =[0, 0, 0],右下角的元素就是标量 1。
4.4平移矩阵
我们可以用矩阵乘法来表示对一个点进行平移变换
而向量没有位置属性,平移向量不应该对向量产生影响
平移矩阵的逆矩阵就是反向平移得到的矩阵,即
4.5缩放矩阵
我们可以对一个模型沿空间的x轴,y轴和z轴进行缩放,同样我们可以使用矩阵乘法来表示一个缩放变换。
对方向矢量可以使用同样的矩阵进行缩放,即
如果kx=ky=kz,则这样的缩放称为统一缩放,否则称为非统一缩放
缩放矩阵一般不是正交矩阵
4.6旋转矩阵
绕x轴旋转:
绕y轴旋转
绕z轴旋转
旋转矩阵的逆矩阵是旋转相反角度得到的变换矩阵,旋转矩阵是正交矩阵,而且多个旋转矩阵间的串联同样正交
4.7复合变换
我们可以把平移、旋转和缩放组合起来,形成一个复杂的变换过程。复合变换可以通过矩阵的串联来实现,且变换的结果是依赖于变换顺序的,又因为矩阵乘法不满足交换律,因此变换顺序很重要。
注意:大多数情况下,先进行缩放,再旋转,然后才是平移