Jeffrey Cross
Jeffrey Cross

スペースシャトルデータからの3D印刷地形図

2000年2月、スペースシャトルエンデバーはシャトルレーダートモグラフィミッション(SRTM)として知られる11日間のミッションに着手しました。その目的は、地球の高解像度デジタル地形データベースを生成するためにレーダー干渉データを収集することでした。結果のデータは、デジタル標高モデル(DEM)と呼ばれるファイルの集まりです。これらのファイルには、緯度60度を下回る平均海面からのメートル単位の標高が含まれています。データの分解能は、北アメリカで1秒、北アメリカで3秒、そして地球のその他の地域の大部分です。

注:2014年秋現在、SRTMデータを担当する機関は、1秒角の分解能で世界中の他の地域向けにSRTMデータを公開し始めています。最初にリリースされた大陸はアフリカで、その後の数ヶ月で世界の他の地域が解放されました。

このプロジェクトの目的は、SRTM標高3秒角データを3Dプリンタを使用してレイズドレリーフマップを作成する基礎として使用できる3Dサーフェスに変換することです。この目的で作成されたソフトウェアはSRTM2STLと呼ばれます。ソフトウェアは、標高データを含む3アーク秒のバイナリSRTMファイルを読み取り、それを三角形に変換して、バイナリ形式またはテキスト形式の一般的な3Dファイル形式である標準テッセレーション言語(STL)で出力ファイルを書き込みます。 STLファイルが生成されると、3Dプリンタベンダー提供のスライスソフトウェアに簡単にインポートできます。スライシングソフトウェアは、データをGコード(3Dプリンターが印刷を制御するために使用するファイル形式)に変換します。

SRTMデータ

SRTM 3アーク秒データは、符号付き16ビット2の補数バイナリデータとしてエンコードされています。 3秒角で、地球の1度×1度の正方形が1200×1200のデータポイントに分割されます。 SRTMデータは1201×1201ポイントとして保存されます。各データポイントは1対のバイトとして格納されます。これらのバイトペアは、2,884,802バイトのファイルを形成します(1ポイントあたり1201 X 1201 * 2バイト)。データの上端と右端には、隣接する正方形の下端と左端(1200 + 1)と同じデータが含まれています。ファイルを連結するときに登録情報として使用できます。

ソフトウェア

STLファイルを作成するためのソフトウェア、SRTM2STLは、普通の(非常に普通の)バニラCで書かれている。ソフトウェアは、事実上あらゆるプラットフォーム、すなわちCコンパイラを有するあらゆるプラットフォーム、例えば、gcc上で実行可能プログラムにコンパイルすることができる。

アルゴリズム

SRTMデータをSTLファイルに変換するプロセスは、4点のすべてのグループを2つの三角形に変換することから始まります。各三角形には、空間内の三角形の位置を定義するために3つのトリプルポイントx、y、およびzが必要です。さらに、各三角形は、空間内での向きを定義するために法線ベクトルx、y、およびzを必要とします。法線ベクトルは、Right Hand Ruleに従って定義されているオブジェクトを指し示す必要があります(後述)。結果のデータは、救済図の表面を形成します。

レリーフマップサーフェスの他に、プログラムは4つの側面と底を作成して3Dモデルを閉じるか、または「水密」にする必要があります。これで3Dモデルが完成し、検査用のSTLファイルビューアまたはスライスソフトウェアにインポートできます。モデルを3D印刷するために必要なデータ。

1201 X 1201のデータポイントを含むSRTMデータの場合、作成される領域の表面(辺と底面を含む)には、5759996の三角形(またはファセット/ポリゴン)が含まれます。

充填穴

さまざまな理由で、元のSRTMファイルのデータの一部が欠落しています。欠けている点は、その点を16ビットで可能な最大の負の値または-32768に等しくすることによってマークされます。マークされたデータポイントはデータ内で簡単に見つけることができ、オプションが選択されている場合、穴はソフトウェアによって埋められます。この目的のために、ソフトウェアは単純な線形アルゴリズムを実装しています。

