Bootstrap

Cesium中的线性代数和计算机图形学知识介绍

目录

前言

  在 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] v2=[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 v1v2=v1∣∣v2cosθ
  • 示例:对于向量 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 v1v2=14+2(5)+36=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= v1yv2zv1zv2yv1zv2xv1xv2zv1xv2yv1yv2x
  • 示例:对于向量 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^=vv
  • 示例:向量 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} M1M2=[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} M1=21[4321]
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[(1t)θ]q1+sinθsin[]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)10000farnearfar+near100farnear2farnear0

  • 示例:将视野为 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.73200001.0021002.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= rl20000tb20000nf20lrl+rbtb+tnff+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= 1000010000101231

2.2.3 模型变换 (Model Transformations)

1.模型矩阵 (Model Matrix)
  • 应用:对对象进行局部变换,如平移、旋转、缩放。
  • 公式

M = T ⋅ R ⋅ S \mathbf{M} = \mathbf{T} \cdot \mathbf{R} \cdot \mathbf{S} M=TRS

  • 示例:对对象进行平移 [ 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=Lmax(NL,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×v2v1×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的调用,也要进行深入的原理剖析,才能让这个行业发展壮大。

;