頂点融合するスクリプトを作ってみた
2010年07月30日(Fri)
たとえばHexagonでSoftenツールを使ってなだらかにするとき、面に切れ目が入っているとその部分の切れ目が広がってしまう。

また、Soft Selectionを使うと選択範囲は切れ目をまたがないので、パーツの境界付近を選択すると段差が生じてしまうことになる。

で、同一位置の頂点融合を行うPythonスクリプトを作ってみた。

こんな感じ。
Poser上では面の切れ目に境界線が入るけど、スクリプトを実行すると境界線がなくなる。もちろんポリゴングループを統一したり、普通に頂点融合を行うだけならPoserの操作でできる。けど、一度融合したジオメトリを、元の頂点順序を再現して再分割するのは普通じゃできない。なので、それをスクリプトでやってみようと。
まあ、Windows使ってる人には意味のない話(笑)。
スクリプトを実行すると融合か分割か処理を訊いてくる。

頂点融合の場合はファイルを一つ選択。Wavefront OBJ形式しか読み込まないので注意。

無事に読み込めると同位置頂点を検索し始める。頂点数によってはものすごく時間がかかる。で、上手いこと処理ができると新しい小道具が作成されて、ついでに書き出すかどうか訊いてくる。いいえを選んで後から出力しても同じ。

ちなみに融合は完全に同じ位置に頂点がないと行われない。
で、融合後のジオメトリをモデラか何かで編集する。もう一回元の分割状態に戻すには、融合前のジオメトリと融合後のジオメトリの二つが必要になる。

メニューで再分割を選ぶ。

最初に分割前のジオメトリを、続けて融合後のジオメトリを選択する。

ファイルを読み込むと同位置頂点の検索を始める。やってることは融合時と同じなので、時間も同じ以上にかかる。検索の結果、融合後のジオメトリと頂点数が一致しないとエラーになる。で、再分割ができたら同じようにジオメトリを出力するかどうか尋ねてくる。

同位置頂点の判定をものすごく単純な力技で検索しているので、頂点数が増えれば増えるほど処理時間は指数関数的に増えていくことになる。その間Poserは止まってしまうので、うっかり大きなファイルを処理すると怖いことになる。とりあえず同梱のサンプルでテストして、自身の環境でどれぐらいの時間がかかるのか確認した方がいいと思う。ちなみにウチのPoser Mac G5 2.5 dualだと6598頂点のファイルで5秒ぐらい、1万2千頂点の自作シャツのジオメトリだと30秒以上かかる。3万足らずのジオメトリで2分ぐらい。
あと、Poser 7のSR2以前だと、Pythonでの読み込みにコケるので推奨しない。また、Windows版はShift-JISでダイアログを出力するようにしてみたけど、文字化けした場合は自力でUTF-8に直すか無視してもらえたらと思う。動作上は化けてても特に支障はない。
で、イマイチおおっぴらに配るには自信のないシロモノなので、こっそりとこちらに置いておく。
Python_WeldDivideVertices.zip (352kB)