第二节 向量与线性代数入门

2021-01-07  本文已影响0人  Charon_ted

1向量 verctors


image.png

没有绝对的起始结束位置
表示方向和长度

image.png

单位向量: 提个长度为1的向量
单位向量 = a向量 / a向量的长度
图形学中用来表示方向

向量常见的基本操作

求和这里有两种不同的解释 一个平行四边形法则 一个三角形法则

1平行四边形法则:可以吧a b都放在一个起点上 然后对应的平移 得到平行四边形 链接就是相加结果

2三角形法则: 要相加就把所有的向量首尾相接起来 第一个的开始和最后一个的结束相连就是相加结果

image.png

3代数理解
同样描述一个向量a (4,3)
这里用笛卡尔坐标系描述一个向量,将起点永远设为原点,沿X有一些单位向量,y同理 向量的结果可以表示为 nX+pY 通常 x y 互相垂直切单位长度相等。好处是可以直接用数字表示 (4,3) 有4个x3个y
图形学中默认这个向量是个列向量 左下角
也可以变成行向量 A^t 转至向量
这样的好处是算向量长度很简单。代数形式非常有助于计算长度

image.png

向量的其他计算:点乘叉乘

点乘

image.png

向量的点乘的意义:


image.png

点乘最后结果会得到一个数
也就是两个向量点乘后会得到一个数

常见的应用
两边都除以 a 的单位向量和 b的单位向量,得


image.png

可以快速得到 两个向量夹角的余弦

当两个都是单位向量时



会更快

image.png

点乘的基本属性:

满足交换律 结合律 分配率

image.png

在笛卡尔坐标系下 点乘的运算会更加简单 如图
这个道理可以从二维扩展到高维


image.png

点乘在图形学中最大的作用就是找到两个向量 方向间的夹角

image.png

也可以用于计算两个向量的投影

现在有a b 两个向量 要算b在a上的投影
既然是b在a上的投影 必然是沿着a向量
那么一定等于 a的单位向量乘以一个长度 k
而k = b的长度 * cosθ * a的单位向量
cosθ我们之前已经知道如何计算 所以就可以得到 改投影向量

image.png

那么我们有了该投影只有最大的好处就是 可以将改向量分解为两个向量(平行四边形法则) 有了投影向量就可以得到另一个垂直于改向量的向量。

1.点乘可以快速的将一个向量分解为平行与垂直的分解
2.可以算两个向量有多么接近(点乘结果)
3.还可以告诉大家一个关于前与后的信息

image.png

有给定方向的向量a 我们可以用a的起点向整个上面方向探过去和下面探过去会形成两个半圆
一部分是上半部分一个是下半部分 如果一个向量和a在同一起点终点落在上半圆 那么我们就说a 和该向量方向基本相同(b向量) 如果在下半部分则基本相反(c向量)

我们如果用 a点乘b 会得到一个 >0的结果
如果用a点乘c 会得到一个 <0 的结果
如果正好在徐线上,会得到一个 == 0 的结果
也就是点乘可以告诉我们 一个方向性 两个的方向是否基本用一致

cos函数图像

接近的应用:例如看镜子 有光打在了镜子上如果正好在反射方向看可以看到一个很亮的点 如果不在这个方向上看就看不到
对于金属而言 入射光达到金属 会发射 在镜面反射方向的周围 都属于高光范围 距离范围远就看不到了

叉乘

image.png image.png

输入两个向量a b 得到第三个向量,同时垂直于前两个向量

长度为 image.png

而方向来说需要依靠右手定则 右手四指头微弯曲 方向为 第一个向量 指向 第二个向量 的方向 大拇指的方向就是垂直的结果 而反过来叉乘则得到 一个相反的方向

所以 a x b = - b x a

如果 x轴叉乘y轴得到的是z轴正方向,则说明是右手坐标系

左侧:
在三维系中给定了x y 轴,相互叉乘可以得到对应的坐标轴
如果在一个坐标系中 x 叉乘 y == z 那么说这是一个右手坐标系(满足右手定则) 如果 x 叉乘 y = - z 则是左手坐标系
一般常用右手坐标系 图形学中
右侧:几个常用的性质

