前言
今年暑假,我们接了一个大的Three.js项目,主要负责搭建海心沙、花城汇、流花展馆的模型,放到网页上,为物业查看租客信息提供便利。
网页上的模型就只能要求低模,面数不能太高,否则就会造成运行卡顿,下载缓慢的问题。
硕大的花城汇,工作量真的是巨大无比,不过客户为我们提供了CAD图纸,我们还是能省下一丢丢功夫的。
理论上,通过图纸,我们可以将图纸的曲线挤压出模型,大大减轻我们从零建模的工作量。
但是实际的情况比想象中还要麻烦。
CAD图纸的问题
鉴于Maya的CAD图纸对接不是特别好,导入经常会陷入假死的状态,我们的模型团队最后采用了3dsMax来完成这个重任。
不过我们毕竟是学动画的,还是Maya玩得熟悉。
所以最后模型还是汇总到Maya上进行最终的处理。
而Maya上的模型是这个样子的。
看前来好像也没啥毛病呀!
但是放大看就知道问题不是一点半点的麻烦。
模型正如CAD图纸一样,中间的墙体都是镂空的,而且根据曲线挤压的面不是很正常,经常多个点、面重合在一起。
我们花了大半个暑假,每天都在修复模型的墙体镂空问题。
这个活真是累死人,毫无技术含量,但是却又非常费时。
为此,我也一直想帮模型团队减轻工作压力,也在之前使用过Houdini研究过解决这个问题的方法。
(在这个过程中我还开发了面片自动匹配的插件以及自动成盒的插件,一切为了让建模团队的不再爆肝)
Houdini解决方案
VDB方案初探
面对这个问题,学习过Houdini破碎的我,最先想到了VDB的方案。
VDB可以根据物体的密度体积重新生成新的模型。
而这需要用到 VDB from polygon 来解决。
然而可以看到这个方案的结果是有些比较细小的面片就会消失,而且参数很难调整到一个比较适合的区域。
所以这个方案并不能两全。
最后我就放弃了VDB流程。
布尔方案
后面我也想到了布尔的方案,只要有模型中心的面片,就可以挤出新的墙体了。
然而因为模型有很多墙体不是闭合的,布尔之后的模型也无法提取出内部的面片。
当时和模型团队一商量,还不如手动修补来得快。
所以后面我就没有继续研究这个问题,花城汇的全部模型多交给了模型团队去修补。
但是这个情况延续到开学之后就不同了,模型团队要上课要做作业,根本就没有这么多时间来处理这些问题。
为了妥善解决这个问题,我又开始深入研究如何用Houdini解决这个问题。
我还问了师兄,不过并没有好的方案,只能说用代码来解决问题。
我就只好自己去探索Houdini的功能了。
模型投射方案
后面我想能否获取到模型投射的面片,通过投射的面片面积进行挤出,那么也能生成实体的墙体。
这个方案我首先想到了ray节点,即将模型投射到平面上的方法。
调整了参数之后,可以看到模型已经成功压成了平面了。但是…
模型的镂空还是存在,甚至连面片都没有。
于是我继续寻找Houdin和投射相关的操作节点,我发现很多和Maya一样,是属于NURBS处理,需要曲线进行操作的。
在误打误撞中,我发现了triangulate2d 节点。
这个节点也可以实现平面投射。
调整了参数之后就可以投射出相应的面片
通过计算模型的面积,将大面积的部分去除。
这样虽然已经非常接近终点了,但是还是留下了一些遗憾,面积的选择范围是在太难控制了,弄不好就会删多或者删少了。
虽然失败了,但是我还是没有死心,我觉得 triangulate2d 还可以再战500年。
于是我发现它还可以实现ray节点的效果,然并卵而已。
最后我还是放弃了投射的方案。
VDB再探
我再次探索VDB是因为我发现VDB的线框正是我所需要模型结构。
虽然VDB的线框膨胀了,但是确实是我想要的效果,这种精简的线框效果是网页模型很必要的。
于是我又开始研究VDB的转换了。
在不断的测试中,我发现了VDB topology to sdf
我当时还不知好歹地想,我靠怎么转VDB了,这面数让人难受啊。
其实后面才发现,这个节点不是正好解决了VDB体积消失的问题吗(:з」∠)
这个发现是很让人兴奋的,虽然布线密集了点。(这个问题正是解决我们问题的关键!!!)
不过这个转化也是有缺点的,那就是体积会发生膨胀。
如何解决这个问题,其实只需要提高上面VDB的生成精度即可,但是内存就会爆发式地上涨。
通过这个方法虽然吃光了我手提电脑的8G内存,但是可以证明这个问题是可以解决的。
后面只要将这个VDB模型转成多边形就可以了。
最初我是想到了convert这个节点,但是没想到这个模型转换异常巨大,我借用模型团队的台式电脑。16G的内存都不够用。
后来我研究了一下,发现convert VDB 节点调整了参数之后可以生成较为可以可用的模型。
如此一来后面的操作都呼之欲出了,生成一个面片与VDB生成的polygon进行布尔。
后面再通过布尔产生面片挤出模型,在后面就是降低面数就解决所有的问题了。
通过布尔生成组将多余的面删除掉。
通过transform 挤出多边形
这个流程下来,基本上就把所有的事情都弄好了。
后面只需要到Maya里面做些修修补补的工作。
工作效率真的提升了数十倍。
总结
自己去探索Houdini的过程是非常有趣的,不过自己也是幸运的,通过VDB流程找到了突破口。
以后这种CAD图纸再不同担心构建困难了。
不过说来说去还是因为我们对CAD不熟悉,理论上CAD是可以完成这个操作的。