roombaの日記

読書・非線形科学・プログラミング・アート・etc...

3Dプリンタに使われるSTLファイルを地理院地図3Dと併せてマスターする

目次

f:id:roomba:20151111164008p:plain

はじめに

ネットから3Dプリントが可能*1になるなど、ふつうの人でも3Dプリンタを使ったものづくりが可能になりつつあります。その際には、

  1. 3次元設計ソフトなどでデザインする
  2. その3次元データ3Dプリンタに送り、プリントする

という流れを経ることになると思うのですが、この「3次元データ」にはどのようにして形状の情報が埋め込まれているのでしょうか? それを理解してしまえば、例えば3次元設計ソフトを使わずに自分のプログラムから(数式などに基づいて)3次元データを吐き出させることが可能になり、人生が楽しくなりますね。


ということで、ここでは一般に用いられている「STL形式(XXX.stl)」について調べてみました。以下では、

  1. STLの形式を理解したうえで、
  2. 地形の立体データを無料で入手できる「地理院地図3D」を例にとって理解を深め、
  3. 最後には自力で(キーボード入力だけで)STLファイルを作ってみます。

STLの概要

STLとは?

上記のように、STL(Standard Triangulated Language)は3次元形状データを表現するための一つの形式です。
Standard Triangulated Language - Wikipedia

ASCII STL形式とバイナリSTL形式があるのですが、ここでは人間が読むことのできるASCII STL形式に限定して話を進めていきたいと思います。本質的な表現方法の違いはありません。

STLにおける形状の表現

STLにおいては、三次元形状を小さな三角形の集合体として表現します。以下の図のようなイメージですね。もちろん、もっと細かく滑らかにすることも可能です。
Dolphin triangle mesh

このような小さな三角形それぞれについて、

  1. 法線ベクトル(長さ1の単位ベクトル)
  2. 面の表裏を示すために右ねじの法則に従って並んだ三角形の座標データ

という2つのデータを並べたのがXXX.stlというファイルの中身になっています。

ちなみに、三角形の座標データがあれば法線ベクトルは一意に定まるので、少々冗長な表現になっています。法線ベクトルを直接扱えれば便利なケースがあるからだと思います。

STLファイルの中身

前述のような「小さな三角形の集合体」を表現するために、以下のような形式をとっています。太字で書いたnameには立体の名称が、ni, nj, nk, v1x, v1y, v1z, etc... の部分には実際の数値がはいります。

  • ni nj nk: 法線ベクトル(小さな三角形の面に垂直な単位ベクトル)のxyz成分
  • vix viy viz (i=1,2,3): 小さな三角形の頂点v1, v2, v3のxyz座標

インデントは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ファイルをダウンロードし、ファイルの中身を覗いてみます。

地理院地図3DからSTLファイルをダウンロードする

WebGL対応のブラウザが必要なようです。

  1. 地理院地図3Dにアクセスし、右上の「3次元でみる - 作成はこちらから -」をクリックします。
  2. 地図があらわれるので、富士山など好きな場所&倍率にあわせ、「この地図を3Dで表示」をクリックします。
  3. しばらくするとブラウザ内に3次元の地形が(WebGL対応のブラウザなら)表示されるので、下部「3Dプリンタ用ダウンロード」をクリックします。
  4. STLファイル・VRMLファイル・WebGL用ファイルのなかから「STLファイル」を選び、「ダウンロード」をクリックします。
  5. zip形式に圧縮されているので、解凍してSTLファイル(XXX.stl)を取り出します。

STLファイルの形状を確かめてみる。

Web 3D Viewerによって、ブラウザ(WebGL対応)上でSTLファイルの形状を確かめることができます。
筑波山周辺の地形データをアップロードしてみると以下のようになっていました。

f:id:roomba:20151111164008p:plain

地理院地図3DのSTLファイルをのぞいてみる

ダウンロードしたSTLファイルを開いてみましょう。メモ帳のようなテキストエディタで普通に開きます。

LinuxMacなら、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です。
f:id:roomba:20151102173456j:plain
従って、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の確認

上記のSTLファイルを(ファイル名).stlとして保存し、Web 3D Viewerにアップロードして確かめてみる*2と、ちゃんと下図のような正四面体になっていることが分かります。めでたしめでたし。


f:id:roomba:20151111164822p:plain
職人が心をこめてつくった手作りSTLファイルなので、こころなしか品質のよさを感じます。

おわりに

STLの仕組みを解説してきました。3Dプリンタを使う限りではSTLファイルを直接扱う必要はあまりないと思いますが、ここに紹介した地理院地図3Dのデータを整形して遊んでみたいとき・何らかのプログラムから3次元ファイルを出力してみたいときなどに役立つかもしれません。3次元ジェネラティブアートとかできたらいいですね。

*1:3Dプリントサービスについて - DMM3Dプリント

*2:小さいので拡大しないと見えないかも