最近整理文件,发现14年前的NURBS Demo居然在Win 7下还能很好运行,速度比当年快了很多。
当时研究在3D游戏中,采用NURBS建模的模型。根据相机与物体的位置,实时演算生成模型的三角形。 离相机远的部分,三角形就少,节省渲染时间,离相机近的就三角形多,细节更丰富些。说起来很理想,但实现起来有好几个难点:
- NURBS Trim的问题
NURBS曲面中挖洞的方法是用NURBS曲线去描述这个洞,如何快速在游戏中实现是个难点。这是我当时主要攻关的问题。当时找出两个方法,一个是根据相机距离远近,及曲线不同段的曲率,不断调整切分Nurbs Trim曲线的不同段的粒度。一个是另辟蹊径,给3DS MAX开发了一个插件,能在编辑NURBS曲面时,同时生成一个合并了原有材质且带Alpha通道的高精度材质图片, 在Nurbs Trim 曲线以内的alpha通道都是透明的。 - NURBS编辑工具的问题
当时公司用的NURBS编辑工具主要是3DS MAX,虽然是有较强的NURBS曲面编辑功能,但实际生成的NURBS曲面问题很多,远不如同期的Rhino,可Rhino当时对插件之类的二次开发支持又很不好。 - NURBS曲面在随着相机距离而调整模型的过程中,物体的边缘,会在屏幕上产生抖动感。
这个问题相当难以克服,一直没能解决。
当时有宣传用NURBS的游戏,例如Quake3,其实它只是在建模中使用了NURBS,并没有做到实时的生成模型。当时整个游戏界对NURBS抱有很高的期望,有显卡公司想从硬件层面给予解决,但后来都没了消息,再后来也就没再关注这方面的进展,不知现在怎样。不过现在的显卡能力已经超强,不用NURBS技术,就靠堆三角形已经能实现近乎真实的画面效果了。
下面是Demo的两个截图,大家可以看到这个鸭子的三角形数量在两个图里是不同的。在同一个图中,鸭子不同部位切分的细节程度也是不同的, 整个鸭子上的三角形都是每帧都重新实时生成的。
当时为了搞这个,读了很多SIGRAPH,MSR,及各大学关于NURBS的论文,对自己提高帮助很大。
这个demo的下载链接是 http://www.nihuo.com/downloads/nv.zip。
下载下来demo后解压,选择File ->Open, 打开NRB_DUCK.oo就能看到鸭子, 按下F键就能看到三角形的线框,按鼠标右键能旋转模型, 按<, >能调整模型切分的系数。更详细的可参看readme。屏幕左上角的tri是整个模型的三角形数量。因为主要是为了演示NURBS一些关键算法的效果,其他方面都很粗糙,还请见谅。