基于Alexa等人2000年ARAP论文的三角形四元数形状插值实现(C++/OpenGL+Eigen)
基于四元数的两三角形ARAP形状插值实现思路
最近我在跟着Alexa、Cohen-Or和Levin 2000年的经典论文《As-rigid-as-possible shape interpolation》,尝试实现两个三角形之间基于四元数的形状插值,目前整理了部分推进步骤,先梳理出来:
1. 定义三角形对应的齐次变换矩阵
首先明确两个三角形的顶点与对应矩阵:
- 源三角形(三角形1)的顶点为A、B、C,对应的齐次坐标变换矩阵
T1定义为:T1 = {{A.x, B.x, C.x}, {A.y, B.y, C.y}, {1, 1, 1}} - 目标三角形(三角形2)的顶点为M、N、O,这里注意到你写的
T2存在笔误(x行和y行的第三列都误写为N的坐标),修正后的齐次矩阵应该是:T2 = {{M.x, N.x, O.x}, {M.y, N.y, O.y}, {1, 1, 1}}
2. 计算源到目标的仿射变换矩阵
接下来我打算先求解 T1 的逆矩阵 T1⁻¹,再将其与 T2 相乘,得到仿射变换矩阵 Affine = T1⁻¹ * T2。这一步的核心是把源三角形的坐标空间映射到目标三角形的空间,为后续分解刚性变换做基础准备。
3. 分解变换并结合四元数实现刚性插值
得到仿射矩阵后,下一步要将其拆分为旋转矩阵R、缩放矩阵S和平移向量t。ARAP的核心就是尽可能保留旋转部分的刚性,只引入最小的变形完成插值,而四元数是高效处理旋转插值的关键:
- 先把对应旋转矩阵转换为四元数形式,得到源状态的四元数
q1和目标状态的四元数q2 - 对两个四元数使用球面线性插值(SLERP),得到插值过程中任意时刻的过渡四元数
q(t),再转回旋转矩阵R(t) - 同时对平移向量
t和缩放矩阵S做线性插值,得到t(t)和S(t) - 最后将这些插值后的变换组合,应用到源三角形的顶点上,就能生成平滑过渡的中间三角形顶点
内容的提问来源于stack exchange,提问作者Toj19
相关产品推荐
相关产品推荐

