左康波

业余文艺cg场景模型师

Houdini - 计算模型体积 过滤问题模型

  |  
 阅读次数

**

前言

  例如在盒子模型中,并不是全部都是盒子,有部分只是面片,如何检测出这些多余的部分呢?
  我想了一下,想起了Houdini的measure节点,直接计算模型体积进行过滤就OK了

**

Houdini - 计算模型体积 过滤问题模型

批量遍历模型 过滤体积小的部分

measure节点

  然而事情并没有我想象的那么顺利。
  我们这边的模型是一堆box
  如果直接连接measure节点,会根据模型上的每个面进行体积计算

  我需要的是对单个模型进行计算。
  然而如此循环遍历单个模型呢?
  我最开始是想用类似破碎的方案,直接加入assemble节点打包,
  循环遍历所有的物体。
  然而这样根本就计算不出体积。

  因此我想到所有的box都丢进循环中
  最开始也不知道怎么操作,测试了一下就是弄好出来了
  添加connective节点将所有的模型面编号统一输出一个class属性,Houdini 16.5 的foreach节点自带相关操作了。

  后面就是怎么计算体积了
  毕竟总不能去计算每一个面
  这里我想起了voronoi的时候的isoOffset节点
  通过那个节点可以将模型转成雾
  如此一来就可以计算体积了

  但是这样输出没有模型
  过滤就没办法操作
  于是我想到使用attribute transfer将体积属性传递给原模型
  最后再用delete节点对模型进行过滤,就可以找到box模型中有问题的部分。

总结

  其实很简单的操作,本来还想着用Maya Python实现的,想到Houdini Measure节点就懒得写了。
  最后发现Houdini的坑也不少。
  不过目前也攻克了。
  后面我找了一下,发现Maya可以使用 computePolysetVolume 命令计算体积
  但是这个命令只能用MEL执行
  于是又在网上查了一下,原来Python也可以执行MEL,那就不必担心。链接

根据面数过滤模型

  关于寻找问题模型的方法,又有了新的思路
  鉴于问题模型一般都是一个到两个面的面片,我可以计算片面数对模型进行过滤。
  思路是很清晰的,但是我却被 connective 节点生成的class属性给难住了。
  我是希望通过计算class数字相同的情况出现的次数,如果出现次数比较少,就进行过滤。
  但是这个操作非常难以实现,最主要的原因在于 wrangle 节点
  wrangle 中的primitive遍历会注意遍历每一个面片执行wrangle中的代码
  这样根本就没有办法将相关的变量累加起来。
  于是在这个死循环中写了很多无谓的代码进行测试。

  最后我发现,用foreach节点可以有效地将所有的模型分离出来。
  这样只要直接根据面数过滤相关的模型即可。

隐藏