線形フィルアルゴリズムは、データを含む配列内の行にあるデータ内の穴を見つけることによって機能します。次に、アルゴリズムは、ホールではない行の次のデータポイントを探します。次に、2つの端点間で勾配が計算されます。勾配に基づいて穴ごとに標高が計算され、穴は計算された値で埋められます。

線形充填アルゴリズムには制限があります。たとえば、大量のデータが欠落していると、プログラムは長い線形の塗りつぶし行を作成します(これは見栄えが悪い場合があります)。通常、データは粗い不規則な表面領域に沿ってレーダー信号が散乱するために欠けています。このような場合、長い線形の塗りつぶされた線は通常、表面とあまり一致しません。ホールを処理するためのより良いアルゴリズムは、このソフトウェアに改良を加えることができる1つの場所です。

(ソフトウェアの初期リリースで実装されているように)線形フィルアルゴリズムで遭遇する可能性があるもう一つの問題があります。これは、穴が行の最初または最後(エッジ)から始まるときです。この状況で遭遇する問題を修正するために、ユーザーは端に沿って現れる穴から離れてデータを抽出するべきです。これは、元のアルゴリズムに改善の余地があるさらに別の場所です。

穴の問題を回避するもう一つの方法は修正されたファイルをダウンロードすることです。 SRTMチームはさまざまなテクニックを使って穴を埋めるための多くの作業を行ってきました。修正されたファイルへのリンクは参考文献にあります。

コマンドラインオプション

プログラムはその動作を制御するためにコマンドラインオプションを使用します。コマンドラインの構文は次のとおりです。

srtm2stl入出力[オプション]

Options / A - Amplification - 身長を掛ける係数。これはバイアスが加減される前に適用されます。 / B - バイアス - 整数でなければなりません。地図を低くするにはマイナス(細い)。 / C - 座標サブセット - 緯度、経度、緯度、経度(10分)。 / F - 穴を固定します(Linear Fill)。 / N - STL ASCIIファイルのソリッドネームを変更します。 / H +は、穴の配列座標(欠損データ)を印刷することを意味します。 S | s - サブセット - Start_Row、Start_Column、Stop_Row、Stop_Column / T +はASCII形式の出力を意味し、T-はバイナリ形式の出力を意味します。 V - 詳細出力をオンにする

ポリゴンを作成する

SRTM2STLによって作成された3Dサーフェスのファセットを形成する各ポリゴンは、3つの3次元座標X、Y、およびZで構成されています。XおよびY座標は経度と緯度を表し、Z座標はジオイド上のポイントの高さを表しますまたは大体、海面を意味します。地図の上面を作成するために、4つの隣接点を使用しました。たとえば、地図の左上の座標から始める場合は、1行目の最初の2点と2行目の最初の2点を使用します。最初の多角形は、行1の最初の点と行2の2つの点から作成されます。 2番目の多角形は、1行目の2点目と2行目の2点から作成されます。これは、2つのポリゴンが共通のエッジを共有していることを意味します。

これは、2つのポリゴンを構成するプログラムによって生成されたサンプルデータです。 1つの多角形を表すデータは3組の点からなる。各点は3つの座標X、Y、Zで構成されています。この例の最初の多角形は次の3つの点で構成されています。

ポイント1:0.000000、0.000000、223.000000ポイント2:0.000000、92.408531、219.000000ポイント3:68.984360、0.000000、182.000000

2番目の多角形は、次の3点(X、Y、およびZ)で構成されています。

ポイント1:68.984360、92.408531、180.000000ポイント2:0.000000、92.408531、219.000000ポイント3:68.984360、0.000000、182.000000

そのため、選択したオプションに基づいてプログラムによって生成されたすべてのポリゴンから上面が作成されます。標高データはSRTMデータから抽出され、プログラムのメモリ内の2D配列に格納されます。緯度と経度のデータの距離、つまり座標は、配列の行と列の整数インデックスに各方向の1ポイントあたりの距離を掛けて作成されます。経度(北と南)の距離は緯度(東と西)とは異なります。緯度の距離は、赤道から極に行くにつれて小さくなるためです。緯度(東および西)の距離は、1度の下辺×1度の正方形で計算されます。自然に存在する「テーパー」が正確に表現されるように、配列を移動するときにこの値を再計算する方がより正確です。実際には、この距離の差はほとんど目立ちません。将来的にはプログラムオプションとして追加される可能性があります。

