3D数学基础 简要归纳
- 计算机图形学第一准则:看上去是对的就是对的,简单记为
近似原则
- OpenGL是基于3D的,屏幕是2D的
- OpenGL中使用的是列向量
左手系&右手系
- OpenGL更多的是基于左手系
- 线性代数更多是基于右手系
- 3D图形学中常用坐标系
- 世界坐标系:系统的绝对坐标系
- 物体坐标系:物体产生关联
- 摄像机坐标系/照相机坐标系
- 惯性坐标系:物体坐标系转换为世界坐标系的 “半途”,目的是为了减少复杂度,是一个过渡
- eg:以下情景基于什么坐标系?
- 书在我的
西边
还是北边
?==> 东南西北 -- 世界坐标系 - 计算机在我的
前面
还是后面
?==> 上下左右 -- 物体坐标系 - 从一个房间移动到另一个房间 ==> 寻路型 -- 世界坐标系
- 你能
看见
我的计算机吗? ==> 摄像机坐标系
- 书在我的
向量
存储 -- 数组
-
图形学中:最多到4维
- 2D:x、y
- 3D:x、y、z
- 4D:x、y、z、w
零向量:没有方向,没有长度 即 模 = 0
-
负向量 = (-1).向量, 将向量中的每个数都乘以 -1
- 几何意义:得到一个与原向量
大小相等,方向相反
的向量
- 几何意义:得到一个与原向量
-
向量大小计算 即 模的计算 = 向量中所有数的平方和,再求根号
-
2D向量几何意义:直角三角形最长边的边长
-
-
标量与向量的运算
总结- 标量不能与向量进行加减运算
- 标量与向量可以相乘,且满足交换律,不需要写乘号
- 向量可以除以标量,即相当于向量乘以一个标量的倒数 即
v(向量)/k = v 乘以 1/k
- 标量与向量的乘除 优先级高于 加减
- 标量不能除以向量,且向量不能除以另一个向量
- 乘法的特殊情况:负向量,即
向量 乘以 标量-1
- 几何意义:
以因子(k 即 标量)缩放向量的长度
,如果k<0, 向量的方向就会相反- 当k = -1时,向量仅翻转,得到
大小相等,方向相反
的向量 - 当k = -2时,向量是先翻转,再放大,即-2可以看成(-1)乘以2
- 当k = -1时,向量仅翻转,得到
-
向量标准化
向量标准化 = 向量 / 向量的模,且向量 != 0
- 标准化向量 :是
向量长度 = 1
,不等于单位向量,单位向量是主对角线数为1,其他全为0,单位向量是标准化向量
-
向量的加减
总结- 向量不能与标量或者维度不同的向量相加减
- 向量加法满足交换律
- 向量减法不满足交换律,只有当 a=b 时, a-b = b-a
- 向量加法几何意义:平移向量
-
向量的
距离公式
- 向量a与向量b的距离公式 =
||b-a|| = b与a对应位置数差的平方和,再求根号
- 几何意义:两点间的距离
- 向量a与向量b的距离公式 =
-
向量的
点乘
总结
- 满足交换律,因为点乘结果是一个标量
- 几何意义:两向量的夹角,即
a · b = |a||b|cosα
==> α = arccos(a·b / |a||b|),当a、b是单位向量时,α = arccos(a·b)
a·b | 夹角α | a和b |
---|---|---|
> 0 | (0°,90°) | 方向基本相同 |
= 0 | 90° | 正交 |
<0 | (90°,108°) | 方向基本相反 |
-
根据已知的向量v和向量n,且v2平行于n,v1垂直于n,求向量v2和向量v1
- v2平行于n:
v2 = n(|v2| / |n|)
-
cosα = |v2| / |v|
==>|v2| = cosα·|v|
- 将|v2|代入v2 ==>
v2 = n(cosα·|v| / |n|)
- 分子分母同时乘以
|n|
==>v2 = n(cosα·|v|·|n| / |n|²)
- 根据
a · b = |a||b|cosα
==>v2 = n(v·n / |n|²)
,此时求得v2 - 根据v2求v1,因为
v1 + v2 = |v|
==>v1 = |v| - v2
- 将v2公式代入v1 ==>
v1 = |v| - n(v·n / |n|²)
- v2平行于n:
-
向量
叉乘
总结【常用】-
向量叉乘运算规则如下
- 向量的叉乘优先级高于点乘
- 几何意义
- a × b = c,c垂直于a和b构成的平面,即c是该平面的法线,分别与a,b都垂直
- a × b = c,即
|c| = |a||b|cosα
- 叉乘既
不满足交换律
,也不满足结合律
-
任何向量与自己叉乘等于零向量,即 向量a × 向量a = 0
-
矩阵
矩阵在OpenGL中推荐使用一维数组存储
方阵:
行=列
的矩阵向量可以当做
1*n(行向量) / n*1(列向量)
的矩阵使用标量和矩阵的乘法:将矩阵中的每个数都乘以标量
-
矩阵与矩阵相乘,即
A₃*₂ * B₂*₄ = C₃*₄
,A的列数必须匹配B的行数(记法图示如下)
-
矩阵乘法总结
- 当S是单位矩阵且乘法有意义,任意矩阵M乘以方阵S,,那么得到的结果就是原矩阵,即
MI = IM = M
- 矩阵乘法不满足交换律,即
AB != BA
- 矩阵乘法满足结合律,前提是ABC的维数使其乘法有意义,即
(AB)C = A(BC)
- 矩阵乘法也满足与标量/向量的结合律,即
(kA)B = k(AB) = A(kB); (vA)B = v(AB)
- 矩阵乘积的转置 相当于 先转置矩阵,然后以相反顺序相乘,即
(AB)ᵀ = BᵀAᵀ
- 当S是单位矩阵且乘法有意义,任意矩阵M乘以方阵S,,那么得到的结果就是原矩阵,即
-
向量与矩阵乘法总结
- 行向量左乘矩阵,结果是行向量
- 列向量右乘矩阵,结果实列向量
- 结果向量中每个元素都是原向量与矩阵中单独行/列的点积
- 矩阵-向量成法满足对向量加法的分配律,即
(v+w)M = vM + wM
,其中v,w是向量,M是矩阵
-
基向量:单位向量
-
p、q、r 定义分别指向+x,+y,+z⽅方向的单位向量量,v = xp+yq+zr
-
矩阵M对应到坐标轴的单位向量如图所示
-
- 矩阵的每一行都能解释为转换后的基向量
- 矩阵的几何意义
- 方阵的行能被解释为坐标的基向量
- 为了将向量从原坐标变换到新坐标,需要用向量乘以一个矩阵
- 线性变换:从原坐标系到基向量定义的新坐标系的变化
- 零向量乘以任何矩阵仍是零向量
2D下的旋转矩阵公式推演
核心动画CoreAnimation中苹果官方文档有提到
2D下的旋转时围绕原心旋转的
三角函数表
三角函数/角度 | 0(0°) | π/2(90°) | π(180°) | 3π/2(270°) | 2π(360°) |
---|---|---|---|---|---|
sinα | 0 | 1 | 0 | -1 | 0 |
cosα | 1 | 0 | -1 | 0 | 1 |
tanα | 0 | 不存在 | 0 | 不存在 | 0 |
cotα | 不存在 | 0 | 不存在 | 0 | 不存在 |
旋转时向量的变化与三角函数值的关系
-
旋转变化如图所示
-
向量与三角函数值的关系
3D下的旋转矩阵公式推演
-
3D下的旋转时围绕某个轴旋转的,当围绕哪个轴,哪个轴的矩阵中所对应的行和列就用基向量表示
围绕x轴旋转,x轴不会发生变化,所以x对应的矩阵行用基向量表示,图示如下
q向量的值变化过程为: +y(起始) ==> +z ==> -y ==> -z
1 0 0
0 0 1
0 1 0
0 0 -1
0 -1 0r向量的值变化过程:+z(起始) ==> -y ==> -z ==> +y
0 0 1
0 -1 0
0 0 -1
0 1 0
p、r变化过程图示为
与三角函数的关系如图所示
-
围绕Y、围绕Z与围绕x类似
- 围绕Y轴时R的矩阵:010表示的是基向量,围绕谁懂,谁就必须由基向量表示
-
围绕Y轴时R的矩阵:001表示的是基向量
- 围绕Y轴时R的矩阵:010表示的是基向量,围绕谁懂,谁就必须由基向量表示
缩放与平移矩阵公式推演
- 2D缩放:基向量p和q分别乘以标量k
- 平移:在哪个轴平移,将这个轴的对应的值与平移距离相加