计算重心坐标的方法有很多种,我之前一共研究了4种重心坐标。分别是Mean Value Coordinates(MVC), Positive Mean Value coordinates(PMVC), Harmonic Coordinates(HC), Green Coordinates(GC).
在研究生的开题报告中,我对重心坐标写了一个综述。并在李老师的指导下分别对四种重心坐标性质以及在网格编辑的应用中做了详细的比较。下面我们分别对四种重心坐标在网格编辑中的不同之处以及效果图进行描述。
Mean Value Coordinates(MVC)
在第二个ruby中可以看出腿部有不正确的变形。MVC的优点是计算简单,缺点是重心坐标有负值。
Positive Mean Value coordinates(PMVC)
是在MVC的基础上进行了改进,保证了重心坐标的非负性。而且利用GPU的优势来进行计算得到更短的计算时间。
在第三个星星中可以看出出现了褶皱,也就是说PMVC不能保证重心坐标的光滑性。
PMVC的GPU计算过程是由师弟Cookies完成的,很幸运以后还可以在同一个公司上班,呵呵。
Harmonic Coordinates(HC)
采用了非常优雅的方式来计算,需要超乎寻常的计算时间,也使我的代码写了近三个月的时间,成为了我最深刻的回忆。
HC最关键的地方就是对Cage进行体素化。关于体素化就是说把空间中的面用一个个小立方体来表示。类似于我们在平面上对三角形进行扫描转换,但是其算法已经不再适应。下图为体素化的结果。
看起来效果不是很好,那是我的画图函数没有设置好,主要是在CGAL的那个框架下改的。另外体素化过程很容易让人想到有限元,后面也确实是有人用有限元来计算重心坐标。
Green Coordinates(GC)
是我最喜欢的重心坐标。其优点是加入了顶点和面的法向,GC的计算过程也让我纠缠了很长时间。后来有幸在中大的图形学会议上认识了文章的作者David Levin,一个很好的人,我在心里一直都是很敬佩学数学的人的。
第五个图可以看出GC把形状保持得最好!主要是看那些小突起的朝向,呵呵~
关于重心坐标的部分上面就介绍完了。在这些坐标的计算过程中其实有个最大的障碍就是Cage的获得。其实从上面贴的图大家也可以看出来,模型比较少,Cage也是比较简单的。其实我弄不到模型,更不好弄Cage。后面实在是被逼得没有办法了,和文哥一起给MVC的作者Scott Schaefer写了信。记得当时我们的第一话就说自己是来自大洋彼岸的中国学生,希望他给予帮助之类的,呵呵,好搞笑。没想到晚上10点多写的信,还没到第二天早上就收到了回信。真是个好人啊,从那以后我就更加大胆地给其他论文的作者写信了。不过我从来都没有要到过代码,都得靠自己动手写。唉~~痛苦啊。虽然Scott Schaefer给了我们两个模型的Cage,但是在很多时候还是不够用的,而且他的Cage有点近似于完美。那段时间里,一直都在郁闷,怎么生成Cage呢?还好有拼命三郎般的Cookies,自学3ds Max做好了Dinosaur和Hand的Cage。
其实在做重心坐标的时候很懵懂的,根本就不知道自己在做些什么,做了这些又有什么用。李老师说只是实现别人的论文,然后再去追踪别人的成果,是很没有前途的。事实也验证了这个他的这个观点。在继GC之后出现了一大批计算重心坐标的论文,并出现了好多重心坐标的应用。比如Michael S.Floater就一直在坚持改进MVC,GC的作者Yaron Lipman就一直在创新GC,并扩展了其他应用。新秀Mirela Ben-Chen的成果更是让我惊叹。在这种种情况之下,我也只有选择自动生成Cage来做了。