1 不满足交换律
2 自己叉乘自己得到一个0向量
因为长度等于


image.png

两向量相同 sinθ == 0 得到 0向量(无论如何叉乘的结果都是一个向量)

3 分配率满足
4 结合律满足(重要 可以减少计算量 加快计算速度)

image.png

叉乘用代数形式计算

上半部分 得到一个向量 笛卡尔坐标形式

下半部分 之后会讲到

可以吧向量a写成一个 对应的矩阵 再用这个矩阵去诚意向量b 同样可以得到该结果

image.png

叉乘在图形学中的作用
1 判定左和右
2 判定内与外

例子如下

image.png

左半部分:
有两个向量 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 边界情况,算在内测还是外侧 自己决定

然后我们可以通过上面的知识来定义一些不同的坐标系等


image.png

例如 用叉乘可以定义一些互相垂直的轴,这些轴就会形成 一个坐标系

image.png

假如我们定义一个三维坐标系

给到 u v w三个单位向量
且相互点乘 == 0
w = u 叉乘 v
这样得到的结果自然就是一个右手的 三维直角坐标系。
这样的好处是 我们可以把任意的一个向量 p 分解到这三个对应的轴上去


image.png

(注意这里 u v w是单位向量 如果不是需要再转换一下)

那么我们就可以将 p 向量从 p u v w 四个向量同在的一个坐标系中 转换为 u v w坐标系中的表示形式

矩阵

image.png

1 几乎所有的计算机课都会涉及到矩阵的一些操作 都很困扰
2 图形学中 普遍应用于一些基础变换
移动 旋转 裁切 缩放

image.png

矩阵就是一堆安排在n行m列的一个数组 a[m][n]

乘一个数很简单 就讲矩阵中的每个数乘以该数字

image.png

矩阵之间的乘积有一个必须的前提要求 就是

A X B ==> A的行数 必须等于 B的列数 否则不能相乘


image.png

也就是N必须相等 结果为 a[M][P]

image.png

运算方法如下
res[i][j] = A的i行 点乘 b的第j列

A X B = C, C[i][j] = A[row i] 点乘 B[column j]
A的第i行点乘 B的第j列

image.png

矩阵乘积的性质

1 不满足交换律(除特殊情况)
2 结合律满足(十分重要,这里设置到多个矩阵相乘时通过结合律可以改变先后相乘顺序 例如 ABCD == A(B(CD))这样可能会大大减少运算量。)
3 分配律满足

image.png

矩阵如何乘以一个列向量
矩阵在左边 向量在右边(列向量)
或者是 行向量 向量在左边 矩阵在右边
还是必须满足 [a,M] X [M, b] M必须相等

这是变换的关键 (向量变换)


image.png

一个最简单的变换,对二维坐标系上的任何一个向量,按照y轴做一个对称操作 就可以用这样一个
变换矩阵(左边的)就可以将 x 变为 -x


image.png

矩阵的转置操作

就是把行和列变换 如上, 由 ab 变为 ba
矩阵的转置有一个性质
两个矩阵的相乘后转置 等于 后一个矩阵转置 乘以 前一个矩阵转置(方向掉了过来)

image.png

特殊的矩阵 单位矩阵 是一个对角阵切对角元素都为1

1 任何矩阵乘以单位矩阵都是其本身
2 定义矩阵的逆
如果你能找到另一个矩阵 乘以原矩阵(不论顺序) 结果为一个单位矩阵 则两个矩阵是互逆的

image.png

成绩的逆也是 两个翻过来的逆再相乘

image.png

向量的点乘叉乘的矩阵写法形式
a向量点乘b向量 == a转置(行向量) 成 列向量 b ==> 结果为一个数

叉乘同样,将 a 向量重新组织为 A* 矩阵 再去乘以b向量

上一篇下一篇

猜你喜欢

热点阅读