3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

立体地図を作る -その4 3Dモデルの生成-

4.3Dモデル(STLファイル)の生成

前節(3.標高メッシュの作成)で得られた奈良県のメッシュのマスの数は58,000弱ありました。モデリングツールのユーザーインターフェースで1個ずつマス目ごとの高さを指定していくわけにはいかないのでデータから自動的にモデルを生成する仕掛けが必要です。今回はOpenSCADというプログラミングで3Dモデルを作成するツールを使いました。

OpenSCAD - The Programmers Solid 3D CAD Modeller

OpenSCADではテキストエディタ

translate([0.25,21.25,0]) cube([0.25,0.25,30.84]);

 といった1行のコードを記述すると、このコードで指定された場所(0.25,21.25,0)で指定された大きさ(0.25,0.25,30.84)の直方体の3D情報を作成することができます(数字の単位はmm)。人がコード(条件分岐や繰返しなどの論理構造も記述可能)を書いていくのが通常のOpenSCADでのモデリングのやりかたなのですが、今回はExcelのマクロを使ってコード列を自動で発生させることにします。

まず、奈良県のメッシュの属性テーブルの全行のデータからxmin(各マス目の左下隅の経度)とymin(各マス目の左下隅の緯度)のそれぞれの最小値を求めてこれをOpenSCADで座標を指定する際の原点とします。原点座標を(135.5405,33.8596)としてある行(1個のマス目)の情報が以下であったとすると

xmin(マス目の左下隅の経度)=135.5430

ymin(マス目の左下隅の緯度)=34.0721

標高mean(マス目内の標高平均値)=1025.0

translate([(135.5430-135.5405)*100,(34.0721-33.8596)*100,0]) cube([0.0025*100,0.0025*100,1042/50+10]);

として青色部分を計算すれば底辺をこのマス目として標高平均に対応した高さを持つ直方体を生成するコードになります。上記の式で100は横方向の縮尺、50は縦方向の縮尺、10は地図の土台部分の高さを指定するパラメータになります。

標高メッシュの属性テーブルの値をExcelに取り込んでからマクロで上記のようなコマンド列を発生させOpenSCADのエディタにCopy&Pasteに貼り付けて実行すればSTL形式で出力可能な3Dデータが生成されます。

ただし、OpenSCADは一度にあまり大量のデータを処理できない(19,000行ぐらいを超えると異常終了してしまう)ので、前節で作成した奈良県のメッシュデータについては10,000行ずつに分けてSTLファイルを生成し後からそれらを結合しました。

f:id:ichidaya:20181219003948p:plain

最初の10000個データの生成

コードを貼りつけたら画面上部のアイコンをプレビュー(1)、レンダリング(2)、STL出力(3)の順番でクリックして3Dデータを生成、格納します。プレビューはすぐに表示されるのですが、2番目のレンダリング処理には少し時間がかかります。私の環境((Intel i5-6500@3.2GHz, Memory 16GB))だと、10,000個のメッシュのレンダリングに20分ぐらいかかりました。

OpenSCADが出力するファイルの形式はSTLだけですが、このファイルを例えばMeshLabを使ってOBJ形式など別の形式に変換することができます。

MeshLab

MeshLabで取り込んだ奈良県の立体地図モデルは下の図のようになります。

f:id:ichidaya:20181222230034p:plain

奈良県の立体地図

この地図のメッシュは緯度・経度を0.0025度ずつのマス目で分割しており、それを1辺0.25mmの正方形としてモデル化しています。縮尺としては111万分の1くらいで奈良県を上から見たとき縦横の一番長い部分で縦9cm、横6cmぐらいになります。一方、垂直方向は5万分の1の縮尺で高さを計算しているので、標高の変化をかなり強調したモデルとなっています(ここで説明に用いたモデルの縮尺は「その1」で写真を載せたモデルとは異なっています)。

たいていの3DモデリングソフトはOBJ形式の3Dモデルを読み込むことができます。私の場合、OBJ形式になった3DモデルをZBrush(有料ですがプロも使っている高機能ソフトとしては安価なほうだと思います)で編集して、底面に都道府県名を彫り込んだり、細かい凹凸にスムージングをかけたりしています。今回のような作り方だと、山の峰の先端部分が厚みがなくなって3Dプリンタだと造形できない部分が発生したりするのですが、ZBrushのスムーズブラシで全体を軽く処理することで造形できるようになりました。