发明名称 一种基于流体关键帧编辑的可控流体动画生成方法
摘要 本发明公开了一种基于流体关键帧编辑的可控流体动画生成方法。初始流体动画序列中指定关键帧,对关键帧处的流体形状进行预处理,分为三种特征区域;用户输入三维三角形面片或者二维曲线,获取三维控制点集;获得形变速度场参数后计算得到形变速度场;将形变速度场的每个速度模版中心沿着速度场移动得到修改后的速度场,使用修改后的速度场对关键帧形变得到形变后的关键帧;将子序列形变得到形变后的目标子序列;施加外力构造PD控制器后生成最终子序列,将最终子序列与之前序列拼接生成编辑后的流体动画;可重复上述步骤得到最终流体动画。本发明能对流体动画进行任意多次的编辑,使其形状在指定的关键帧处符合用户施加的控制,操作可行且直观。
申请公布号 CN103489209B 申请公布日期 2016.05.18
申请号 CN201310401193.7 申请日期 2013.09.05
申请人 浙江大学 发明人 鲍虎军;黄劲;潘哲融
分类号 G06T13/20(2011.01)I 主分类号 G06T13/20(2011.01)I
代理机构 杭州求是专利事务所有限公司 33200 代理人 林怀禹
主权项 一种基于流体关键帧编辑的可控流体动画生成方法,其特征在于包含如下步骤:1)输入初始流体动画序列,指定一个需要编辑的关键帧K,对关键帧K处的流体形状进行预处理,首先对流体形状进行平滑化处理,将关键帧K处的流体形状采用隐式函数表示,然后抽取形状距离场φ和边界距离场φ<sub>S</sub>,将流体形状区域分为三种特征区域R;2)用户从流体形状的任意视角输入一个三维三角形面片,或者在屏幕上绘制一条二维曲线:对于用户输入的三维三角形面片,直接采样三维三角形面片的网格顶点,得到三维三角形面片的三维控制点集P<sub>M</sub>;对于用户绘制的二维曲线,在屏幕上采样一组采样点,将每个采样点X<sub>P</sub>与绘制视角的视点位置e连成射线,并建立如下公式1计算二维曲线的深度,即每个采样点X<sub>P</sub>的屏幕深度d<sub>S</sub>,然后将e+D<sub>X</sub>d<sub>S</sub>作为二维曲线的三维控制点集P<sub>S</sub>:<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mi>d</mi><mi>S</mi></msub><mo>=</mo><msub><mi>argmin</mi><mi>d</mi></msub><munder><mo>&Sigma;</mo><mrow><msub><mi>X</mi><mi>P</mi></msub><mo>&Element;</mo><mi>P</mi></mrow></munder><munder><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mrow><mi>p</mi><mo>*</mo><mo>&Element;</mo><mi>R</mi></mrow></munder><mi>d</mi><mi>i</mi><mi>s</mi><mi>t</mi><mrow><mo>(</mo><mi>e</mi><mo>+</mo><msub><mi>D</mi><msub><mi>X</mi><mi>p</mi></msub></msub><mi>d</mi><mo>,</mo><mi>p</mi><mo>*</mo><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000847450830000011.GIF" wi="1517" he="135" /></maths>其中,d为沿着射线方向的每一个采样点X<sub>P</sub>的所有可能深度,argmin<sub>d</sub>为d的参数极小化函数,min为值极小化函数,<img file="FDA0000847450830000015.GIF" wi="91" he="69" />为射线的方向,dist(a,b)为两点的距离函数,p<sup>*</sup>为特征区域R中任意一点的坐标;3)采用Levenberg‑Marquardt方法对以下公式2进行优化,得到形变速度场参数X,C,A,f,f<sub>0</sub>:<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><munder><mrow><mi>arg</mi><mi>min</mi></mrow><mrow><mi>X</mi><mo>,</mo><mi>C</mi><mo>,</mo><mi>A</mi><mo>,</mo><mi>f</mi><mo>,</mo><msub><mi>f</mi><mn>0</mn></msub></mrow></munder><mi>&Theta;</mi><mo>+</mo><msub><mi>&omega;</mi><mi>r</mi></msub><msub><mi>E</mi><mrow><mi>r</mi><mi>e</mi><mi>g</mi></mrow></msub><mo>+</mo><msub><mi>&omega;</mi><mi>l</mi></msub><msub><mi>E</mi><mrow><mi>l</mi><mi>a</mi><mi>p</mi></mrow></msub><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000847450830000012.GIF" wi="1365" he="119" /></maths>其中,Θ为用户控制匹配能量,E<sub>reg</sub>为施加外力极小化能量,E<sub>lap</sub>为形变光滑能量,ω<sub>r</sub>为外力极小化权重,ω<sub>l</sub>为形变光滑权重,C为速度模版中心,A为受力方向,f为优化得到的衰减系数,f<sub>0</sub>为用户指定的衰减系数;上述公式2中,用户控制匹配能量Θ采用如下的公式3进行计算:<img file="FDA0000847450830000013.GIF" wi="1299" he="231" />其中,X为流体模拟区域中任意一点位置坐标,<img file="FDA0000847450830000014.GIF" wi="66" he="54" />为用户指定的某个特征区域的距离函数,Adv为显式欧拉积分器,V为形变速度场,D<sup>‑1</sup>为逆向形变函数,N为移动次数,三维控制点集P为步骤2)中得到的三维三角形面片的三维控制点集P<sub>M</sub>或者二维曲线的三维控制点集P<sub>S</sub>;4)将优化公式2得到的形变速度场参数X,C,A,f,f<sub>0</sub>代入以下公式4得到形变速度场V,将形变速度场V的每个速度模版中心C沿着关键帧K的速度场移动w个时间步长得到修改后的速度场V',使用修改后的速度场V'对关键帧K进行形变得到形变后的关键帧K',其具体公式为K'=D(X),其中w为用户设定的序列长度,D为形变函数;<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><mo>{</mo><mtable><mtr><mtd><mrow><mi>V</mi><mo>=</mo><mo>&dtri;</mo><mo>&times;</mo><munder><mi>&Sigma;</mi><mrow><mi>i</mi><mo>&Element;</mo><mi>N</mi></mrow></munder><msub><mi>H</mi><mi>i</mi></msub><mrow><mo>(</mo><mi>M</mi><mo>,</mo><mi>C</mi><mo>,</mo><mi>A</mi><mo>,</mo><mi>f</mi><mo>,</mo><msub><mi>f</mi><mn>0</mn></msub><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mrow><msup><mi>V</mi><mo>&prime;</mo></msup><mo>=</mo><mo>&dtri;</mo><mo>&times;</mo><munder><mi>&Sigma;</mi><mrow><mi>i</mi><mo>&Element;</mo><mi>N</mi></mrow></munder><msub><mi>H</mi><mi>i</mi></msub><mrow><mo>(</mo><mi>M</mi><mo>,</mo><msup><mi>Adv</mi><mi>w</mi></msup><mo>(</mo><mi>C</mi><mo>,</mo><mo>-</mo><msubsup><mi>V</mi><mi>K</mi><mo>*</mo></msubsup><mo>)</mo></mrow><mo>,</mo><mi>A</mi><mo>,</mo><mi>f</mi><mo>,</mo><msub><mi>f</mi><mn>0</mn></msub><mo>)</mo></mrow></mtd></mtr></mtable><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000847450830000021.GIF" wi="1453" he="276" /></maths>其中,M为任意控制点,i为速度势函数的编号,H<sub>i</sub>为速度势函数,<img file="FDA0000847450830000022.GIF" wi="68" he="77" />为关键帧K的速度场,<img file="FDA0000847450830000023.GIF" wi="42" he="53" />为梯度算子;5)初始流体动画序列中根据用户设定的序列长度w确定子序列[K‑w,K],将子序列[K‑w,K]中每个关键帧j的流体形状沿着公式5形变,得到形变后的目标子序列:F(1‑j/w)V'  (5)其中,F为平滑插值函数;6)根据步骤4)得到的形变后的目标子序列,施加如下公式6中的外力f构造PD控制器,用PD控制器生成最终子序列:f=f<sub>shape</sub>+f<sub>velocity</sub>  (6)其中,f<sub>shape</sub>为形状匹配受力,f<sub>velocity</sub>为速度匹配受力,f<sub>shape</sub>和f<sub>velocity</sub>均为无散梯度场;7)将步骤5)中生成的最终子序列与第K‑w帧之前的初始流体动画的序列拼接,生成拼接后的流体动画;8)将拼接后的流体动画依次重复上述步骤1)~步骤7)进行不同关键帧的编辑,得到符合用户要求的最终流体动画。
地址 310027 浙江省杭州市西湖区浙大路38号