1向量 verctors
没有绝对的起始结束位置
表示方向和长度
单位向量: 提个长度为1的向量
单位向量 = a向量 / a向量的长度
图形学中用来表示方向
求和这里有两种不同的解释 一个平行四边形法则 一个三角形法则
1平行四边形法则:可以吧a b都放在一个起点上 然后对应的平移 得到平行四边形 链接就是相加结果
2三角形法则: 要相加就把所有的向量首尾相接起来 第一个的开始和最后一个的结束相连就是相加结果
3代数理解
同样描述一个向量a (4,3)
这里用笛卡尔坐标系描述一个向量,将起点永远设为原点,沿X有一些单位向量,y同理 向量的结果可以表示为 nX+pY 通常 x y 互相垂直切单位长度相等。好处是可以直接用数字表示 (4,3) 有4个x3个y
图形学中默认这个向量是个列向量 左下角
也可以变成行向量 A^t 转至向量
这样的好处是算向量长度很简单。代数形式非常有助于计算长度
向量的其他计算:点乘叉乘
点乘
向量的点乘的意义:
点乘最后结果会得到一个数
也就是两个向量点乘后会得到一个数
常见的应用
两边都除以 a 的单位向量和 b的单位向量,得
可以快速得到 两个向量夹角的余弦
当两个都是单位向量时
会更快
点乘的基本属性:
满足交换律 结合律 分配率
在笛卡尔坐标系下 点乘的运算会更加简单 如图
这个道理可以从二维扩展到高维
点乘在图形学中最大的作用就是找到两个向量 方向间的夹角
也可以用于计算两个向量的投影
现在有a b 两个向量 要算b在a上的投影
既然是b在a上的投影 必然是沿着a向量
那么一定等于 a的单位向量乘以一个长度 k
而k = b的长度 * cosθ * a的单位向量
cosθ我们之前已经知道如何计算 所以就可以得到 改投影向量
那么我们有了该投影只有最大的好处就是 可以将改向量分解为两个向量(平行四边形法则) 有了投影向量就可以得到另一个垂直于改向量的向量。
1.点乘可以快速的将一个向量分解为平行与垂直的分解
2.可以算两个向量有多么接近(点乘结果)
3.还可以告诉大家一个关于前与后的信息
有给定方向的向量a 我们可以用a的起点向整个上面方向探过去和下面探过去会形成两个半圆
一部分是上半部分一个是下半部分 如果一个向量和a在同一起点终点落在上半圆 那么我们就说a 和该向量方向基本相同(b向量) 如果在下半部分则基本相反(c向量)
我们如果用 a点乘b 会得到一个 >0的结果
如果用a点乘c 会得到一个 <0 的结果
如果正好在徐线上,会得到一个 == 0 的结果
也就是点乘可以告诉我们 一个方向性 两个的方向是否基本用一致
接近的应用:例如看镜子 有光打在了镜子上如果正好在反射方向看可以看到一个很亮的点 如果不在这个方向上看就看不到
对于金属而言 入射光达到金属 会发射 在镜面反射方向的周围 都属于高光范围 距离范围远就看不到了
叉乘
输入两个向量a b 得到第三个向量,同时垂直于前两个向量
长度为而方向来说需要依靠右手定则 右手四指头微弯曲 方向为 第一个向量 指向 第二个向量 的方向 大拇指的方向就是垂直的结果 而反过来叉乘则得到 一个相反的方向
所以 a x b = - b x a
左侧:
在三维系中给定了x y 轴,相互叉乘可以得到对应的坐标轴
如果在一个坐标系中 x 叉乘 y == z 那么说这是一个右手坐标系(满足右手定则) 如果 x 叉乘 y = - z 则是左手坐标系
一般常用右手坐标系 图形学中
右侧:几个常用的性质
1 不满足交换律
2 自己叉乘自己得到一个0向量
因为长度等于
两向量相同 sinθ == 0 得到 0向量(无论如何叉乘的结果都是一个向量)
3 分配率满足
4 结合律满足(重要 可以减少计算量 加快计算速度)
叉乘用代数形式计算
上半部分 得到一个向量 笛卡尔坐标形式
下半部分 之后会讲到
可以吧向量a写成一个 对应的矩阵 再用这个矩阵去诚意向量b 同样可以得到该结果
叉乘在图形学中的作用
1 判定左和右
2 判定内与外
例子如下
左半部分:
有两个向量 a b 如何判断b是否在a的左侧?
用a 叉乘b 得到的结果的 z值 是正的 说明b在a的左侧
反过来 b叉乘a 得到一个一个向量的z值 为负 说明在右侧
右半部分:
有一个三角形 a b c 判断p是否在三角形的内部
分别看 (ab ap) (bc bp) (ca cp) 是否p点的向量都在左侧 (或者说 结果都在同一侧(左侧或右侧),如果结果不都在同一侧 则说明在外部) 此方法适用于任何的凸多边形
拓展来说,这一点非常重要 这就是之后做三角形光栅化的基本 要判断三角形内有哪些像素 就需要计算给定的像素是否在三角形的内部 然后对内部的进行着色 对于的结果是0的 在图形学中叫做 corner case 边界情况,算在内测还是外侧 自己决定
然后我们可以通过上面的知识来定义一些不同的坐标系等
例如 用叉乘可以定义一些互相垂直的轴,这些轴就会形成 一个坐标系
假如我们定义一个三维坐标系
给到 u v w三个单位向量
且相互点乘 == 0
w = u 叉乘 v
这样得到的结果自然就是一个右手的 三维直角坐标系。
这样的好处是 我们可以把任意的一个向量 p 分解到这三个对应的轴上去
(注意这里 u v w是单位向量 如果不是需要再转换一下)
那么我们就可以将 p 向量从 p u v w 四个向量同在的一个坐标系中 转换为 u v w坐标系中的表示形式
矩阵
1 几乎所有的计算机课都会涉及到矩阵的一些操作 都很困扰
2 图形学中 普遍应用于一些基础变换
移动 旋转 裁切 缩放
矩阵就是一堆安排在n行m列的一个数组 a[m][n]
乘一个数很简单 就讲矩阵中的每个数乘以该数字
矩阵之间的乘积有一个必须的前提要求 就是
A X B ==> A的行数 必须等于 B的列数 否则不能相乘
也就是N必须相等 结果为 a[M][P]
运算方法如下
res[i][j] = A的i行 点乘 b的第j列
A X B = C, C[i][j] = A[row i] 点乘 B[column j]
A的第i行点乘 B的第j列
矩阵乘积的性质
1 不满足交换律(除特殊情况)
2 结合律满足(十分重要,这里设置到多个矩阵相乘时通过结合律可以改变先后相乘顺序 例如 ABCD == A(B(CD))这样可能会大大减少运算量。)
3 分配律满足
矩阵如何乘以一个列向量
矩阵在左边 向量在右边(列向量)
或者是 行向量 向量在左边 矩阵在右边
还是必须满足 [a,M] X [M, b] M必须相等
这是变换的关键 (向量变换)
一个最简单的变换,对二维坐标系上的任何一个向量,按照y轴做一个对称操作 就可以用这样一个
变换矩阵(左边的)就可以将 x 变为 -x
矩阵的转置操作
就是把行和列变换 如上, 由 ab 变为 ba
矩阵的转置有一个性质
两个矩阵的相乘后转置 等于 后一个矩阵转置 乘以 前一个矩阵转置(方向掉了过来)
特殊的矩阵 单位矩阵 是一个对角阵切对角元素都为1
1 任何矩阵乘以单位矩阵都是其本身
2 定义矩阵的逆
如果你能找到另一个矩阵 乘以原矩阵(不论顺序) 结果为一个单位矩阵 则两个矩阵是互逆的
成绩的逆也是 两个翻过来的逆再相乘
向量的点乘叉乘的矩阵写法形式
a向量点乘b向量 == a转置(行向量) 成 列向量 b ==> 结果为一个数
叉乘同样,将 a 向量重新组织为 A* 矩阵 再去乘以b向量