2007年11月28日星期三

生成等值面(Marching Cube)

看看文件的日期,最初的开始是21日,到现在又是一周了,才有了个初步的版本。
上周布置了一个活,让用Marching Cube算法实现在数据体中生成一个等值面的算法。听说这是上上届一位师兄毕业论文的内容,让我也照着实现一个。可后来发现找不到当初的代码了,没办法,只能自己动手。在UAF的网上课程中查到一份实现代码,接下来的工作就是看懂它然后应用到程序中来。我料到了开头,可是没有猜到过程会这么艰难。
MC算法的原理还比较简单,就是分析一个正方体体素八个顶点分别位于等值面外和内两种情况时的组合,根据这256种不同的情况生成体素内的三角形。在代码中用到了八叉树,用来保存等值面穿过的体素,为了理解这个结构,花了相当多的时间,一连几天都在研究这个算法,好不容易有点眉目了,巴巴地实现出来,结果被李博一针见血地指出每次生成的时候都要重新生成八叉树,虽然不一定每次都更新到整个树,但是考虑到其本身存储空间的开销,还是有点吃不消,真是备受打击。只好三下五除二把八叉树砍掉,原来1200多行的代码一下子砍的不到700行,其中约300行还是两个大的查找表。当初就是被这两个大表里面密密麻麻的冰冷的16进制数给吓住了。没有深入分析就去看八叉树了。后来发现其实里面的数据相当规律,就是在第一个表用01表示各个边是否被等值面截,然后到下一个表中找到相应的三角形组合方式。256种情况一一在目,要是让我自已写可能要多花几倍的功夫还不能保证穷尽所有情况。想到中科院自动化所田捷博士说的,图形学算法的特点就是容易理解,但是细节太烦琐。总结这一周的经验,对于网上下的源码的每一个部分,都应该吃透,不能留下死角,然后根据自己的实际需要,选择需要的部分,不能为了赶时间把整个块拿过来,期望它能够像一个黑盒似的工作正常。即使侥幸别人的代码写的不错,为了把其与自身代码结合所花费的改写时间也已经超出了读懂代码所要花费的时间了。

没有评论: