#こんにちは
簡単に自己紹介します。株式会社たき工房 のテックラボ という部署でプログラマーをしていて、インタラクティブなインスタレーションなどを作っています。個人ではTouchDesignerで映像制作やVJをしたり、HoudiniでCG制作をしています。(Twitter、instagram)
テックラボの制作事例
#前置き
先日TouchDesigner(以下TD)で生成したオブジェクトを3Dプリンターで印刷したいと思うことがありました。
カメラデータのCHOPから .blend、.fbx書き出しできた! pic.twitter.com/3Anldi7QpY
— Satoru Higa (@satoruhiga) November 18, 2020
人類はついにTouchDesignerから直でProRes書き出しができるようになった pic.twitter.com/5mm7WYxT1Q
— Satoru Higa (@satoruhiga) December 17, 2019
Blenderからhclassic書き出すプラグイン書いてる なかなか似てきた https://t.co/ewnesEv2Je
— Satoru Higa (@satoruhiga) November 21, 2018
TouchDesignerからUnityにチャンネルデータ書き出し、わりと汎用的な形でできた!!!https://t.co/LSBpUTe4I7
— Satoru Higa (@satoruhiga) September 10, 2018
比嘉さんのツイートを見て育ったので、以前からソフト間を横断したいという思いがあり、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の中身
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は以下です。
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