【TouchDesigner】SOPをボタン一つでSTLファイルに変換する


こんにちは

簡単に自己紹介します。株式会社たき工房 のテックラボ という部署でプログラマーをしていて、インタラクティブなインスタレーションなどを作っています。個人ではTouchDesignerで映像制作やVJをしたり、HoudiniでCG制作をしています。(Twitterinstagram
テックラボの制作事例

前置き

先日TouchDesigner(以下TD)で生成したオブジェクトを3Dプリンターで印刷したいと思うことがありました。

比嘉さんのツイートを見て育ったので、以前からソフト間を横断したいという思いがあり、TDからSTLを書き出すことに挑戦しました。
今回は3Dデータの編集・変換ができるフリーのソフトウェア、Meshlabを使います。
コマンドラインから実行できるので、TD上のPythonで操作してみます。

サンプル

ここにあります↓
SOPconvertSTL.tox

本題

流れは以下の通りです。

①Meshlabをインストールする
2020.12からMeshlabserver.exeがなくなったので、2020.7を使っています。
Meshlab-2020.07 - GitHub

②SOPをobjファイルに書き出す
TDのフォーラムでtoxを見つけました。デフォルトで書き出せてもいいのになと思います。
SOPのTypeをPolygonにして繋ぎます。
custom .OBJ exporter

③書き出したobjをMeshlabで読み込み、STLに変換する
ここをPythonでやりました。

Meshlabserver.exeまでの絶対パスと、書き出し時のファイル名を入力してConvertを押すと繋いだSOPのSTLファイルが、TDと同じ階層に作られます。

Pythonの中身

convert_to_STL.py
import os
import subprocess

def convert2stl(meshlabserverexe, input_file, output_file):
    cd = os.getcwd()
    output_path = os.path.join(cd, output_file)
    command = meshlabserverexe + " -i " + input_file + " -o " + output_file
    print(command)
    subprocess.Popen(command)

MeshLabによる3Dデータ変換をCUIで実行する
この記事によると、Meshlabserver.exeのパスが通った状態でコマンドラインで
meshlabserverexe -i input_file -o output_file
を叩くと変換できます。

TDでコマンドラインを叩く方法はこちらを参考にしました。
TouchDesignerからopenFrameworksアプリを実行する(Windows)
subprocess.Popen()commandを渡します。

以上がMeshlabをコマンドラインから叩いて、STLファイルに書き出す部分です。

Convertを押すと実行されるPythonは以下です。

EXPORT.py
import os
import tempfile
import convert_to_STL
import time

fd, tmp = tempfile.mkstemp(suffix='.obj')

try:
    op('OBJ').save(tmp)
    exe = parent().par.Meshlabserverexe.eval()
    output_file = parent().par.Output.eval()
    convert_to_STL.convert2stl(exe, tmp, output_file)
    print("Convert " + output_file)
    time.sleep(1)

finally:
    os.close(fd)
    os.remove(tmp)
    print("Done")

入力したSOP.objとして一時ファイルに保存しておき、先程の関数に渡しています。

コマンドラインを叩いてMeshlabが一時ファイルを読み込むより先に、Pythonの処理が進んで一時ファイルが消えてしまうので、tmpを消す前に1秒処理を止めるようにしています。

参考にした記事

Meshlab スクリプトによるメッシュフィルター操作を自動化する方法

おまけ

毎年M-1の予選の動画を見て、決勝進出者を予想しているのですが、今年は難しかったです。

この2組が面白かったのでぜひ見てみてください!
タイムキーパー 2回戦(5分46秒から)
https://youtu.be/GaYd0l6_ai0
エンペラー 準々決勝
https://youtu.be/_O-Wy5oDruY