積層造形ファイル形式(AMF)は、3Dプリンティングなどの積層造形プロセス用のオブジェクトを記述するためのオープンスタンダードです。公式のISO / ASTM 52915:2016 [ 1 ] [ 2 ]規格は、あらゆるコンピュータ支援設計ソフトウェアが、コンピュータ支援製造ソフトウェアを介してあらゆる3Dプリンターで製造されるあらゆる3Dオブジェクトの形状と構成を記述できるように設計されたXMLベースのフォーマットです。前身のSTLフォーマットとは異なり、AMFは色、材料、格子、および星座をネイティブにサポートしています。
AMF ファイルは、単一のオブジェクト、または星座状に配置された複数のオブジェクトを表すことができます。各オブジェクトは、重なり合わないボリュームの集合として記述されます。各ボリュームは、点(頂点)の集合を参照する三角形メッシュによって記述されます。これらの頂点は、同じオブジェクトに属するボリューム間で共有できます。AMF ファイルでは、各ボリュームの材質と色、およびメッシュ内の各三角形の色を指定することもできます。AMF ファイルは zip 圧縮形式で圧縮されますが、「.amf」ファイル拡張子は保持されます。最小限の AMF リーダー実装では、AMF ファイルを解凍し、少なくともジオメトリ情報(曲率を無視)をインポートできる必要があります。
AMFファイルは、XMLバージョンとエンコーディングを指定するXML宣言行で始まります。ファイルの残りの部分は、開始要素と終了要素で囲まれています。単位系(ミリメートル、インチ、フィート、メートル、マイクロメートル)も指定できます。単位が指定されていない場合は、ミリメートルが使用されます。<amf></amf>
AMFの括弧内には、5つの最上位要素があります。完全に機能するAMFファイルには、オブジェクト要素が1つだけ必要です。
<object>オブジェクト要素は、印刷用の材料IDに関連付けられた、1つまたは複数の材料のボリュームを定義します。ファイルには少なくとも1つのオブジェクト要素が必要です。追加のオブジェクトはオプションです。<material>オプションの材料要素は、関連付けられた材料IDとともに、印刷に使用する1つ以上の材料を定義します。材料要素が含まれていない場合は、単一のデフォルト材料が使用されます。<texture>オプションのtexture要素は、色またはテクスチャマッピングに使用する1つ以上の画像またはテクスチャを定義し、それぞれにテクスチャIDが関連付けられています。<constellation>オプションの星座要素は、オブジェクトや他の星座を階層的に組み合わせて、印刷用の相対的なパターンを作成します。<metadata>オプションのメタデータ要素は、ファイルに含まれるオブジェクトおよび要素に関する追加情報を指定します。このフォーマットでは、面頂点ポリゴンメッシュレイアウトを使用します。各トップレベル要素は一意の を指定します。要素はオプションでマテリアルを指定することもできます。メッシュジオメトリ全体は単一の要素に含まれています。メッシュは、1 つの要素と 1 つ以上の要素を使用して定義されます。必須要素は、このオブジェクトで使用されるすべての頂点をリストします。各頂点には、宣言された順序で暗黙的に番号が割り当てられ、0 から開始されます。必須子要素は、、および要素を使用して、3D 空間での点の位置を示します。頂点情報の後に、少なくとも 1 つの要素を含める必要があります。各ボリュームは、オブジェクトの閉じたボリュームをカプセル化します。複数のボリュームを単一のオブジェクトで指定できます。ボリュームは、インターフェースで頂点を共有できますが、重複するボリュームを持つことはできません。各ボリューム内では、子要素を使用して、ボリュームの表面をテッセレーションする三角形を定義します。各要素は、要素で指定された以前に定義された頂点のインデックスのセットから 3 つの頂点をリストします。三角形の3つの頂点のインデックスは、、および要素を使用して指定されます。頂点の順序は右手の法則に従う必要があり、外側から見たときに反時計回りの順序で頂点がリストされます。各三角形には、宣言された順序で暗黙的に番号が割り当てられ、0から始まります。<object>id<object><mesh><vertices><volume><vertices><coordinates><x><y><z><volume><triangle><triangle><vertices><v1><v2><v3>
色は、sRGBカラースペースの赤、緑、青、アルファ(透明度)チャンネルを0~1の範囲の数値で指定することで、要素を使用して導入されます。この要素は、マテリアル、オブジェクト、ボリューム、頂点、または三角形レベルに挿入でき、優先順位は逆順になります(三角形の色が最優先)。透明度チャンネルは、下位レベルの色がどの程度ブレンドされるかを指定します。デフォルトでは、すべての値がゼロに設定されています。<color><color>
色は、さまざまな座標依存関数を使用できる数式を参照することによって指定することもできます。
テクスチャマップは、グラフィックスにおけるテクスチャマッピングの概念を応用し、サーフェスまたはボリュームに色やマテリアルを割り当てることを可能にします。この要素は、まず特定のテクスチャデータにを関連付けるために使用されます。データは、色やマテリアルをサーフェスにマッピングする必要があるかボリュームにマッピングする必要があるかに応じて、2D配列または3D配列として表現できます。データはBase64エンコーディングのバイト列として表現され、1バイトがピクセルごとに0~255の範囲のグレースケールレベルを指定します。<texture>texture-id
テクスチャIDが割り当てられると、以下の例のように、カラー式の中でテクスチャデータを参照できるようになります。
しかし通常、上記のように座標を直接使用するのではなく、まずオブジェクト座標からテクスチャ座標に変換します。たとえば、tex(1,f1(x,y,z),f2(x,y,z),f3(x,y,z))はf1(), f2(), f3()いくつかの関数であり、通常は線形です。
マテリアルは<material>要素を使用して導入されます。各マテリアルには一意のIDが割り当てられます。幾何学的ボリュームは、<volume>要素内でマテリアルIDを指定することでマテリアルに関連付けられます。
新しい材料は、他の材料の組成として定義できます。要素は、定数または x、y、z 座標に依存する式として、組成の比率を指定するために使用されます。一定の混合比率は均質な材料になります。座標に依存する組成は、勾配のある材料になります。より複雑な座標依存の比率は、非線形材料勾配、周期的および非周期的なサブ構造につながります。比率の式は、関数を使用してテクスチャ マップを参照することもできます。材料 ID "0" (void) への参照は予約されており、多孔質構造を指定するために使用できます。関数への参照は、擬似乱数材料を指定するために使用できます。この関数は、その座標に対して永続的な 0 ~ 1 の乱数を返します。<composite>tex(textureid,x,y,z)rand(x,y,z)rand(x,y,z)
要素を使用すると、複数のオブジェクトをまとめて配置できます。コンステレーションは、オブジェクトの位置と向きを指定することで、パッキング効率を高め、同一オブジェクトの大規模な配列を記述できます。要素は、既存のオブジェクトがコンステレーション内の位置に到達するために必要な変位と回転を指定します。変位と回転は、常にオブジェクトが定義された元の位置と向きに対して相対的に定義されます。循環参照を避ける限り、コンステレーションは別のコンステレーションを参照できます。<constellation><instance>
複数の最上位星座が指定されている場合、または星座が指定されていない複数のオブジェクトが指定されている場合、それぞれのオブジェクトは相対位置データなしでインポートされます。インポートプログラムは、その後、相対位置を自由に決定できます。
この要素は、定義対象のオブジェクト、ジオメトリ、マテリアルに関する追加情報を指定するためにオプションで使用できます。たとえば、名前、テキストによる説明、作成者、著作権情報、特別な指示などを指定できます。この要素は、ファイル全体の属性を指定するために最上位レベルに含めることも、オブジェクト、ボリューム、マテリアル内に含めて、そのエンティティ固有の属性を指定することもできます。<metadata><metadata>

