六月の開発局

「業界の人」じゃないよ

MODOの頂点の微妙な位置ずれを修正するためのスクリプト

filmassembler.com

ビルの破壊活動を続けているが、MODOでグリッドスナップを聞かせてモデリングしていても、なぜか知らないうちに頂点がマイクロメートル単位でズレで頂点の結合コマンドが同座標と認識せず、メッシュの閉鎖にえらい手間を用するという困難にさらされてきた。特にメッシュシャッターはメッシュが閉鎖されていなくても強引にブーリアン処理を行うため、結果が破綻する。

頂点の結合の範囲を広げてしまうとズレが放置されて事態の改善には向かわないのでどうしたものかと考えていたが、ちょっと適当にこういうのを書いたら動いてるっぽいので貼り付けておく。

import modo
mesh = modo.Mesh('mesh023')
vertices = mesh.geometry.vertices
number_of_vertices = len(vertices)
for index in range(number_of_vertices):
    vertices[index] = round(vertices[index].position[0] * 10) / 10, round(vertices[index].position[1] * 10) / 10, round(vertices[index].position[2] * 10) / 10  
mesh.geometry.setMeshEdits()

MODOスクリプトは初めて書いたので結果重視の仕上がりである。IntelliJからMODOスクリプトエディタに直接できたらいいのに。つまりMODOスクリプトエディタはその程度のパワーである。Emacsのカーソル移動コマンドが他のショートカットに奪われているので大変ストレスが貯まる。

このあと頂点の結合を走らせれば基本的にメッシュが閉鎖されるはずだ。が、頂点数が増えてくると頂点の結合はめちゃくちゃ重いので(7万頂点ぐらいでもダメである。だらしない)、スクリプト側で対処できそうならするつもりだ。しかし、リファレンスでmergeと検索しても結果がないのである。なんてことだ。

さて、メッシュも簡単に閉鎖できるようになったことだし、これでメッシュシャッターも正常動作、破壊がはかどるぞと喜びメッシュシャッターをかけた結果の画像をここに貼り付けておく。念のため書いておくが、メッシュシャッターの結果が破綻するのは、メッシュの閉鎖と無関係だった、ということである。どういう仕掛けと理屈で破綻しているのかわからないのがつらい。が、メッシュクリーンアップをかけるとメッシュの閉鎖が破綻し、このスクリプトも頂点の結合もできなくなるが、メッシュシャッターはちゃんと動作することがわかった。わけがわからないよ。もうちょっと追い詰めていこう。

f:id:TOYOZUMIKouichi:20170524002547p:plain