
工学問題は複雑な形状をメッシュで分割して計算に利用する事が多々あります。この記事では形状やメッシュデータを扱う事が得意なPyVistaを使って任意サーフェスを作成し、デローニー三角形分割によりメッシュを作成します。そしてその他ソフトでの活用を目標にSTLファイルとして保存する所までを紹介します。
こんにちは。wat(@watlablog)です。ここでは任意のサーフェスからメッシュを生成してSTL保存する方法を紹介します!
本記事の対象読者
Pythonで形状モデルを作成したい人
当ブログでも色々なプログラムを紹介していますが、Pythonは様々な工学的、科学技術的なライブラリが豊富にあります。
ここで言う形状モデルとは点や線、面や立体のデータを指します。通常これらの形状モデルはCADソフトを使って作成します。
CADソフトも大抵自動化のためのマクロ機能を有していますが、Pythonユーザからすると簡単なモデルであればPythonを使って生成した方が効率的と考えてしまいます。
CADソフトを外から自動化しようとするとGUIで操作していた機能を順番に指定して実行していくと思いますが、中には豊富な機能を持っているがゆえに動作が遅かったりします(もちろん既にCADソフトで標準化されている業務であれば、既存の汎用ソフトを自動化するメリットは大きいですが)。
Pythonで最低限の操作だけ実行するようにコーディングする事ができれば、省エネなコードになるというメリットがあります。
最近は個人で3Dプリンタを購入してDIYをしている人が増えてきました。形状モデルをSTLで作成すれば3Dプリンタ用のデータとなります。是非ご活用下さい。
PyVistaによるメッシングを覚えたい人
Pythonによる形状モデルの操作はPyVistaが大変便利です。
当ブログでは過去に「PyVistaをインストールしてPythonでSTLを扱う備忘録」や「Python/PyVistaでSTLモデルを座標変換してみた」という記事でPyVistaを使ってみましたので、こちらもご参考に。
これらの記事では主にモデルをBlenderで作成してからPyVistaで処理を行なっていました。今回はBlender等のソフトを使わずに形状を作成し、メッシング(メッシュを使って離散化する事)する事を学びます。
とは言え僕は1次情報である以下の開発者ドキュメントを参考にしてコードを書いています。まずはこちらを参照した方が良いでしょう。
外部リンク:PyVista公式ドキュメント
本記事の目標(図で説明)
任意のサーフェスメッシュを作成してSTL保存する…という記事ですが、具体的に何をするかを事前に書いて理解して頂く方が読者に優しい(Uターンされない)と思うので、ここで図を用いて説明してみます。
点列データを作成する
まずは点列データを3次元座標(x, y, z)で作成します。ここでは「PythonでNACA4桁翼の断面形状を作図する方法」という記事で描いた航空機の翼断面を使って作業をします。
今回は翼形状を奥行き方向に押し出してサーフェス(面)を作成しますが、閉じたサーフェスとするために上面(top)と下面(bottom)の2面を使う仕様とします。

点列データからスプラインを作成する
先ほど作成した点列データを使って滑らかなスプラインを作成します。…実はスプラインを使わなくても今回の目的は達成できそうだったのですが、せっかく覚えたのでPyVistaの練習としてコード内に残しました。
スプラインは点列の間隔を細かくする事によって詳細にカーブを表現する事が出来ます。最終的な面の仕上がりにも影響するので、今回のPythonコード内では細かさを調整できるようにしています。

外部リンク:PyVista:スプラインの作成
スプラインを押し出してサーフェス用の点列データを作成する
点列(ここでは閉じたサーフェスとしたいので点列で作成したプロファイル)をある方向に押し出して(Extrude)サーフェスを作る基礎とします。
後で三角形メッシュを使って面を分割するのですが、あまりにも押し出し長が長すぎると三角形1辺の比率が大きくなって品質の悪いメッシュになってしまいます。
そのため今回はDivisionsという変数を使って最大長を任意の分割数に分けるように作りました。

点列データに対してデローニー三角形分割を行う(メッシュの作成)
サーフェスの基礎となる点列データが作成できたら、次は面を貼ります。この後サーフェスデータはSTLファイル(三角形の面データで表現した3Dモデル)とするため、面を三角形で分割します。
三角形の分割アルゴリズムにはデローニー三角形分割(Delauney triangulation)が有名であり、今回はこの手法を使います(ドロネー分割とも呼ばれるけどどっちが一般的だろう??)。

外部リンク:PyVista:三角形サーフェスを作成
それでは早速Pythonでコーディングしてみましょう!
Pythonで任意サーフェスメッシュを作成してSTL保存するコード
動作環境
本記事のプログラムは以下の環境で動作を確認しています。
Windows | OS | Windows10 64bit |
---|---|---|
CPU | 2.4[GHz] | |
メモリ | 4[GB] |
Mac | OS | macOS Catalina 10.15.7 |
---|---|---|
CPU | 1.4[GHz] | |
メモリ | 8[GB] |
Python | Python 3.9.6 |
---|---|
PyCharm (IDE) | PyCharm CE 2020.1 |
Numpy | 1.21.1 |
pyvista | 0.31.3 |
全コード(コピペ用)
以下が全コードです。「def NACA()」関数は「PythonでNACA4桁翼の断面形状を作図する方法」で断面を作図した関数ですが、一部変更しています。
デローニー三角形分割はpyvista.delaunay_2dで行いますが、この関数はどうやらXY方向に拡がっている面に対して分割が実行されるようで、全体的に座標変換をしています。
サーフェスはNACA関数の「x_resolution」を大きくする事で細かくなります。
「def generate_surf_from_spline()」関数のlengthに押し出し長、divisionsに分割数を渡します。round_numはデータの四捨五入を調整します。
結果
実行するとグラフウィンドウが表示されますが、ウィンドウを閉じると「surf.stl」というSTLファイルがプログラム実行フォルダ直下に作られます。
PyVistaでSTLファイルを読み込んで確認する方法
作成したSTLファイルがちゃんとしているかどうか、確認してみましょう。
確認もPyVistaで可能です。以下のコードでSTLファイルを読み込んでメッシュの状態を確認してみましょう。
下図のように作成した形状が読み込まれればOKです。

今回はサーフェスデータをSTLに保存しましたが、次回記事は面を全て閉じたSTLにしようと思います。
おまけ:面を作成してSTLにするPythonコード(簡易版)
先ほどまではちょっと凝ったサーフェスデータを作っていましたが、ここでは簡単に平面を作ってSTLファイルに保存するサンプルコードを紹介します。
まとめ
本記事ではPyVistaというライブラリを使って点列に対してスプラインを作ったり、三角形メッシュを作ったり、STLファイルにしたりしました。
STLファイルを作る所は自前でやろうとするとテキストファイルで色々細かい指定をしなければならず、かなり骨が折れる作業と思います(理解のために一度やってみたいですが)。
普段はCA○IAとか使っているので、最初は「CUIでモデルを作成する」という事に少し抵抗を感じていましたが、このくらいの規模であればやってみるとそんなにストレスはありませんでした。
これもライブラリのおかげと思います。
数式から作成した形状を実際にSTLモデルにまでする事ができました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!