三维网格精简算法(Quadric Error Metrics)附源码
Posted 拉风小宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三维网格精简算法(Quadric Error Metrics)附源码相关的知识,希望对你有一定的参考价值。
本文转自:http://www.cnblogs.com/shushen/p/5311828.html
我发现他的一系列文章都挺好,就是总缺点东西,所以没法执行
本文的算法来源于 Michael Garland在97年的文章
Surface simplification using quadric error metrics
算法介绍
在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型。然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如何自动计算生成这些三维简化模型就是网格精简算法所关注的目标。
[Garland et al. 1997]提出了一种基于二次误差作为度量代价的边收缩算法,其计算速度快并且简化质量较高。该方法在选择一条合适的边进行迭代收缩时,定义了一个描述边收缩代价的变量 Δ \\Delta Δ,具体如下:对于网格中的每个顶点 v v v,我们预先定义一个4×4的对称误差矩阵 Q Q Q,那么顶点 v = [ v x v y v z 1 ] T v = [v_x\\ v_y\\ v_z\\ 1]^T v=[vx vy vz 1]T的误差为其二次项形式 Δ ( v ) = v T Q v \\Delta(v) = v^TQv Δ(v)=vTQv。假设对于一条收缩边 ( v 1 , v 2 ) (v_1, v_2) (v1,v2),其收缩后顶点变为 v b a r v_bar vbar,我们定义顶点 v b a r v_bar vbar的误差矩阵 Q b a r Q_bar Qbar为 Q b a r = Q 1 + Q 2 Q_bar = Q_1 + Q_2 Qbar=Q1+Q2,对于如何计算顶点 v b a r v_bar vbar的位置有两种策略:一种简单的策略就是在 v 1 , v 2 v_1, v_2 v1,v2和 ( v 1 + v 2 ) / 2 (v_1+ v_2)/2 (v1+v2)/2中选择一个使得收缩代价 Δ ( v b a r ) \\Delta(v_bar) Δ(vbar)最小的位置。另一种策略就是数值计算顶点 v b a r v_bar vbar位置使得 Δ ( v b a r ) \\Delta(v_bar) Δ(vbar)最小,由于 Δ \\Delta Δ的表达式是一个二次项形式,因此令一阶导数为0,即,该式等价于求解:
[ q 11 q 12 q 13 q 14 q 12 q 22 q 23 q 24 q 13 q 23 q 33 q 34 0 0 0 1 ] v ˉ = [ 0 0 0 1 ] \\left[ \\beginmatrix q_11&q_12&q_13&q_14\\\\ q_12&q_22&q_23&q_24\\\\ q_13&q_23&q_33&q_34\\\\ 0&0&0&1 \\endmatrix \\right]\\barv=\\left[ \\beginmatrix 0\\\\0\\\\0\\\\1 \\endmatrix \\right] ⎣⎢⎢⎡q11q12q130q12q22q230q13q23q330q14q24q341⎦⎥⎥⎤vˉ=⎣⎢⎢⎡0001⎦⎥⎥⎤
其中 q i j q_ij qij为矩阵 Q b a r Q_bar Qbar中对应的元素。如果系数矩阵可逆,那么通过求解上述方程就可以得到新顶点 v b a r v_bar vbar的位置,如果系数矩阵不可逆,就通过第一种简单策略来得到新顶点 v b a r v_bar vbar的位置。根据以上描述,算法流程如下:
- 对所有的初始顶点计算 Q Q Q矩阵.
- 选择所有有效的边(这里取的是联通的边,也可以将距离小于一个阈值的边归为有效边)
- 对每一条有效边 ( v 1 , v 2 ) (v_1,v_2) (v1,v2),计算最优抽取目标 v ˉ \\barv vˉ.误差 v ˉ T ( Q 1 + Q 2 ) v ˉ \\barv^T(Q_1+Q_2)\\barv vˉT(Q1+Q2)vˉ是抽取这条边的代价(cost)
- 将所有的边按照cost的权值放到一个堆里
- 每次移除代价(cost)最小的边,并且更新包含着 v 1 v_1 v1的所有有效边的代价
剩下的问题就是如何计算每个顶点的初始误差矩阵 Q Q Q,在原始网格模型中,每个顶点可以认为是其周围三角片所在平面的交集,也就是这些平面的交点就是顶点位置,我们定义顶点的误差为顶点到这些平面的距离平方和:
Δ
(
v
)
=
Δ
(
[
v
x
v
y
v
z
1
]
T
)
=
∑
p
∈
p
l
a
n
e
s
(
v
)
(
p
T
v
)
2
=
∑
p
∈
p
l
a
n
e
s
(
v
)
(
v
T
p
)
(
p
T
v
)
=
∑
p
∈
p
l
a
n
e
s
(
v
)
v
T
(
p
p
T
)
v
=
v
T
(
∑
p
以上是关于三维网格精简算法(Quadric Error Metrics)附源码的主要内容,如果未能解决你的问题,请参考以下文章