5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TouchDesigner Advent Calendar 2020

Day 17

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

Last updated at Posted at 2020-12-18

#こんにちは
簡単に自己紹介します。株式会社たき工房 のテックラボ という部署でプログラマーをしていて、インタラクティブなインスタレーションなどを作っています。個人では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でやりました。

スクリーンショット 2020-12-18 090630.png

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?