FFD(Free-Form Deformation)自由变形

图1
一、简介
FFD首先是由Brigham Young University的Sederberg和Parry提出来。FFD的变形操作不是直接作用于物体,而是作用于所嵌入的变形空间,如果变形空间被改变了,则嵌入其中的物体自然也随之改变。
二、算法步骤
FFD算法主要有两个步骤:
将物体模型嵌入一个框架中(如图1,物体被嵌入了一个由3x3x3控制点组成的框架中)。当控制点位置改变时,改框架将会将模型“拉扯”,从而实现变形。
1、构造一个局部坐标系STU,然后计算模型每个顶点坐标所对应的局部坐标(s,t,u)。不管控制点世界坐标如何变化,局部坐标(s,t,u)都是固定不变的。
2、移动控制点,利用模型顶点局部坐标(s,t,u)、控制点世界坐标和Bernstein多项式重新计算模型每个顶点的世界坐标。
三、具体实现

图2
1、怎么构建模型局部坐标系STU?
如图2所示,沿着物体模型的OBB盒的三条边构建局部坐标系。
2、怎么将模型顶点坐标变换到STU坐标系?也就是说,怎么计算模型每个顶点坐标所对应的局部坐标(s,t,u)?

3、怎么通过新的控制点坐标重新计算模型顶点的位置?

四、FFD算法的局限性
1、不能用于圆角和过渡面的构造
2、在进行局部FFD变换时,物体的变形区与非变形区的交是平面边界曲线。想要构造任意边界曲线的变形将非常困难。
3、计算量大。对于三维FFD,算法总共有三层嵌套循环,其时间复杂度是o(n^3)。
4、网格调整比较麻烦。为获得合适的物体形状,需要仔细地选择、移动很多控制点。
五、重新计算法线
当物体模型的顶点位置改变之后,需要重新计算模型的顶点法线。通常做法是,通过加权平均共享该顶点的三角面的面法线。
六、结果
2x2x2控制点对物体进行变形

图3
3x3x3控制点对物体进行变形
图4
七、总结
FFD自由变形虽然有不少缺点,但是还是有它的用途,例如刚体打击变形、赛车碰撞车体变形等等。
除了用在刚体变形上,还可用于柔体,比如器官,如果直接在器官模型的三角面边上建立弹簧质点模型,不仅是弹簧数目巨大,变形效果还不好。这个时候,我们可以选择将弹簧质点模型建立到FFD控制点框架上。
U3D源码链接:
http://pan.baidu.com/s/1jHMiraQ
https://github.com/LittleAprilFool/FFD