前言

  今年暑假,我们接了一个大的Three.js项目,主要负责搭建海心沙、花城汇、流花展馆的模型,放到网页上,为物业查看租客信息提供便利。
  网页上的模型就只能要求低模,面数不能太高,否则就会造成运行卡顿,下载缓慢的问题。
  硕大的花城汇,工作量真的是巨大无比,不过客户为我们提供了CAD图纸,我们还是能省下一丢丢功夫的。
  理论上,通过图纸,我们可以将图纸的曲线挤压出模型,大大减轻我们从零建模的工作量。
  但是实际的情况比想象中还要麻烦。

CAD图纸的问题

  鉴于Maya的CAD图纸对接不是特别好,导入经常会陷入假死的状态,我们的模型团队最后采用了3dsMax来完成这个重任。
  不过我们毕竟是学动画的,还是Maya玩得熟悉。
  所以最后模型还是汇总到Maya上进行最终的处理。
  而Maya上的模型是这个样子的。

Maya模型

  看前来好像也没啥毛病呀!
  但是放大看就知道问题不是一点半点的麻烦。

CAD图纸挤压

  模型正如CAD图纸一样,中间的墙体都是镂空的,而且根据曲线挤压的面不是很正常,经常多个点、面重合在一起。
  我们花了大半个暑假,每天都在修复模型的墙体镂空问题。
  这个活真是累死人,毫无技术含量,但是却又非常费时。
  为此,我也一直想帮模型团队减轻工作压力,也在之前使用过Houdini研究过解决这个问题的方法。
  (在这个过程中我还开发了面片自动匹配的插件以及自动成盒的插件,一切为了让建模团队的不再爆肝)

Houdini解决方案

VDB方案初探

  面对这个问题,学习过Houdini破碎的我,最先想到了VDB的方案。
  VDB可以根据物体的密度体积重新生成新的模型。
  而这需要用到 VDB from polygon 来解决。

VDB体积丢失

  然而可以看到这个方案的结果是有些比较细小的面片就会消失,而且参数很难调整到一个比较适合的区域。
  所以这个方案并不能两全。
  最后我就放弃了VDB流程。

布尔方案

  后面我也想到了布尔的方案,只要有模型中心的面片,就可以挤出新的墙体了。
  然而因为模型有很多墙体不是闭合的,布尔之后的模型也无法提取出内部的面片。

模型不闭合

  当时和模型团队一商量,还不如手动修补来得快。
  所以后面我就没有继续研究这个问题,花城汇的全部模型多交给了模型团队去修补。
  但是这个情况延续到开学之后就不同了,模型团队要上课要做作业,根本就没有这么多时间来处理这些问题。
  为了妥善解决这个问题,我又开始深入研究如何用Houdini解决这个问题。
  我还问了师兄,不过并没有好的方案,只能说用代码来解决问题。
  我就只好自己去探索Houdini的功能了。

模型投射方案

  后面我想能否获取到模型投射的面片,通过投射的面片面积进行挤出,那么也能生成实体的墙体。
  这个方案我首先想到了ray节点,即将模型投射到平面上的方法。

ray处理 线框模式

  调整了参数之后,可以看到模型已经成功压成了平面了。但是…

ray处理 实体模式

  模型的镂空还是存在,甚至连面片都没有。
  于是我继续寻找Houdin和投射相关的操作节点,我发现很多和Maya一样,是属于NURBS处理,需要曲线进行操作的。

  在误打误撞中,我发现了triangulate2d 节点。
  这个节点也可以实现平面投射。
  调整了参数之后就可以投射出相应的面片

triangulate2d 投射

triangulate2d 投射

  通过计算模型的面积,将大面积的部分去除。

删除大面积的面

  这样虽然已经非常接近终点了,但是还是留下了一些遗憾,面积的选择范围是在太难控制了,弄不好就会删多或者删少了。

  虽然失败了,但是我还是没有死心,我觉得 triangulate2d 还可以再战500年。
  于是我发现它还可以实现ray节点的效果,然并卵而已。

triangulate2d 实现的投射效果

  最后我还是放弃了投射的方案。

VDB再探

  我再次探索VDB是因为我发现VDB的线框正是我所需要模型结构。

VDB 线框模型

  虽然VDB的线框膨胀了,但是确实是我想要的效果,这种精简的线框效果是网页模型很必要的。
  于是我又开始研究VDB的转换了。
  在不断的测试中,我发现了VDB topology to sdf

  我当时还不知好歹地想,我靠怎么转VDB了,这面数让人难受啊。
  其实后面才发现,这个节点不是正好解决了VDB体积消失的问题吗(:з」∠)
  这个发现是很让人兴奋的,虽然布线密集了点。(这个问题正是解决我们问题的关键!!!)

  不过这个转化也是有缺点的,那就是体积会发生膨胀。

VDB 膨胀对比

  如何解决这个问题,其实只需要提高上面VDB的生成精度即可,但是内存就会爆发式地上涨。

VDB 转化的持续吃内存

VDB 膨胀减少了

  通过这个方法虽然吃光了我手提电脑的8G内存,但是可以证明这个问题是可以解决的。
  后面只要将这个VDB模型转成多边形就可以了。

  最初我是想到了convert这个节点,但是没想到这个模型转换异常巨大,我借用模型团队的台式电脑。16G的内存都不够用。
  后来我研究了一下,发现convert VDB 节点调整了参数之后可以生成较为可以可用的模型。

VDB 转 polygon

  如此一来后面的操作都呼之欲出了,生成一个面片与VDB生成的polygon进行布尔。
  后面再通过布尔产生面片挤出模型,在后面就是降低面数就解决所有的问题了。

布尔面片

  通过布尔生成组将多余的面删除掉。

删除多余的面

  通过transform 挤出多边形

挤压墙体

  这个流程下来,基本上就把所有的事情都弄好了。
  后面只需要到Maya里面做些修修补补的工作。
  工作效率真的提升了数十倍。

总结

  自己去探索Houdini的过程是非常有趣的,不过自己也是幸运的,通过VDB流程找到了突破口。
  以后这种CAD图纸再不同担心构建困难了。
  不过说来说去还是因为我们对CAD不熟悉,理论上CAD是可以完成这个操作的。