CG10上
Frenet-Serret框架
空间中一条曲线可以写成参数形式:
C ( u ) = ( x ( u ) , y ( u ) , z ( u ) ) \mathbf{C}(u) = (x(u), y(u), z(u)) C(u)=(x(u),y(u),z(u))
这表示:当参数 u u u 变化时,曲线在三维空间中移动,生成一条轨迹。每个参数值 u 0 u_0 u0 对应一个点 p = C ( u 0 ) \mathbf{p} = \mathbf{C}(u_0) p=C(u0)。切线向量 T(Tangent Vector)
定义为曲线的一阶导数:
C u = d C ( u ) d u \mathbf{C}_u = \frac{d\mathbf{C}(u)}{du} Cu=dudC(u)
它表示曲线在点 p = C ( u 0 ) \mathbf{p} = \mathbf{C}(u_0) p=C(u0) 处的“切线方向”,也就是“曲线在这个点要往哪里走”的方向。单位切线向量记作:
T = C u ∥ C u ∥ \mathbf{T} = \frac{\mathbf{C}_u}{\|\mathbf{C}_u\|} T=∥Cu∥Cu二阶导数 Cuu 与曲率信息
曲线的二阶导数:
C u u = d 2 C ( u ) d u 2 \mathbf{C}_{uu} = \frac{d^2 \mathbf{C}(u)}{du^2} Cuu=du2d2C(u)
它反映了“切线变化的速度”,也就是曲率方向。但注意:它不一定垂直于切线。如何从 Cuu 得到“法线向量 N”
因为 C u u \mathbf{C}_{uu} Cuu 不一定与切线垂直,所以我们要把它正交化,也就是去掉它在切线方向上的分量:
N = C u u − ( T ⋅ C u u ) T ∥ C u u − ( T ⋅ C u u ) T ∥ \mathbf{N} = \frac{\mathbf{C}_{uu} - (\mathbf{T} \cdot \mathbf{C}_{uu}) \mathbf{T}}{\|\mathbf{C}_{uu} - (\mathbf{T} \cdot \mathbf{C}_{uu}) \mathbf{T}\|} N=∥Cuu−(T⋅Cuu)T∥Cuu−(T⋅Cuu)T副法线的定义:
副法线(Binormal)是一个向量,与切线 T 和法线 N 都垂直,它保证了一个右手坐标系的存在。
B = T × N \mathbf{B} = \mathbf{T} \times \mathbf{N} B=T×N
也可以用一个更直接的定义来算:
B = C u × C u u ∥ C u × C u u ∥ \mathbf{B} = \frac{\mathbf{C}_u \times \mathbf{C}_{uu}}{\|\mathbf{C}_u \times \mathbf{C}_{uu}\|} B=∥Cu×Cuu∥Cu×Cuu
它本质上描述了曲线弯曲所在的平面法向量。三个向量构成 Frenet-Serret 框架
- T \mathbf{T} T:切线,方向
- N \mathbf{N} N:法线,朝向曲率中心
- B \mathbf{B} B:副法线,保证三维正交系统
这个三元组 T , N , B \mathbf{T}, \mathbf{N}, \mathbf{B} T,N,B 就叫做Frenet-Serret Frame,在计算机图形学、机械臂、路径规划中非常常见。
切向量:
对参数曲面 S ( u , v ) S(u, v) S(u,v),求偏导:
- ∂ u S = ∂ S ∂ u \partial_u S = \frac{\partial S}{\partial u} ∂uS=∂u∂S 是曲面沿 u 方向的切向量;
- ∂ v S = ∂ S ∂ v \partial_v S = \frac{\partial S}{\partial v} ∂vS=∂v∂S 是曲面沿 v 方向的切向量。
这两个向量定义了曲面在点 S ( u , v ) S(u,v) S(u,v) 处的“局部方向”。
切平面:
由这两个切向量张成的平面称为切平面,它是曲面在该点的一阶近似,即局部的“平面化”。
任何落在这个切平面上的向量都可以表示为:
w = a ⋅ ∂ u S + b ⋅ ∂ v S w = a \cdot \partial_u S + b \cdot \partial_v S w=a⋅∂uS+b⋅∂vS法向量(Normal Vector)
n = ∂ u S × ∂ v S \mathbf{n} = \partial_u S \times \partial_v S n=∂uS×∂vS
通常会单位化,得:
n ^ = ∂ u S × ∂ v S ∥ ∂ u S × ∂ v S ∥ \hat{\mathbf{n}} = \frac{\partial_u S \times \partial_v S}{\|\partial_u S \times \partial_v S\|} n^=∥∂uS×∂vS∥∂uS×∂vS曲面微分属性
法平面(Normal Plane):
在一个曲面点处,通过该点和法向量方向构成的平面。
法截线(Normal Section):
法平面与曲面相交得到一条曲线,称为法截线。它描述了曲面在该方向上的“弯曲性”。
法曲率(Normal Curvature):
法截线的曲率称为法曲率。因为通过一个点有无数个方向(即无数个法平面),所以有无数个法曲率。
主曲率与主方向(Principal Curvatures & Directions)
主曲率:
在所有方向上的法曲率中,有两个极值:
- 最大的称为 K max K_{\max} Kmax
- 最小的称为 K min K_{\min} Kmin
它们分别沿着某两个正交方向,称为主方向。
主曲率定义了曲面在该点的最大/最小弯曲强度。
各向同性与各向异性(Isotropic vs Anisotropic)
各向同性:
如果曲面在该点处的所有方向的法曲率都一样,即:
K max = K min > 0 K_{\max} = K_{\min} > 0 Kmax=Kmin>0
那么该点是各向同性的,比如球面上的任意点,向任何方向看都一样。- 特例:如果 K max = K min = 0 K_{\max} = K_{\min} = 0 Kmax=Kmin=0,那该点是平坦的,例如平面。
各向异性:
如果两个主曲率不同,说明表面在不同方向上的弯曲程度不同,即各向异性,并分为:
类型 条件 例子 椭圆型 K min > 0 , K max > 0 K_{\min} > 0, K_{\max} > 0 Kmin>0,Kmax>0 椭球表面 抛物型 K min = 0 , K max > 0 K_{\min} = 0, K_{\max} > 0 Kmin=0,Kmax>0 抛物面 双曲型 K min < 0 , K max > 0 K_{\min} < 0, K_{\max} > 0 Kmin<0,Kmax>0 马鞍面
主曲率的计算:
通常来自于一个称为**形状算子(Shape Operator)**的矩阵,它是法向量随参数方向变化的度量,求其特征值可得主曲率。
在计算中经常用:
K max , K min = eigvals ( S ) K_{\max}, K_{\min} = \text{eigvals}(S) Kmax,Kmin=eigvals(S)高斯曲率(Gaussian Curvature):
K = K min ⋅ K max K = K_{\min} \cdot K_{\max} K=Kmin⋅Kmax
- 如果 K > 0 K > 0 K>0:像球一样凸;
- 如果 K < 0 K < 0 K<0:像马鞍一样弯;
- 如果 K = 0 K = 0 K=0:平坦或呈抛物型。
平均曲率(Mean Curvature):
H = 1 2 ( K min + K max ) H = \frac{1}{2}(K_{\min} + K_{\max}) H=21(Kmin+Kmax)
它衡量的是整体的弯曲程度,常用于表面平滑(如 Laplace 平滑)和模拟物理形变。
网格质量(Mesh Quality)
定义:
网格质量描述了一个几何模型的离散表示(通常是三角网格)在几何、光滑性、拓扑规则性和可视性等方面的优劣。
高质量网格意味着:
- 表面平滑;
- 形状还原真实;
- 无严重畸变;
- 可支持高质量渲染或数值模拟。
网格质量的几何度量
(1) 弯曲能量(Strain Energy)
公式:
E = ∫ S ( κ 1 2 + κ 2 2 ) d A E = \int_S (\kappa_1^2 + \kappa_2^2) \, dA E=∫S(κ12+κ22)dA- κ 1 , κ 2 \kappa_1, \kappa_2 κ1,κ2:主曲率;
- d A dA dA:曲面上的面积元素。
含义:
- 这是衡量表面“弯曲强度”的能量;
- 弯曲越剧烈,能量越大;
- 平滑表面能量低,尖锐区域能量高。
📌 应用:用于光滑化算法或曲面重建中,控制曲率突变。
(2) 曲率变化量(Variation of Curvature)
E = ∫ S ( ( ∂ κ 1 ∂ t 1 ) 2 + ( ∂ κ 2 ∂ t 2 ) 2 ) d A E = \int_S \left( \left( \frac{\partial \kappa_1}{\partial t_1} \right)^2 + \left( \frac{\partial \kappa_2}{\partial t_2} \right)^2 \right) dA E=∫S((∂t1∂κ1)2+(∂t2∂κ2)2)dA
- 表示曲率随某一方向(如切向)变化的剧烈程度。
用途:
- 检测表面是否过于“起伏不定”;
- 过大的变化常表示几何噪声或采样不良。
网格质量的视觉评估方法
我们无法总是计算积分能量,因此常使用图形学视觉工具进行直观判断。
(1) 镜面高光(Specular Shading)
- 模拟真实光照产生的高光区域;
- 表面平滑 → 高光连续;
- 表面不平滑 → 高光断裂或斑驳。
高光是对法向量连续性的“放大镜”。
(2) 反射线(Reflection Lines)
- 虚拟“反射条纹”模拟物体映射周围环境;
- 条纹不连续、破碎 → 表面不光滑;
- 可检测高阶法向量变化。
反射线的可微性比曲面低一阶(如果曲面是 C 2 C^2 C2,反射线是 C 1 C^1 C1),对法向不连续极其敏感。
(3) 平均曲率与高斯曲率可视化
- 平均曲率 H H H:
- H = κ 1 + κ 2 2 H = \frac{\kappa_1 + \kappa_2}{2} H=2κ1+κ2
- 高值区域表示鼓起或凹陷。
- 高斯曲率 K K K:
- K = κ 1 ⋅ κ 2 K = \kappa_1 \cdot \kappa_2 K=κ1⋅κ2
- 用于识别曲面类型(球面、鞍面等)
网格质量原则(Principles)
总结所有度量和可视化方法,抽象为四大原则:
(1) 光滑性 Smoothness
- 表面应无法向突变;
- 曲率连续,避免尖角或高频振动;
- 关键指标:平均曲率、反射线连续性。
(2) 低噪声 Low Geometric Noise
- 指网格点无“跳动”;
- 常由扫描误差或压缩失真引起;
- 滤波和平滑算法可减少噪声。
(3) 网格规则性(Regularity)
- 网格元素(如三角形)应尽可能接近理想形状(等边);
- 避免出现“长针”“瘦帽”等畸形三角形。
形状分析:
- Circumradius / shortest edge:
- 外接圆半径/最短边;
- 值越大越畸形。
常见畸形:
- Needle:一条边极短;
- Cap:一角极小,像帽子;
- 两者都会引起插值不稳定、渲染噪声。
(4) 低畸变 Low Distortion
- 网格应尽可能忠实地表示原始几何;
- 拉伸或压缩会导致纹理失真、动画失效;
- 关键指标:面积/角度保持性、Jacobian determinant。
按ppt是这四个:
- 光滑性
- 低的几何噪声
- 网格的动态划分
- 低复杂性
- 三角形形状
- 数值健壮性
- 特征保持
- 低的法向噪声
网格质量优化(Mesh Optimization)
核心目标:
- 提升光滑性;
- 保持几何特征;
- 消除畸形元素。
方法:
- 重采样(Remeshing):重新生成网格,使其规则。
- 光滑算法(Fairing):
- Laplacian smoothing;
- Taubin smoothing;
- Mean curvature flow;
- 能量最小化:如最小二乘曲率能量。
网格噪声与网格光滑
什么是网格噪声?
- 定义:真实世界中通过3D扫描(如激光、结构光)得到的三角网格模型中常包含高频、不规则的小扰动,这些即为“网格噪声”。
- 常见来源:
- ✳️ 激光扫描仪 / 投影扫描仪的测量误差;
- ✳️ 环境光照/反射干扰;
- ✳️ 逆向工程中点云拟合误差。
网格噪声的特征
- 局部小突起或凹陷;
- 曲率变化剧烈;
- 不能被肉眼立即识别但影响后续计算(如纹理贴图、物理仿真)。
网格质量评估指标
曲率相关指标
平均曲率 H:
H = κ 1 + κ 2 2 H = \frac{\kappa_1 + \kappa_2}{2} H=2κ1+κ2高斯曲率 K:
K = κ 1 ⋅ κ 2 K = \kappa_1 \cdot \kappa_2 K=κ1⋅κ2高曲率处往往是噪声或尖锐几何特征。
能量函数
Strain Energy(应变能):
E = ∫ S ( κ 1 2 + κ 2 2 ) d A E = \int_S (\kappa_1^2 + \kappa_2^2) \, dA E=∫S(κ12+κ22)dA表示曲面弯曲“剧烈程度”,越剧烈则能量越高。
视觉分析
- Specular Shading:高光断裂表明法向不连续;
- Reflection Lines:反射线不平滑表明曲率突变;
- Curvature Map:颜色映射曲率变化,红色表示“危险区”。
网格去噪的目标与挑战
网格光滑(Mesh Smoothing)方法
核心思想
通过移动网格顶点(不改拓扑)来减少噪声、改善三角形质量、增强视觉平滑性。
基本流程(形状演化)
P new = P old + λ H ( P old ) \mathbf{P}_{\text{new}} = \mathbf{P}_{\text{old}} + \lambda \mathcal{H}(\mathbf{P}_{\text{old}}) Pnew=Pold+λH(Pold)
- P new \mathbf{P}_{\text{new}} Pnew:更新后顶点位置;
- λ \lambda λ:步长(控制光滑程度);
- H \mathcal{H} H:光滑算子(如 Laplace 算子);
显式 vs 隐式 光滑方法
方法 形式 优点 缺点 显式(Explicit) M n + 1 = M n + λ L ( M n ) \mathbf{M}_{n+1} = \mathbf{M}_n + \lambda \mathbf{L}(\mathbf{M}_n) Mn+1=Mn+λL(Mn) 简单、直观 需小步长,容易不稳定 隐式(Implicit) ( I − λ L ) M n + 1 = M n (\mathbf{I} - \lambda \mathbf{L})\mathbf{M}_{n+1} = \mathbf{M}_n (I−λL)Mn+1=Mn 稳定,可用大步长 需要求解线性系统,复杂
拉普拉斯光滑(Laplacian Smoothing)
核心思想
拉普拉斯光滑等价于一种“扩散过程” —— 就像热量在金属中扩散一样,网格顶点也向“邻域平均”方向流动。
数学模型(连续形式):
d P d t = L ( P ) \frac{d\mathbf{P}}{dt} = \mathbf{L}(\mathbf{P}) dtdP=L(P)
其中 P \mathbf{P} P 是顶点位置, L \mathbf{L} L 是拉普拉斯算子,代表“顶点 - 邻居中心”的方向。拉普拉斯算子的定义(邻域平均)
最基本的均匀拉普拉斯算子定义为:
L ( v i ) = ∑ j ∈ N ( i ) 1 ∣ N ( i ) ∣ ( v j − v i ) \mathbf{L}(v_i) = \sum_{j \in N(i)} \frac{1}{|N(i)|}(v_j - v_i) L(vi)=j∈N(i)∑∣N(i)∣1(vj−vi)- N ( i ) N(i) N(i):顶点 v i v_i vi 的邻居集合;
- 表示顶点朝“邻域平均位置”移动。
也可以表示为:
v i new = v i + λ ∑ j ∈ N ( i ) w i j ( v j − v i ) v_i^{\text{new}} = v_i + \lambda \sum_{j \in N(i)} w_{ij} (v_j - v_i) vinew=vi+λj∈N(i)∑wij(vj−vi)
其中 w i j w_{ij} wij 是邻居 j j j 对 i i i 的影响权重。
加权拉普拉斯(Weighted Laplacian)
为更好反映网格几何特征,引入不同的加权策略:
1. Umbrella Weights(雨伞权重)
w i j = 1 ∣ N ( i ) ∣ w_{ij} = \frac{1}{|N(i)|} wij=∣N(i)∣1
- 所有邻点贡献相等;
- 简单但容易模糊尖锐特征。
2. Mean Value Weights(均值权重)
w i j = tan ( ϕ i j / 2 ) + tan ( ϕ i j + 1 / 2 ) w_{ij} = \tan(\phi_{ij}/2) + \tan(\phi_{ij+1}/2) wij=tan(ϕij/2)+tan(ϕij+1/2)
- ϕ \phi ϕ 是邻域角;
- 对于非均匀三角网格,效果优于 Umbrella。
3. Cotangent Weights(余切权重)
w i j = cot ( α i j ) + cot ( β i j ) w_{ij} = \cot(\alpha_{ij}) + \cot(\beta_{ij}) wij=cot(αij)+cot(βij)
- α i j , β i j \alpha_{ij}, \beta_{ij} αij,βij:边对角的两个角;
- 准确地考虑了网格局部几何;
- 广泛用于曲率估计和几何优化。
保留细节:限制沿法线方向平滑
为防止顶点在切向方向滑动导致细节丢失,可以只让顶点在法线方向上移动:
P new = P old + λ ⋅ ( L ( P old ) ⋅ n ) ⋅ n \mathbf{P}_{\text{new}} = \mathbf{P}_{\text{old}} + \lambda \cdot (\mathbf{L}(\mathbf{P}_{\text{old}}) \cdot \mathbf{n}) \cdot \mathbf{n} Pnew=Pold+λ⋅(L(Pold)⋅n)⋅n- n \mathbf{n} n:顶点法向量;
- 只在法线方向投影位移;
- 可以保留曲线棱边或结构特征。
拉普拉斯光滑等价于最小化以下二次能量函数:
E ( P ) = ∑ ( i , j ) ∈ edges ∥ v i − v j ∥ 2 E(\mathbf{P}) = \sum_{(i,j)\in \text{edges}} \| v_i - v_j \|^2 E(P)=(i,j)∈edges∑∥vi−vj∥2
- 这个能量表示“网格的不平滑程度”;
- 最小化该能量可使边尽可能均匀,曲面趋于光滑。
拉普拉斯光滑中的特征保留技术详解
为什么需要特征保留的拉普拉斯光滑?
问题:
标准的拉普拉斯光滑通过顶点向邻居平均位置靠拢来减少噪声,但也容易模糊模型的重要几何特征(如折线边、尖角、细节部位)。目标:
在实现整体平滑的同时,保留曲面重要形状结构。形状保留方法概览
方法类型 原理 实现方式 固定点 / 区域 直接不动某些点 设置拉普拉斯为 0,即 L ( v i ) = 0 L(v_i) = 0 L(vi)=0 软约束 局部减少光滑强度 对不同区域设定不同 λ \lambda λ,如边缘附近小、内区大 全局优化 整体建模优化问题 一次性求解全局最小二乘问题 面约束 限制局部面片的重心变化 防止局部形状偏移 特征检测 预识别需保留的结构 边缘检测、法向量变化检测等 全局拉普拉斯光滑框架(Global Smoothing)
优势
- 一次性求解整个网格的顶点位置;
- 更适合配合多种约束;
- 具有数值稳定性和整体性。
添加约束实现特征保留
顶点约束(Vertex Constraints)
目的:保持某些关键点(如边缘、尖角)位置不变。
形式:
软约束:
∥ L X ′ ∥ 2 + μ − 2 ∑ i ∈ C ∥ v i ′ − v i ∥ 2 \| L X' \|^2 + \mu^{-2} \sum_{i \in C} \| v_i' - v_i \|^2 ∥LX′∥2+μ−2i∈C∑∥vi′−vi∥2强约束(硬约束):
v i ′ = v i 直接固定 v_i' = v_i \quad \text{直接固定} vi′=vi直接固定
结果:保留特征点,其他区域仍可平滑。
面约束(Face Constraints)
目的:限制面片的整体形状变化(如三角形的重心不偏移)。
能量函数:
min X { ∥ L X ′ ∥ 2 + ∑ ⟨ i , j , k ⟩ ∈ T λ 2 ∥ ( v i ′ + v j ′ + v k ′ ) − ( v i + v j + v k ) ∥ 2 } \min_X \left\{ \| L X' \|^2 + \sum_{\langle i,j,k \rangle \in T} \lambda^2 \left\| (v_i'+v_j'+v_k') - (v_i+v_j+v_k) \right\|^2 \right\} Xmin⎩ ⎨ ⎧∥LX′∥2+⟨i,j,k⟩∈T∑λ2 (vi′+vj′+vk′)−(vi+vj+vk) 2⎭ ⎬ ⎫- T T T:所有三角面片索引集合;
- 控制重心不变,保留局部形状;
- 参数 λ \lambda λ 控制保留强度。
其他线性约束
约束类型 用途 边约束 保留边的长度或方向,避免折线模糊 一阶邻域重心约束 控制小区域不整体漂移 法向量约束 保持曲面的朝向不变(例如用于光滑法向) 总目标函数为:
min X { ∥ L X ′ ∥ 2 + ∑ i ∈ C μ ∥ v i ′ − v i ∥ 2 + ∑ ⟨ i , j , k ⟩ ∈ T λ 2 ∥ ( v i ′ + v j ′ + v k ′ ) − ( v i + v j + v k ) ∥ 2 } \min_X \left\{ \| L X' \|^2 + \sum_{i \in C} \mu \| v_i' - v_i \|^2 + \sum_{\langle i,j,k \rangle \in T} \lambda^2 \| (v_i'+v_j'+v_k') - (v_i+v_j+v_k) \|^2 \right\} Xmin⎩ ⎨ ⎧∥LX′∥2+i∈C∑μ∥vi′−vi∥2+⟨i,j,k⟩∈T∑λ2∥(vi′+vj′+vk′)−(vi+vj+vk)∥2⎭ ⎬ ⎫
- 第一项:拉普拉斯平滑能量;
- 第二项:顶点位置保留;
- 第三项:面片重心保留;
- 参数 μ , λ \mu, \lambda μ,λ:控制权重,平衡保留与光滑程度。
线性系统求解方法
设系统矩阵为 A A A,未知顶点为 x x x,构成超定系统:
A x = b A x = b Ax=b
使用最小二乘法解得:
x = ( A T A ) − 1 A T b x = (A^T A)^{-1} A^T b x=(ATA)−1ATb
优点:- 数值稳定;
- 可加入任意线性约束;
- 利用稀疏矩阵求解器效率更高。
特征检测用于约束预处理
为自动设置约束位置,可使用启发式特征检测方法,例如:
✅ 法向量变化检测
- 若相邻面片法向量夹角大于阈值 → 识别为折线;
- 这些点加入顶点约束集合 C C C。
✅ 曲率检测(可选)
- 利用高斯曲率 / 平均曲率高值区识别尖角;
- 保留这些高曲率点或边界。
输入网格 → 特征检测 → 添加约束(点、面) ↓ 构造拉普拉斯矩阵 + 约束矩阵 ↓ 求解最小二乘系统 ↓ 输出平滑网格(保留特征)
视图
- 定义视图:从不同角度或方式观察物体生成的图像。
- 视图生成的关键因素:
- 物体本身的几何形状和尺寸。
- 观察者的视点位置和观察方向。
图形渲染管线(Graphics Pipeline):
- 几何管线:
- 变换(Transform):包括模型变换、视图变换、投影变换。
- 裁剪(Clip):移除视体外的几何体。
- 投影(Project):将3D场景映射到2D平面。
- 像素管线:处理像素操作(如纹理映射、颜色混合)。
- 框架:OpenGL程序控制管线,渲染结果存储在帧缓冲区(Frame Buffer)。
- 几何管线:
视图生成相关的变换类型:
- 3D变换:模型的平移、旋转、缩放等。
- 视图变换:将世界坐标系转换为相机坐标系。
- 相机变换:调整相机位置和方向(与视图变换类似)。
- **投影变换:**将3D场景映射到2D平面,分为:
- 正交投影(Orthographic):平行投影,保持尺寸不变。
- 透视投影(Perspective):模拟人眼,远处的物体显得更小。
经典视图的三个基本元素:
- 物体:需要渲染的3D几何体。
- 观察者与投影面:观察者的视点和投影平面(如屏幕)。
- 投影线:从物体到投影面的映射路径。
投影:将3D场景映射到2D平面。
两种主要投影类型:
- 正交投影:投影线平行,保持物体尺寸。
- 透视投影:投影线汇聚于一点,模拟远近大小变化。
平面几何投影的分类:
- 平行投影:
- 多视图正交投影:如正面、顶面、侧面图。
- 轴测投影:
- 等轴测(Isometric):三个轴角度相等。
- 二轴测(Dimetric):两个轴角度相等。
- 三轴测(Trimetric):三个轴角度不同。
- 斜投影:投影线与投影平面非垂直。
- 透视投影:
- 一点透视:一个消失点。
- 两点透视:两个消失点。
- 三点透视:三个消失点。
- 平行投影:
计算机视图生成的三个关键步骤:
- 相机定位:通过模型-视图矩阵(model-view matrix)设置相机位置和方向。
- 选择镜头:通过投影矩阵(projection matrix)定义投影类型(如透视或正交)。
- 裁剪:定义视体(view volume),移除体外的几何体。
OpenGL相机模型的默认设置:
- 相机与物体坐标系初始重合(单位模型-视图矩阵)。
- 相机位于原点,朝负z轴方向。
- 默认视体:边长为2的立方体,中心在原点。
- 默认投影矩阵:单位矩阵,相当于正交投影。
相机移动的实现:
通过旋转和平移序列调整相机到任意位置。
示例(侧视图):
glTranslatef(0.0, 0.0, -d); glRotatef(-90.0, 0.0, 1.0, 0.0);
- 旋转相机(绕y轴旋转-90°)。
- 平移相机(沿负z轴移动d)。
参数 解释 -90.0
旋转角度,单位是度(degree)。负号表示 顺时针旋转(沿指定轴的右手法则反方向) 0.0, 1.0, 0.0
旋转轴向量,即绕哪个轴旋转。这里是绕 y 轴 旋转,因为只有 y 分量是 1 模型-视图矩阵:C = T * R(先旋转后平移)。
**变换顺序:最后定义的变换(旋转)先应用,然后是平移。**即,后定义先使用
完整:
glMatrixMode (GL_MODELVIEW) glLoadIdentity(); glTranslatef(0.0, 0.0, -d); glRotatef(-90.0, 0.0, 1.0, 0.0);
视口内容的四个相机参数:
- 相机位置:视点坐标。
- 观察方向:相机指向的方向。
- 相机朝向:相机的上下方向(避免翻转)。
- 视口大小:投影平面的尺寸。
gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz)
眼位置:相机所在点。
观察点:相机指向的点,定义观察方向。view direction=(atx-eyex, aty-eyey, atz-eyez)
上向量:定义相机的朝上方向,避免翻转。
gluLookAt生成模型-视图矩阵,将世界坐标系变换到相机坐标系。