Additive Manufacturing File Format

Additive Manufacturing File Format (AMF)は、3Dプリンティングとも呼ばれる積層造形プロセスのためのファイルフォーマットで、 2013年にISO（国際標準化機構）と、ASTM（アメリカ工業規格会）という２つの標準化団体によるジョイントスタンダードとなった。XMLで記述されており、どのようなコンピュータでも一般的に読み書きできる。過去約30年にわたってデファクトスタンダードとなってきたSTLフォーマットが抱える欠点や不足を根本的に解決するため、色、材料、内部構造、部品の配置、作者や著作情報などのメタデータといった、現代の3Dプリンティングに必要とされる情報や、3Dデータの正しい流通に必要とされる情報を網羅している。STLからAMFへの変換ツールも公開されており、SolidWorks、NetFabbをはじめとした3Dモデリングソフトでの対応も徐々に進められている。
構造.
AMFはひとつのオブジェクトを記述することも、また複数のオブジェクトが配置された全体を記述することもできる。各オブジェクトは、オーバーラップのないボリュームで記述される。それぞれのボリュームは、頂点の集合で構成される三角形メッシュで記述される。1つのオブジェクト内に複数のボリュームがある場合、ボリューム同士がオーバーラップすることはないが、境界部分で頂点を共有することは許されている。AMFはまた、ボリュームの色や材料を指定することができる。色はメッシュの各三角形に割り当てることもできる。AMFはZIP圧縮を用いてファイルサイズを圧縮することができるが、ファイル名はそのまま".amf"で変わらない。AMFリーダーの側でAMFファイルを解凍して幾何情報を読み込む。最小構成のAMFファイルリーダーの実装はAMFファイルのZIP解凍と幾何情報のインポートが必要である（曲面化三角形は除く）
基本構造.
AMFはXMLで記述されている。単位は、ミリ、インチ、フィート、メートルなどから指定するが、もし指定がなかった場合には、ミリメートルが採用される。
代表的なAMFのタグは以下の５つである。（最低限、要素が1つあればAMFファイルとして機能する。）
幾何情報.
現時点（バージョン1.2）でのAMFフォーマットの幾何情報の記述には、STLと同様に面と頂点から構成されるポリゴンメッシュが採用されている。<br>
要素はid属性を使って、0から始まる一意のIDが明示的に割り当てられる。要素に対して材質を指定することができる。<br>
要素は1つのオブジェクトに対して1つだけ要素を持つことを許されており、これ以下でポリゴンメッシュによる幾何情報を記述する。<br>
要素は幾何形状を構成する頂点リスト（要素）と頂点同士を結びつけるボリューム（要素）から構成される。このとき要素は必ず1つ、要素は１つもしくは複数持つことができる。<br>
要素内で定義される各頂点は要素によって記述され、0から始まる番号が定義順に暗黙的に割り当てられる。<br>
各頂点の座標は要素の子要素ので指定され、さらに子要素である,要素で座標値を指定する。<br>
頂点情報の後には必ずそれに対応する1つ以上の要素を定義する必要がある。<br>
各々のボリューム要素はオブジェクトの（3次元的に）閉じた空間を内包する領域（ボリューム）をもつ。<br>
1つのオブジェクトに複数のボリュームを指定することができる。ボリューム同士の境界で頂点を共有することがあるが、ボリュームが重複することはできない。各々のボリュームは子要素を持つ。<br>
はボリュームの表面を覆う三角形の定義する。各々の要素は既に要素で与えられた頂点のうち3つの頂点のリストから構成される。<br>
三角形の3つの頂点のインデックスは、、要素を使って指定される。<br>
（記述される）頂点の順番は右手ルールに従わなくてはならず、頂点は（ボリュームの）外側から見て反時計廻りの順に記述される。<br>
各々の三角形は暗黙的に0から始まる番号を定義された順番に割り当てられる。
色.
色は要素を使って記述され、sRGB色空間の0から1の範囲の数値としてR値（赤）、G値（緑）、B値（青）、アルファチャンネルのアルファ値（透明度）で指定する。要素はマテリアル、オブジェクト、ボリューム、頂点、三角形の階層に挿入することができ、逆の順番で優先される（三角形の色は最も優先順位が高い）。透明度チャネルは下の階層との色の混合の度合いを指定する。デフォルトではすべての値は0にセットされる。色はまた座標に応じた様々な関数を使った数式による指定も可能である。
テクスチャマップ.
テクスチャマップはコンピュータグラフィックスの世界のテクスチャマッピングの考えを借用して表面やボリューム全体に色や材質を割り当てる。要素はまずテクスチャIDと特定のテクスチャデータと関連付けられる。（テクスチャ）データは色もしくは材質は表面もしくはボリュームにマッピングされる必要があるかどうかに応じて、2次元もしくは3次元配列で表現することができる。（テクスチャ）データはBase64エンコーディングのバイト列で表現され、1ピクセルあたり1バイトの256段階のグレースケールで指定する。テクスチャマッピングはAMFで予約された数式を使って指定することも可能である。
マテリアル.
マテリアルは要素を使って指定される。各々のマテリアルは一意のIDが割り当てられる。材質はボリューム単位で指定し、マテリアルIDに対応する材質と対象のボリュームの要素が関連付けられることで材質が割り当てられる。
混合、傾斜、ラティス、ランダムマテリアル.
他の素材との組合せで新しい素材を定義することができる。要素は組成比率の指定に使われ、定数もしくはx,y,z座標依存の数式を利用する。定数の場合は均質素材になる。座標依存の組成は傾斜構造素材になる。より複雑な座標依存比率は非線形で周期的、非周期的な構造を持つ傾斜構造素材になる。（組成）比率の数式はtex(textureid,x,y,z) 関数を使ったテクスチャマップを参照することができる。マテリアルID”0”（空）は予約されており、多孔質構造を指定するために使われる。rand(x,y,z)関数への参照は擬似乱数材質を指定する。rand(x,y,z)関数は0から1までの乱数を座標に対して永続的に返す。
配置（コンステレーション）.
複数オブジェクトは要素を使って配置される。コンステレーションは、3Dプリント時の造形テーブルの充填効率を向上させ、同一のオブジェクトの大きな配列を記述するためにオブジェクトの位置及び向きを指定することができる。要素はコンステレーションで指定された到達すべき位置への変位と回転を指定する。変位と回転は常に定義されたオブジェクトの元の位置と向きと関連付けて定義される。コンステレーションは他のコンステレーションを参照することができる。ただし循環参照はできない。もしトップレベルのコンステレーションが複数指定された場合、もしくは複数のオブジェクトがコンステレーションなしで指定された場合、それらは各々位置データに関連付けられることなくインポートされ、相対的な位置はインポートするソフトウェアに委ねられる。
メタデータ.
要素は、必要に応じて定義されるオブジェクト、形状および材料に関する追加情報を指定するために使用することができる。例えば、この情報には、名前、テキストによる説明、原作者、著作権情報や特別な指示を指定することができる。要素はトップレベル（要素直下）に挿入する場合ファイル全体の属性を指定でき、オブジェクト内、ボリューム内、マテリアル内で指定する場合、それぞれのローカルな属性を指定することができる。
曲面三角形.
形状の忠実度を向上させるために、フォーマットは曲がった三角パッチを許可している。デフォルトでは全ての三角形は平坦で、三角形の辺は2つの頂点を結ぶ直線であることを仮定している。しかしながら、カーブを持った表面（サーフェス）を記述するとき、必要なメッシュ要素の数を減少させるために曲面三角形と曲線エッジを必要に応じて指定することができる。曲率情報は、平面三角形の同じ数によって記述される表面に比べて1000倍の規模で球面の誤差を低減することが示されている。曲率は曲面が平面から平面三角形の最大寸法の50％超えない範囲で指定できる。曲率を指定するために、要素は必要に応じて子要素のを使って所望の曲面を指定できる。曲面の曲率の制御には頂点の位置での法線を利用する。この時、法線の長さは1でかつ面の外側を向いている必要がある。AMFではSTLと異なり要素は曲率の指定にのみ用いる。またSTLのnormalは面に対応する法線であるのに対し、AMFでは頂点に対応する法線となっているので注意が必要である。もし要素が指定された場合、指定された頂点に接する全ての三角パッチの辺は曲線になる。そのため、曲面もまた元の平面三角パッチの法線と垂直に交わる。曲面において曲率が定義できない場所（たとえば円錐の先端のような先端部や、2つの曲面の交わる境界部分のようなエッジ部）では、要素を使って2つの頂点からなる曲線を指定する。曲率は指定する辺の始点と終点での接線方向のベクトルを使って指定される。曲率の指定において要素と要素で食い違いが発生する場合、要素が優先される。曲率が指定された場合、三角パッチは4つの小さな三角パッチに再帰的に繰り返し分解される。このときの繰り返しの回数は5回でなければならない。そのため、最終的に1つの三角パッチは1024（=4^5）の小さな平面三角パッチに置き換えられる。これらの1024の三角パッチはオンザフライで製造プロセスにおけるスライス処理などの際、一時的に保持される。
数式.
要素と要素は定数の代わりに座標依存の数式を使うことができる。数式にはさまざまな標準的な代数式や数学的な演算子や式を利用することができる。
圧縮.
AMFファイルはプレーンテキストフォーマットと圧縮されたテキストフォーマットをサポートしている。圧縮する場合はZIP形式で圧縮される。圧縮されたAMFファイルは一般的に、圧縮されたバイナリSTLファイルの約半分のサイズと同等である。圧縮はWinZIPや7-ZIPのようなソフトウェアで手動で圧縮することもあれば、AMFをサポートするソフトウェアのエクスポート機能で自動的に圧縮されることもある。圧縮、非圧縮に関わらずファイルの拡張子は.amfとなり、AMFをサポートするソフトウェアはどちらも読み込む必要がある。もしAMFファイルが圧縮されている場合、インポート時に解凍処理される。
AMF設計に際して考慮された点.
ASTMがAMFの仕様を策定するにあたって事前調査を行った結果、新しいフォーマットに最も望まれているのは特定の企業による独占的なフォーマットでないことであった。またSTLフォーマットでは単位（mm,inch等）の指定ができないことや三角パッチ同士の接続を保障してしないことなどによる造形可能性の問題が懸念事項として残っている。その他の主要な要求事項としては、忠実度の高い幾何形状を小さいファイルサイズで表現すること、複数の素材、色、微細構造の記述がある。積層造形の分野で幅広く利用されるために以下の事項について考慮されている。
歴史.
1980年代半ばから、STLファイルはCADソフトとAM装置のデータのやりとりをする上で事実上の標準フォーマットとして利用されたきた。STLフォーマットは表面のメッシュに関する情報のみしか持たず、色、テクスチャ、材質、内部構造やその他の造形対象となるオブジェクトの属性は提供されていない。積層造形技術は造形対象が、単一素材、均質な形状のものから色や機能的な傾斜素材、微細構造、複数素材を有するものへと進化し、これらに対応するために標準ファイル交換フォーマットを発展させる必要が出てきた。
また積層造形技術に対する分解能の向上の要求が新しい標準の開発につながった。造形プロセスの幾何分解能はマイクロスケールに近づいてきたため、滑らかな曲面を忠実に再現するためには大量の三角パッチが必要となり、その結果非実用的なレベルにまでファイルサイズが肥大化した。
1990年代から2000年代までの間、多くのがメーカー固有の製造設備に対応させるため、各企業が独自のファイルフォーマットを利用してきた。しかし業界内での合意形成されなかったことが共通のフォーマットの普及を妨げてきた。
2009年の1月、積層造形技術に対応するため新しいASTM委員会F42が設立され、デザインファイルの新しい標準フォーマットを開発するためのグループが結成された。2009年末から新しい標準について1年以上審議されてきた結果、2011年5月2日にAMFの最初のバージョンが正式に採用された。
2013年にイギリス・ノッティンガムで行われた会議において、ASTMのF42とISOのTC261が積層造形技術の標準を共同で開発してゆく計画が承認された。そのためAMFはISOとASTMによって共同で管理される。
2019年、ISO小委員会で、ソリッドモデリングのためのAMFサポート:ボクセル情報，構造的ソリッドジオメトリ表現，ソリッドテクスチャ追加に関して審議中。
サンプルファイル.
下記のAMFファイルは2つの素材で作られた四角錐（ピラミッド）を表している。
下記のテキストをテキストエディタもしくはXMLエディタにコピー&ペーストして"pyramid.amf"として保存することで、AMFファイルが出来上がる。
ZIP圧縮する場合は、ファイル拡張子を".zip"から".zip.amf"に変更する。
<?xml version="1.0" encoding="utf-8"?>
<amf unit="inch" version="1.1">
 <metadata type="name">Split Pyramid</metadata>
 <metadata type="author">John Smith</metadata> 
 <object id="1">
 <mesh>
 <vertices>
 <vertex><coordinates><x>0</x><y>0</y><z>0</z></coordinates></vertex>
 <vertex><coordinates><x>1</x><y>0</y><z>0</z></coordinates></vertex>
 <vertex><coordinates><x>0</x><y>1</y><z>0</z></coordinates></vertex>
 <vertex><coordinates><x>1</x><y>1</y><z>0</z></coordinates></vertex>
 <vertex><coordinates><x>0.5</x><y>0.5</y><z>1</z></coordinates></vertex>
 </vertices>
 <volume materialid="2">
 <metadata type="name">Hard side</metadata> 
 <triangle><v1>2</v1><v2>1</v2><v3>0</v3></triangle>
 <triangle><v1>0</v1><v2>1</v2><v3>4</v3></triangle>
 <triangle><v1>4</v1><v2>1</v2><v3>2</v3></triangle>
 <triangle><v1>0</v1><v2>4</v2><v3>2</v3></triangle>
 </volume>
 <volume materialid="3">
 <metadata type="name">Soft side</metadata> 
 <triangle><v1>2</v1><v2>3</v2><v3>1</v3></triangle>
 <triangle><v1>1</v1><v2>3</v2><v3>4</v3></triangle>
 <triangle><v1>4</v1><v2>3</v2><v3>2</v3></triangle>
 <triangle><v1>4</v1><v2>2</v2><v3>1</v3></triangle>
 </volume>
 </mesh>
 </object>
 <material id="2">
 <metadata type="name">Hard material</metadata>
 <color><r>0.1</r><g>0.1</g><b>0.1</b></color>
 </material>
 <material id="3">
 <metadata type="name">Soft material</metadata>
 <color><r>0</r><g>0.9</g><b>0.9</b><a>0.5</a></color>
 </material>
</amf>