3Dプリンタに使われるSTLファイルを地理院地図3Dと併せてマスターする
目次
はじめに
ネットから3Dプリントが可能*1になるなど、ふつうの人でも3Dプリンタを使ったものづくりが可能になりつつあります。その際には、
- 3次元設計ソフトなどでデザインする
- その3次元データを3Dプリンタに送り、プリントする
という流れを経ることになると思うのですが、この「3次元データ」にはどのようにして形状の情報が埋め込まれているのでしょうか? それを理解してしまえば、例えば3次元設計ソフトを使わずに自分のプログラムから(数式などに基づいて)3次元データを吐き出させることが可能になり、人生が楽しくなりますね。
STLの概要
STLとは?
上記のように、STL(Standard Triangulated Language)は3次元形状データを表現するための一つの形式です。
Standard Triangulated Language - Wikipedia
ASCII STL形式とバイナリSTL形式があるのですが、ここでは人間が読むことのできるASCII STL形式に限定して話を進めていきたいと思います。本質的な表現方法の違いはありません。
STLにおける形状の表現
STLにおいては、三次元形状を小さな三角形の集合体として表現します。以下の図のようなイメージですね。もちろん、もっと細かく滑らかにすることも可能です。
このような小さな三角形それぞれについて、
- 法線ベクトル(長さ1の単位ベクトル)
- 面の表裏を示すために右ねじの法則に従って並んだ三角形の座標データ
という2つのデータを並べたのがXXX.stlというファイルの中身になっています。
ちなみに、三角形の座標データがあれば法線ベクトルは一意に定まるので、少々冗長な表現になっています。法線ベクトルを直接扱えれば便利なケースがあるからだと思います。
STLファイルの中身
前述のような「小さな三角形の集合体」を表現するために、以下のような形式をとっています。太字で書いたnameには立体の名称が、ni, nj, nk, v1x, v1y, v1z, etc... の部分には実際の数値がはいります。
インデントはTabが良いと思われます。
solid name
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v2x v3y v3z
endloop
endfacet
(以下同様にfacetからendfacetまでのブロックが沢山並ぶ)endsolid
実践:地理院地図3DにおけるSTL
地理院地図3DというところからSTLファイルをダウンロードし、ファイルの中身を覗いてみます。
STLファイルの形状を確かめてみる。
Web 3D Viewerによって、ブラウザ(WebGL対応)上でSTLファイルの形状を確かめることができます。
筑波山周辺の地形データをアップロードしてみると以下のようになっていました。
地理院地図3DのSTLファイルをのぞいてみる
ダウンロードしたSTLファイルを開いてみましょう。メモ帳のようなテキストエディタで普通に開きます。
LinuxやMacなら、STLファイル(仮にdem.stlとします)の存在するディレクトリで
$ less dem.stl
と打ち込んでもOKです。
開いてみると以下のようになっていました。確かに前述のフォーマットどおりになっていますね!
solid 3d_data
facet normal -0.861 0.508 0.00861
outer loop
vertex 0 5.38 0
vertex 0 5.37 0.59
vertex 0.59 5.38 0
endloop
endfacet
facet normal -0.859 0.510 0.00865
outer loop
vertex 0.59 5.38 0
vertex 0 5.37 0.59
vertex 0.59 5.37 0.59
endloop
endfacet
......
暇な人は頑張って解読してみましょう。
ちょっとしたプログラムを書けば、座標データを取り出してきて自分の好きなフォーマット(多次元配列とか)に整形することもできますね。
応用:STLファイルを手作りしてみる
正四面体の作成
STLファイルの形式が分かったところで、ゼロからSTLファイルを作ってみましょう。
STLは三角形をベースにした表記法なので、一番簡単そうなのは三角形4つから構成される正四面体ですね。
正四面体を作るには、下図のように一辺の長さ1の立方体から4つの頂点(0, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 0)を選んでくるだけでOKです。
従って、STLファイルは以下のようになります。
solid 4mentai
facet normal 0.57735026919 -0.57735026919 -0.57735026919
outer loop
vertex 0 0 0
vertex 1 1 0
vertex 1 0 1
endloop
endfacet
facet normal -0.57735026919 -0.57735026919 0.57735026919
outer loop
vertex 0 0 0
vertex 1 0 1
vertex 0 1 1
endloop
endfacet
facet normal -0.57735026919 0.57735026919 -0.57735026919
outer loop
vertex 0 0 0
vertex 0 1 1
vertex 1 1 0
endloop
endfacet
facet normal 0.57735026919 0.57735026919 0.57735026919
outer loop
vertex 1 0 1
vertex 1 1 0
vertex 0 1 1
endloop
endfacet
endsolid
順番に説明します。まずは大枠として
solid 4mentai
.....
endsolid
というものがあり、そのなかに面の数(4つ)だけ以下のブロックが並びます。
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v2x v3y v3z
endloop
endfacet
vix viy viz (i=1, 2, 3)のところには前述の4つの頂点(0, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 0)のいずれかを入れていきます。このとき面の外側からみて反時計回りに選ぶ必要があります。
ni nj nkは全部"0 0 0"にしても大丈夫ですが、一応ちゃんと書いておきました。ややこしく見えますが、どれも1/√3に+-をつけただけです。
おわりに
STLの仕組みを解説してきました。3Dプリンタを使う限りではSTLファイルを直接扱う必要はあまりないと思いますが、ここに紹介した地理院地図3Dのデータを整形して遊んでみたいとき・何らかのプログラムから3次元ファイルを出力してみたいときなどに役立つかもしれません。3次元ジェネラティブアートとかできたらいいですね。
*2:小さいので拡大しないと見えないかも