目录
前言
在 Cesium(包括 CesiumJS 和用于 Unreal Engine 中的 Cesium for Unreal)中,线性代数和计算机图形学知识被广泛应用于 3D 地理可视化、地形渲染、空间分析等领域,本文将对一些常见的知识进行基本介绍。
1.基础介绍
1.1 线性代数
1.1.1 向量 (Vectors)
基本运算:向量加法、减法、标量乘法等,用于表示位置、方向、速度等。
点积 (Dot Product):计算两个向量之间的夹角,应用于光照、视图方向等。
叉积 (Cross Product):计算两个向量的垂直向量,用于法线计算和旋转。
单位化 (Normalization):将向量长度标准化,用于方向矢量和法线计算。
向量长度 (Length):计算向量的长度,用于距离测量和方向计算。
1.1.2 矩阵 (Matrices)
基本运算:矩阵加法、乘法,用于合成变换(如组合平移、旋转、缩放)。
转置 (Transpose):用于求解矩阵的反向操作。
行列式 (Determinant) 和 逆矩阵 (Inverse Matrix):用于解决线性方程和逆变换。
4x4 齐次坐标矩阵 (Homogeneous Transformation Matrix):用于三维仿射变换,包括平移、旋转、缩放、透视投影等。
1.1.3 四元数 (Quaternions)
表示旋转:用于避免欧拉角旋转中的万向锁问题,高效地处理三维旋转。
四元数插值 (Slerp):用于平滑旋转动画和相机路径。
1.2 计算机图形学
1.2.1 投影变换 (Projection Transformations)
透视投影 (Perspective Projection):模拟人眼观察效果,近大远小。
正交投影 (Orthographic Projection):用于平行投影,保持物体尺寸一致。
投影矩阵 (Projection Matrix):将三维坐标变换到二维屏幕坐标。
1.2.2 视图变换 (View Transformations)
视图矩阵 (View Matrix):将世界坐标系转换到相机视角坐标系,管理相机的位置和方向。
相机变换 (Camera Transform):定义观察者在场景中的位置、方向和视角。
1.2.3 模型变换 (Model Transformations)
模型矩阵 (Model Matrix):对对象进行局部变换(如平移、旋转、缩放)。
层级变换 (Hierarchical Transformations):处理复杂对象时管理局部和全局变换。
1.2.4 光照与着色 (Lighting and Shading)
光照模型 (Lighting Models):如朗伯反射模型 (Lambertian Reflectance) 和菲涅耳反射 (Fresnel Reflection)。
着色算法 (Shading Algorithms):如平坦着色 (Flat Shading)、高光着色 (Specular Shading)、菲涅耳着色 (Fresnel Shading)。
法线计算 (Normal Calculation):用于光照计算和表面特性描绘。
1.2.5 纹理映射 (Texture Mapping)
UV坐标变换 (UV Mapping):将纹理映射到三维表面,用于丰富表面细节。
1.2.6 裁剪与视锥 (Clipping and Frustum Culling)
视锥裁剪 (Frustum Culling):剔除视锥外的物体,优化渲染性能。
屏幕空间裁剪 (Screen-Space Clipping):确保只渲染可见的部分。
1.2.7 地形和海量数据渲染
地形细分 (Terrain Tessellation):用于动态细分地形,实现高分辨率细节。
多分辨率网格 (LOD, Level of Detail):根据视距动态调整渲染细节,提升性能。
2.详细介绍
2.1 线性代数知识
2.1.1 向量 (Vectors)
1.基本运算
-
向量加法/减法:
- 应用:用于移动物体、计算两个点之间的位移。
- 示例:如果有两个向量 v 1 = [ 1 , 2 , 3 ] \mathbf{v1} = [1, 2, 3] v1=[1,2,3] 和 v 2 = [ 4 , 5 , 6 ] \mathbf{v2} = [4, 5, 6] v2=[4,5,6],那么 v 1 + v 2 = [ 5 , 7 , 9 ] \mathbf{v1} + \mathbf{v2} = [5, 7, 9] v1+v2=[5,7,9]。
-
标量乘法:
- 应用:用于缩放向量。
- 示例:向量 v = [ 1 , 2 , 3 ] \mathbf{v} = [1, 2, 3] v=[1,2,3] 乘以标量 2,得到 v ⋅ 2 = [ 2 , 4 , 6 ] \mathbf{v} \cdot 2 = [2, 4, 6] v⋅2=[2,4,6]。
2.点积 (Dot Product)
- 应用:计算两个向量之间的夹角,用于光照计算和视图方向判断。
- 公式: v 1 ⋅ v 2 = ∣ v 1 ∣ ∣ v 2 ∣ cos θ \mathbf{v1} \cdot \mathbf{v2} = |\mathbf{v1}| |\mathbf{v2}| \cos \theta v1⋅v2=∣v1∣∣v2∣cosθ。
- 示例:对于向量 v 1 = [ 1 , 2 , 3 ] \mathbf{v1} = [1, 2, 3] v1=[1,2,3] 和 v 2 = [ 4 , − 5 , 6 ] \mathbf{v2} = [4, -5, 6] v2=[4,−5,6],点积为 v 1 ⋅ v 2 = 1 ⋅ 4 + 2 ⋅ ( − 5 ) + 3 ⋅ 6 = 12 \mathbf{v1} \cdot \mathbf{v2} = 1 \cdot 4 + 2 \cdot (-5) + 3 \cdot 6 = 12 v1⋅v2=1⋅4+2⋅(−5)+3⋅6=12。
3.叉积 (Cross Product)
- 应用:用于计算法线向量和旋转方向。
- 公式: v 1 × v 2 = [ v 1 y ⋅ v 2 z − v 1 z ⋅ v 2 y v 1 z ⋅ v 2 x − v 1 x ⋅ v 2 z v 1 x ⋅ v 2 y − v 1 y ⋅ v 2 x ] \mathbf{v1} \times \mathbf{v2} = \begin{bmatrix} v1_y \cdot v2_z - v1_z \cdot v2_y \\ v1_z \cdot v2_x - v1_x \cdot v2_z \\ v1_x \cdot v2_y - v1_y \cdot v2_x \end{bmatrix} v1×v2= v1y⋅v2z−v1z⋅v2yv1z⋅v2x−v1x⋅v2zv1x⋅v2y−v1y⋅v2x 。
- 示例:对于向量 v 1 = [ 1 , 2 , 3 ] \mathbf{v1} = [1, 2, 3] v1=[1,2,3] 和 v 2 = [ 4 , 5 , 6 ] \mathbf{v2} = [4, 5, 6] v2=[4,5,6],叉积为 v 1 × v 2 = [ − 3 , 6 , − 3 ] \mathbf{v1} \times \mathbf{v2} = [-3, 6, -3] v1×v2=[−3,6,−3]。
4.单位化 (Normalization)
- 应用:标准化向量用于方向计算和光照。
- 公式: v ^ = v ∣ v ∣ \hat{\mathbf{v}} = \frac{\mathbf{v}}{|\mathbf{v}|} v^=∣v∣v。
- 示例:向量 v = [ 1 , 2 , 2 ] \mathbf{v} = [1, 2, 2] v=[1,2,2],单位化后为 v ^ = [ 1 , 2 , 2 ] 1 2 + 2 2 + 2 2 = [ 0.333 , 0.666 , 0.666 ] \hat{\mathbf{v}} = \frac{[1, 2, 2]}{\sqrt{1^2 + 2^2 + 2^2}} = [0.333, 0.666, 0.666] v^=12+22+22[1,2,2]=[0.333,0.666,0.666]。
5.向量长度 (Length)
- 应用:计算向量的长度,用于距离测量。
- 公式: ∣ v ∣ = v x 2 + v y 2 + v z 2 |\mathbf{v}| = \sqrt{v_x^2 + v_y^2 + v_z^2} ∣v∣=vx2+vy2+vz2。
- 示例:向量 v = [ 1 , 2 , 2 ] \mathbf{v} = [1, 2, 2] v=[1,2,2] 的长度为 ∣ v ∣ = 1 2 + 2 2 + 2 2 = 3 |\mathbf{v}| = \sqrt{1^2 + 2^2 + 2^2} = 3 ∣v∣=12+22+22=3。
2.1.2 矩阵 (Matrices)
1.基本运算
-
矩阵乘法:
- 应用:用于组合多种变换,如平移、旋转、缩放。
- 示例:矩阵 M 1 = [ 1 2 3 4 ] \mathbf{M1} = \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} M1=[1324] 和 M 2 = [ 5 6 7 8 ] \mathbf{M2} = \begin{bmatrix}5 & 6 \\ 7 & 8\end{bmatrix} M2=[5768] 的乘积为 M 1 ⋅ M 2 = [ 19 22 43 50 ] \mathbf{M1} \cdot \mathbf{M2} = \begin{bmatrix}19 & 22 \\ 43 & 50\end{bmatrix} M1⋅M2=[19432250]。
-
转置:
- 应用:用于求解变换的逆变换。
- 示例:矩阵 M = [ 1 2 3 4 ] \mathbf{M} = \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} M=[1324] 的转置为 M T = [ 1 3 2 4 ] \mathbf{M}^T = \begin{bmatrix}1 & 3 \\ 2 & 4\end{bmatrix} MT=[1234]。
2.行列式 (Determinant) 和 逆矩阵 (Inverse Matrix)
- 应用:用于求解线性方程和坐标变换。
- 示例:矩阵 M = [ 1 2 3 4 ] \mathbf{M} = \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} M=[1324] 的行列式为 det ( M ) = − 2 \text{det}(\mathbf{M}) = -2 det(M)=−2,逆矩阵为 M − 1 = 1 − 2 [ 4 − 2 − 3 1 ] \mathbf{M}^{-1} = \frac{1}{-2} \begin{bmatrix}4 & -2 \\ -3 & 1\end{bmatrix} M−1=−21[4−3−21]。
3. 4x4齐次坐标矩阵 (Homogeneous Transformation Matrix)
- 应用:用于三维仿射变换(平移、旋转、缩放)。
- 示例:将点 p = [ 1 , 2 , 3 , 1 ] \mathbf{p} = [1, 2, 3, 1] p=[1,2,3,1] 平移 [ d x , d y , d z ] [dx, dy, dz] [dx,dy,dz],变换矩阵为:
T = [ 1 0 0 d x 0 1 0 d y 0 0 1 d z 0 0 0 1 ] \mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & dx \\ 0 & 1 & 0 & dy \\ 0 & 0 & 1 & dz \\ 0 & 0 & 0 & 1 \end{bmatrix} T= 100001000010dxdydz1
2.1.3 四元数 (Quaternions)
1.表示旋转
- 应用:用于避免欧拉角的万向锁问题,处理三维旋转。
- 公式:四元数 q = w + x i + y j + z k q = w + xi + yj + zk q=w+xi+yj+zk。
- 示例:旋转向量 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0] 90 度,四元数表示为 q = cos ( 4 5 ∘ ) + i sin ( 4 5 ∘ ) = 2 2 + i 2 2 q = \cos(45^\circ) + i\sin(45^\circ) = \frac{\sqrt{2}}{2} + i\frac{\sqrt{2}}{2} q=cos(45∘)+isin(45∘)=22+i22。
2.四元数插值 (Slerp)
- 应用:用于平滑旋转动画和路径插值。
- 示例:两个四元数
q
1
q1
q1 和
q
2
q2
q2 的插值为
q ( t ) = sin [ ( 1 − t ) θ ] sin θ q 1 + sin [ t θ ] sin θ q 2 q(t) = \frac{\sin[(1-t)\theta]}{\sin \theta} q_1 + \frac{\sin[t\theta]}{\sin \theta} q_2 q(t)=sinθsin[(1−t)θ]q1+sinθsin[tθ]q2
2.2 计算机图形学知识
2.2.1 投影变换 (Projection Transformations)
1.透视投影 (Perspective Projection)
- 应用:将三维场景转换为二维图像,模拟人眼观察效果。
- 公式:
P = [ 1 tan ( f o v 2 ) 0 0 0 0 1 tan ( f o v 2 ) 0 0 0 0 f a r + n e a r f a r − n e a r 2 ⋅ f a r ⋅ n e a r f a r − n e a r 0 0 − 1 0 ] \mathbf{P} = \begin{bmatrix} \frac{1}{\tan(\frac{fov}{2})} & 0 & 0 & 0 \\ 0 & \frac{1}{\tan(\frac{fov}{2})} & 0 & 0 \\ 0 & 0 & \frac{far+near}{far-near} & \frac{2 \cdot far \cdot near}{far-near} \\ 0 & 0 & -1 & 0 \end{bmatrix} P= tan(2fov)10000tan(2fov)10000far−nearfar+near−100far−near2⋅far⋅near0
- 示例:将视野为 60 度、近裁剪面为 1,远裁剪面为 1000 的相机进行透视投影,投影矩阵为:
P = [ 1.732 0 0 0 0 1.732 0 0 0 0 − 1.002 − 2.002 0 0 − 1 0 ] \mathbf{P} = \begin{bmatrix} 1.732 & 0 & 0 & 0 \\ 0 & 1.732 & 0 & 0 \\ 0 & 0 & -1.002 & -2.002 \\ 0 & 0 & -1 & 0 \end{bmatrix} P= 1.73200001.7320000−1.002−100−2.0020
2.正交投影 (Orthographic Projection)
- 应用:将三维物体平行投影到二维平面,保持物体尺寸一致。
- 公式:
P = [ 2 r − l 0 0 l + r l − r 0 2 t − b 0 b + t b − t 0 0 2 n − f f + n n − f 0 0 0 1 ] \mathbf{P} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & \frac{l+r}{l-r} \\ 0 & \frac{2}{t-b} & 0 & \frac{b+t}{b-t} \\ 0 & 0 & \frac{2}{n-f} & \frac{f+n}{n-f} \\ 0 & 0 & 0 & 1 \end{bmatrix} P= r−l20000t−b20000n−f20l−rl+rb−tb+tn−ff+n1
- 示例:投影矩阵为:
P = [ 1 5 0 0 0 0 1 5 0 0 0 0 1 10 0 0 0 0 1 ] \mathbf{P} = \begin{bmatrix} \frac{1}{5} & 0 & 0 & 0 \\ 0 & \frac{1}{5} & 0 & 0 \\ 0 & 0 & \frac{1}{10} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} P= 51000051000010100001
将三维点投影到二维平面。
2.2.2 视图变换 (View Transformations)
1.视图矩阵 (View Matrix)
- 应用:将世界坐标转换为相机视角坐标,管理相机的位置和方向。
- 公式:
V = [ R t 0 1 ] \mathbf{V} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix} V=[R0t1]
- 示例:假设相机在 [ 1 , 2 , 3 ] [1, 2, 3] [1,2,3] 处,朝向为 [ 0 , 0 , − 1 ] [0, 0, -1] [0,0,−1],则视图矩阵为:
V = [ 1 0 0 − 1 0 1 0 − 2 0 0 1 − 3 0 0 0 1 ] \mathbf{V} = \begin{bmatrix} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & -2 \\ 0 & 0 & 1 & -3 \\ 0 & 0 & 0 & 1 \end{bmatrix} V= 100001000010−1−2−31
2.2.3 模型变换 (Model Transformations)
1.模型矩阵 (Model Matrix)
- 应用:对对象进行局部变换,如平移、旋转、缩放。
- 公式:
M = T ⋅ R ⋅ S \mathbf{M} = \mathbf{T} \cdot \mathbf{R} \cdot \mathbf{S} M=T⋅R⋅S
- 示例:对对象进行平移 [ d x , d y , d z ] [dx, dy, dz] [dx,dy,dz],旋转 θ \theta θ 度,缩放 [ s x , s y , s z ] [sx, sy, sz] [sx,sy,sz],模型矩阵为:
M = [ s x 0 0 d x 0 s y 0 d y 0 0 s z d z 0 0 0 1 ] \mathbf{M} = \begin{bmatrix} sx & 0 & 0 & dx \\ 0 & sy & 0 & dy \\ 0 & 0 & sz & dz \\ 0 & 0 & 0 & 1 \end{bmatrix} M= sx0000sy0000sz0dxdydz1
2.2.4 光照与着色 (Lighting and Shading)
1.光照模型 (Lighting Models)
- 应用:计算光线与物体表面的交互。
- 朗伯反射模型 (Lambertian Reflectance):
I = L ⋅ max ( N ⋅ L , 0 ) \mathbf{I} = \mathbf{L} \cdot \max(\mathbf{N} \cdot \mathbf{L}, 0) I=L⋅max(N⋅L,0)
- 示例:光源 L = [ 1 , 1 , 1 ] \mathbf{L} = [1, 1, 1] L=[1,1,1],法线 N = [ 0 , 1 , 0 ] \mathbf{N} = [0, 1, 0] N=[0,1,0],则亮度为:
I = max ( 0 , [ 0 , 1 , 0 ] ⋅ [ 1 , 1 , 1 ] ) = 1 I = \max(0, [0, 1, 0] \cdot [1, 1, 1]) = 1 I=max(0,[0,1,0]⋅[1,1,1])=1
2.着色算法 (Shading Algorithms)
- 平坦着色 (Flat Shading):对每个多边形应用相同的颜色。
- 高光着色 (Specular Shading):计算高光反射,模拟镜面效果。
3.法线计算 (Normal Calculation)
- 应用:用于光照计算和表面特性描绘。
- 公式:
N = v 1 × v 2 ∣ v 1 × v 2 ∣ \mathbf{N} = \frac{\mathbf{v1} \times \mathbf{v2}}{|\mathbf{v1} \times \mathbf{v2}|} N=∣v1×v2∣v1×v2
- 示例:两个向量 v 1 = [ 1 , 0 , 0 ] \mathbf{v1} = [1, 0, 0] v1=[1,0,0] 和 v 2 = [ 0 , 1 , 0 ] \mathbf{v2} = [0, 1, 0] v2=[0,1,0],法线 N = [ 0 , 0 , 1 ] \mathbf{N} = [0, 0, 1] N=[0,0,1]。
2.2.5 纹理映射 (Texture Mapping)
1.UV坐标变换 (UV Mapping)
- 应用:将二维纹理映射到三维物体表面。
- 示例:将纹理 ( u , v ) (u, v) (u,v) = (0.5, 0.5) 映射到三维点 p = [ x , y , z ] \mathbf{p} = [x, y, z] p=[x,y,z]。
2.2.6 裁剪与视锥 (Clipping and Frustum Culling)
1.视锥裁剪 (Frustum Culling)
- 应用:剔除视锥外的物体以提高渲染效率。
- 示例:视锥为近远裁剪面 n e a r = 1 near = 1 near=1, f a r = 1000 far = 1000 far=1000,仅渲染视锥内的物体。
2.2.7 地形和海量数据渲染
1.地形细分 (Terrain Tessellation)
- 应用:动态细分地形,实现高分辨率细节。
- 示例:远处的地形使用粗糙的网格,近处使用细分网格。
2.多分辨率网格 (LOD, Level of Detail)
- 应用:根据视距动态调整渲染细节,提升性能。
- 示例:远处的物体使用低分辨率模型,近处使用高分辨率模型。
3.总结
这些知识每个拿出来讲都有的讲,我们这里算是一个入门介绍,抛砖引玉,授人以鱼不如授人以渔,希望各位做三维的giser,不要仅局限于api的调用,也要进行深入的原理剖析,才能让这个行业发展壮大。