14年前做的一个NURBS Demo

最近整理文件,发现14年前的NURBS Demo居然在Win 7下还能很好运行,速度比当年快了很多。

当时研究在3D游戏中,采用NURBS建模的模型。根据相机与物体的位置,实时演算生成模型的三角形。 离相机远的部分,三角形就少,节省渲染时间,离相机近的就三角形多,细节更丰富些。说起来很理想,但实现起来有好几个难点:

  1. NURBS Trim的问题
    NURBS曲面中挖洞的方法是用NURBS曲线去描述这个洞,如何快速在游戏中实现是个难点。这是我当时主要攻关的问题。当时找出两个方法,一个是根据相机距离远近,及曲线不同段的曲率,不断调整切分Nurbs Trim曲线的不同段的粒度。一个是另辟蹊径,给3DS MAX开发了一个插件,能在编辑NURBS曲面时,同时生成一个合并了原有材质且带Alpha通道的高精度材质图片, 在Nurbs Trim 曲线以内的alpha通道都是透明的。
  2. NURBS编辑工具的问题
    当时公司用的NURBS编辑工具主要是3DS MAX,虽然是有较强的NURBS曲面编辑功能,但实际生成的NURBS曲面问题很多,远不如同期的Rhino,可Rhino当时对插件之类的二次开发支持又很不好。
  3. NURBS曲面在随着相机距离而调整模型的过程中,物体的边缘,会在屏幕上产生抖动感。
    这个问题相当难以克服,一直没能解决。

当时有宣传用NURBS的游戏,例如Quake3,其实它只是在建模中使用了NURBS,并没有做到实时的生成模型。当时整个游戏界对NURBS抱有很高的期望,有显卡公司想从硬件层面给予解决,但后来都没了消息,再后来也就没再关注这方面的进展,不知现在怎样。不过现在的显卡能力已经超强,不用NURBS技术,就靠堆三角形已经能实现近乎真实的画面效果了。

下面是Demo的两个截图,大家可以看到这个鸭子的三角形数量在两个图里是不同的。在同一个图中,鸭子不同部位切分的细节程度也是不同的, 整个鸭子上的三角形都是每帧都重新实时生成的。

当时为了搞这个,读了很多SIGRAPH,MSR,及各大学关于NURBS的论文,对自己提高帮助很大。

11-2

 

这个demo的下载链接是 http://www.nihuo.com/downloads/nv.zip

下载下来demo后解压,选择File ->Open, 打开NRB_DUCK.oo就能看到鸭子, 按下F键就能看到三角形的线框,按鼠标右键能旋转模型, 按<, >能调整模型切分的系数。更详细的可参看readme。屏幕左上角的tri是整个模型的三角形数量。因为主要是为了演示NURBS一些关键算法的效果,其他方面都很粗糙,还请见谅。

Nginx模块开发教程

做Nginx模块开发的时候,发现这方面的文档很少, 磕磕绊绊走了不少弯路。 过了两年,发现有点改善,但不算大。 昨天有人问能不能教他简单的Nginx开发入门,本想在网上给他找个教程的,结果没找到太合适的,于是干脆自己写了个简单的教程。主要是入门代码和一些资料的索引。有两个例子, 一个是Hello World, 就是访问URL显示Hellow World, 一个是Hello World Text, 就是可以通过配置文件来定义显示的欢迎信息。 教程地址是 https://github.com/nihuo/Nginx-Module-Development-Tutorial。 看完这个教程应该就会知道如何开始写Nginx模块,如何解析参数,如何输出。

这个教程是给Nginx模块开发的初学者的。其实我自己也是个初学者,之前正式开发过的模块只有两个,是抱着和大家一起学习的态度写这个教程的。 尝试分享给别人其实也是自己整理旧知识学习新知识的很好过程, 发现了不少自己以前认识错误的地方,狂汗。 当然,现在写的例子,估计问题还是不少,算是抛砖引玉,欢迎大家多多批评指教。

以后有空的时候还会再添加例子,也欢迎大家来编辑添加。 Nginx不只是个Web Server,其实是个很好的高性能服务器二次开发平台, 希望能通过这个教程让更多人认识Nginx巨大的二次开发潜力。

整个教程是用英文写得,为了锻炼自己的英文,可能会让英语大牛们贻笑大方,笑过后,不妨耐心指正,将不胜感激。