幾何学的忠実度を向上させるために、このフォーマットでは三角形パッチを湾曲させることができます。デフォルトでは、すべての三角形は平面であると想定され、すべての三角形の辺は2つの頂点を結ぶ直線であると想定されます。ただし、曲面を記述するために必要なメッシュ要素の数を減らすために、曲がった三角形と曲がった辺をオプションで指定できます。曲率情報は、同じ数の平面三角形で記述された表面と比較して、球面の誤差を1000分の1に減らすことが示されています。[ 1 ]曲率によって、三角形の最大寸法の50%を超える平面三角形の平面からのずれが生じてはなりません。
曲率を指定するには、頂点にオプションで子要素を含めて、その頂点の位置における目的のサーフェス法線を指定できます。法線は単位長で、外向きである必要があります。この法線が指定されている場合、その頂点で交わるすべての三角形の辺は、その法線に垂直で、法線と元の直線の辺によって定義される平面内にあるように湾曲します。頂点におけるサーフェスの曲率が定義されていない場合(たとえば、尖点、角、または辺)、要素を使用して、2 つの頂点を結ぶ単一の非線形辺の曲率を指定できます。曲率は、その辺の始点と終点の接線方向ベクトルを使用して指定します。要素によって暗示される曲率と競合する場合は、要素が優先されます。<normal><edge><edge><normal>
曲率が指定されると、三角形は再帰的に4つのサブ三角形に分解されます。この再帰は5階層まで実行されるため、元の曲がった三角形は最終的に1024個の平面三角形に置き換えられます。これらの1024個の三角形は「オンザフライ」で生成され、その三角形と交差する層が製造処理されている間だけ一時的に保存されます。
およびのどちらの要素においても、定数の代わりに座標に依存する式を使用できます。これらの式では、さまざまな標準的な代数演算子や数学演算子、および式を使用できます。<color><composite>
AMF は、プレーン テキストまたは圧縮テキストとして保存できます。圧縮されている場合、圧縮はZIP アーカイブ形式で行われます。圧縮された AMF ファイルは、通常、同等の圧縮バイナリ STL ファイルの約半分のサイズです。[ 3 ] : 275圧縮は、圧縮ソフトウェアを使用して手動で行うことも、書き込み時にエクスポート ソフトウェアによって自動的に行うこともできます。圧縮ファイルと非圧縮ファイルの両方に.amf拡張子が付いており、ファイルが圧縮されているかどうかを判断し、圧縮されている場合はインポート時に解凍を実行するのは解析プログラムの責任です。
ASTM設計小委員会がAMF仕様の開発を開始した際、関係者への調査[ 4 ]により、新規格の最優先事項は非独占的なフォーマットの要件であることが明らかになった。単位と造形性に関する問題は、STLフォーマットの問題から残る懸念事項であった。その他の重要な要件としては、高精度かつ小さなファイルサイズで形状を指定できること、複数の材料、色、微細構造に対応できることなどが挙げられる。積層造形分野全体で成功を収めるために、このファイルフォーマットは以下の懸念事項に対処するように設計された。
1980年代半ば以降、STLファイル形式は、設計プログラムと積層造形装置間で情報を転送するための事実上の業界標準となっています。STL形式には表面メッシュに関する情報しか含まれておらず、製造対象物の色、テクスチャ、材料、サブストラクチャ、その他の特性を表現するための規定はありませんでした。積層造形技術が、主に単一材料の均質な形状の製造から、機能勾配材料や微細構造を備えたフルカラーのマルチマテリアル形状の製造へと進化するにつれて、これらの機能をサポートできる標準的な交換ファイル形式の必要性が高まりました。標準の開発を促した2つ目の要因は、積層造形技術の解像度の向上です。印刷プロセスの忠実度がミクロン単位の解像度に近づくにつれて、滑らかな曲面を記述するために必要な三角形の数が増え、ファイルサイズが許容できないほど大きくなりました。[ 4 ]
1990年代から2000年代にかけて、さまざまな企業が自社の製造装置の特定の機能をサポートするために独自のファイル形式を使用していたが、業界全体での合意がなかったため、単一の形式が広く採用されることはなかった。2006年、Jonathan D. HillerとHod Lipsonは、「STL 2.0」と呼ばれるAMFの初期バージョンを発表した。[ 3 ] 2009年1月、積層造形技術に関する新しいASTM委員会F42が設立され、新しい標準を開発するための設計小委員会が結成された。2009年後半に調査が実施され[ 4 ]、新しい標準に関する1年以上の審議につながった。その結果、AMF標準の最初の改訂版が2011年5月2日に正式に発効した。[ 5 ]
2013年7月に英国ノッティンガムで開催されたASTMのF42とISOのTC261の合同会議において、積層造形規格開発のための共同計画が承認されました。それ以来、AMF規格はISOとASTMによって共同で管理されています。

以下は、AMFチュートリアル[ 6 ]を参考に作成した、2種類の材料で構成されたピラミッドを記述したシンプルなAMFファイルです(圧縮時548バイト)。このAMFファイルを作成するには、以下のテキストをテキストエディタまたはXMLエディタにコピー&ペーストし、「pyramid.amf」という名前で保存します。次に、ZIPでファイルを圧縮し、ファイル拡張子を「.zip」から「.zip.amf」に変更します。
<?xml version="1.0" encoding="utf-8"?> <amf unit= "inch" version= "1.1" > <metadata type= "name" >スプリットピラミッド</metadata> <metadata type= "author" >ジョン・スミス</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.< volume materialid= "2" > < metadata type= "name" >ハードサイド</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" >ソフトサイド</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>i=144></object>i=144></object><material id= "2" > <metadata type= "name" >硬質素材</metadata> <color><r> 0.1 </r><g> 0.1 </g><b> 0.1 </b></color> </material> <material id= "3" > <metadata type= "name" >軟質素材</metadata> <color><r> 0 </r><g> 0.9 </g><b> 0.9 </b><a> 0.5 </a></color> </material> </amf>