FFD(Free-Form Deformation)自由变形算法

最近在调研关于网格变形的东西,最长提到的就是自由变形算法FFD,之前对FFD没有任何了解,稍微了解一些后,决定总结一番。
但是内容还是比较简单的,只是一个初步的了解,后面对FFD的一些拓展算法也没有深入研究。

FFD的步骤:

(1)需变形的部分嵌入一个平行六面体中;
(2)给平行六面体内部以及边界上的每个点分配一个固定的网格参数坐标;
(3)通过移动控制点,引起物体形变。

六面体均匀划分为L*M*N个平行六面体格子:每个格子的顶点即为控制点。控制点记为P(i,j,k),i的范围为[0,L],j的范围为[0,M],k的范围为[0,N]。
因为控制点是均匀分布在六面体内部及其表面上,所以控制点满足:
P(i,j,k)=p(0,0,0)+\frac{i}{L}X+\frac{j}{M}Y+\frac{k}{N}Z
其中
X=P(L,0,0)-P(0,0,0)
Y=P(0,M,0)-P(0,0,0)
Z=P(0,0,N)-P(0,0,0)

给平行六面体内部以及边界上每个点分配一个固定的网格参数坐标。
对于任何一个点Q,设其网格参数坐标(x,y,z),则计算如下:
x=\frac{(Y\times Z)\cdot (Q-P(0,0,0))}{(Y\times Z)\cdot X}
y=\frac{(X\times Z)\cdot (Q-P(0,0,0))}{(X\times Z)\cdot Y}
z=\frac{(X\times Y)\cdot (Q-P(0,0,0))}{(X\times Y)\cdot Z}
通过移动控制点带动物体发生形变,Q在形变之后的新坐标为:
Q(x,y,z)=\sum_{i=0}^{L}\sum_{j=0}^{M}\sum_{k=0}^{N}B_{i,L}(x)B_{j,M}(y)B_{k,N}(z)P(i,j,k)
其中P(i,j,k)为控制点的新坐标。
Bernstein函数
B_{i,L}(x)=\frac{L!}{i!(L-i)!}x^{i}(1-x)^{L-i}
B_{j,M}(y)=\frac{M!}{j!(M-j)!}y^{j}(1-y)^{M-j}
B_{k,N}(z)=\frac{N!}{k!(N-k)!}z^{k}(1-z)^{N-k}

PS:

在写这篇博客的时候遇到了如何在博客中插入数学公式的问题,在这里找到了方法。