下の図に示すように、上面が作成された後、プログラムは3点多角形のペアを作成することによって側面と底面を閉じます。

計算

出力STLファイルに必要なものの1つは、各ポリゴンの表面に対する法線です。このベクトルは、作成されているオブジェクトの外を指す。すなわち、ベクトルはオブジェクトの外側の方向を示す。

法線は右手の法則を使用して計算されます。グラフィカルにこれはこのようになります:

ポリゴンを作成するときに、外側と内側がどこにあるかがわかっているので、ポリゴンの頂点を選択します。上の図によると、ベクトルaとbはそれぞれ人差し指と中指に対応し、頂点はそれらが始まる点です。したがって、外積は上の図の親指で表される法線ベクトルを計算します。この計算の後、親指はオブジェクトの「外」を指します。

クロス積の計算は、頂点座標が(0,0,0)であると仮定します。 3組の座標から計算を行うために、ベクトルaおよびbは、終点の成分座標、すなわち上の図の指の先端の座標から頂点の成分座標を差し引くことによって計算される。クロス積の計算にこれらの正規化座標を使用します。

多角形をr、s、tとして定義する3つの座標セットを考えます。ここで、rは頂点、r-> sはベクトルa、r-> tはベクトルbを表します。ベクトルaとbの計算は次のようになります。

ax = sx - rx ay = sy - ry az = sz - rz

bx = tx - rx by = ty - ry bz = tz - rz

外積cは、aとbから次のように計算されます。

cx =(ay * bz) - (az * by)cy =(ax * bz) - (az * bx)cz =(ax * by) - (ay * bx)

クロス積は、ポリゴンの端の座標とともに出力STLファイルに書き込まれます。

ファイルフォーマット

STLファイルには、テキストとバイナリの2つの出力ファイル形式があります。テキストファイルフォーマットは、テキストのASCIIファイルとしてデータを表します。これは、STLデータポイントがテキストとしてどのように見えるかの例です。

ソリッドsome_name

ファセット法線61.678 -65.695 -675.324

外側ループ

vertex 65708.836 30.839 999.000 vertex 65708.836 61.678 1002.000 vertex 65730.734 30.839 1001.000

エンドループ

端面

エンドソリッド

上記の例では、もちろん複数のファセット(ポリゴン)があります。ファセット法線に続く3つの数字は、ファセットx、y、およびzに対する法線の座標です。各頂点は、ファセットの角を表す3つの点のうちの1つの座標であるため、それぞれx、y、およびzの各要素を持ちます。

バイナリSTLファイル形式はテキスト形式よりはるかにコンパクトです。二進数を「しない」かどうかを理解するのも難しいです。バイナリ形式では、各数値は単精度32ビット浮動小数点数として格納されます。ファイルは、何でも含むことができるが通常はファイルの短い説明を含む80バイトの固定ヘッダで始まります。次はファイルに含まれる三角形の数の値を保持する単一の32ビット整数です。これに続いて4つの3つの浮動小数点数のセットがあります。フロートの最初のセットは、サーフェスx、y、およびzの法線です。その後、三角形の角を表す3つの点が現れ、各点は3つの32ビット浮動小数点数x、y、zを持ちます。

結論

SRTM2STLのソースコードはGitHubから入手できます。これはGNUライセンスの下でリリースされています。私の願いは、他の人がソフトウェアを修正し拡張することです。私はまたそれで作成された浮き彫りになった救済図が魅力的なだけでなく教育にも使われることを願っています。

以下は、3Dプリントされた作品と並んで3D表示ソフトウェアからのスクリーンショットです。プリンタの解像度が高ければ高いほど、出力はモデルによりよく一致します。

ペリトモレノ氷河 - アルゼンチン

セントヘレンズ山 - オレゴン州

クレーターレイクオレゴン

シェア

コメントを残します