今天改进了Hessian各块的计算代码,减少了一些内存操作。下一步准备把模拟平台与Maya结合,这样就可以利用Maya丰富的变形算法了。
这一步需要考虑以下问题:1.把场景设置为某一帧。这一点可以用Mel脚本实现,命令是 currentTime 帧号
2.把表面网格转成体网格。这一点比较难做,因为表面网格不一定封闭。
有两种思路: 根据一堆点生成体网格,同时原来的点作为体网格的部分顶点
原来的输入点“泡”在体网格中,但是可以直接通过这些点反求体网格的一部分顶点。
第一种思路似乎比较靠谱,因为第一种解出来的体网格顶点不一定稳定。
3.有限元模拟过程。
暂时的设想是,写一个mel脚本,每次设置一个关键帧,同时获取此时网格顶点(也就是体网格部分顶点)位置,求出自由参数后设置对应参数的关键帧。
求解过程中需要多次设置自由参数的值,获取此时网格的顶点位置。可以写两个节点(Locator类型?),一个存自由参数数组,另一个接收网格顶点。
模拟的过程中,设置第一个节点的值之后,尝试读取第二个节点的网格,以此驱动Maya自动求值。
总的伪代码可能如下:
for (int frame = 0; frame < n; ++frame){ currentTime frame; 更新位置、速度、加速度 求解当前的参数值,这个过程中需要反复设置参数节点,反复获取网格位置。这一步估计需要写成一个MEL命令。 设置参数节点对应参数的关键帧}
一个问题就是需要验证MEL命令执行的过程中Maya节点求值机制是否可以反复进行,这样才有可能反复对设置参数、对节点求值。
这一点我觉得是可以的,每次读取网格顶点,背后便是Maya对相关节点进行求值。