STLファイルとは何か

はじめまして、Monovationのシステム開発担当の田力と申します。本日から、3Dデータ処理関係の内容を中心とした技術ブログを始めたいと思います。どうぞよろしくお願いいたします。

第一回目の今日は、3Dプリンタへのデータ入力の標準フォーマットとなっているSTLファイルについて取り扱いたいと思います。

STLは、米3D Systems社が開発した三次元形状を表現するためのデータ形式です。STereoLithography(= 光学造形法)をその名前の由来としますが、現在ではStandard Triangulated Languageの頭文字として認識されていることが多いと思います。

STLでは、三次元形状を三角形ポリゴンの集合として表現します。三角形ポリゴンとは、空間座標上の三つの頂点と法線ベクトル(面に垂直な単位ベクトルで、面のどちらが表なのかを示すのに使われる)により定義される面情報で、STLではファセットと呼ばれます。

このファセットをたくさん組み合わせることで、あらゆる三次元形状を表現することができます。また、一つのファセットのサイズを小さくすることで、ファイルサイズや処理コストは大きくなりますが、より緻密な表現が可能になります。

ただし、ファセットは厚みのないただの面ですので、それを組み合わせて作った三次元形状は、厳密には表面しか定義されていないスカスカの物体(サーフェスモデル)ということになります。そこで、3Dプリンタ付属のスライサーソフトでは、複数のファセットによって閉じられた空間は中身が詰まっているとみなして造形を行います。ファセット間に隙間があったり、(法線ベクトルの方向が逆で)裏表が逆の場合は閉じた空間にならないので通常エラーが出ますが、自動的に修正してくれるソフトもあります。

それでは、実際にSTLファイルの中身を見てみましょう。実は結構単純です。(STLファイルにはASCII形式とバイナリ形式がありますが、ここでは読みやすいASCII形式のものを見ていきます。)

こちらは、ページトップの写真にも使われている、弊社のマスコットキャラクター、パルチーノのSTLファイルの一部です。

最初の行は

で始まります。名前は省略可能です。

二行目以降にファセットをその数だけ定義します。

facetの右のnormalは法線を意味し、法線ベクトルを位置ベクトル表記で指定します。

outer loopの中の三つのvertexにはファセットを構成する三つの頂点の座標を指定します。vertexの順番は重要で、A→B→C→Aの方向に面を回転させたときに、ねじが進む方向が表であると定義されます。(右ねじの法則)

それぞれの値には浮動小数点のe指数表記を使用します。長さの単位はSTLとしては規定されておりませんが、mm単位で扱うソフトウェアが多いと思います。また、インデントは必須ではありませんが、見やすいように付けておいた方が良いでしょう。

最終行に

を挿入して、データの終わりを示します。

鋭い方は、三つの頂点とその順番が与えられたら、法線ベクトルは自動的に決まるだろうと思われるかもしれませんが、実はその通りで、STLファイルの法線ベクトルに関する記述は冗長です。多くのソフトウェアでは、normalの部分は無視して三つの頂点から自動的に再計算するようです。(一部のソフトウェアでは、normalの部分をシェーディング処理に利用することもあるようです。)

ちなみに、三つの頂点から法線ベクトルを計算するには、外積を使うと便利です。

$$ \overrightarrow{ Normal } = \frac{ \overrightarrow{ CA } \times \overrightarrow{ CB } } { \sqrt{ | \overrightarrow{ CA } \times \overrightarrow{ CB } | } } $$

最後に、STLで表現ができて、3Dプリンタで造形できる、(おそらく)世界で一番単純な立体である四面体を手書きで作成してみたいと思います。

Windows10付属の3D Builderで確認すると、確かに四面体になっています。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です