| ファイル名拡張子 |
.jmsh、.bmsh |
|---|---|
| インターネットメディアの種類 |
アプリケーション/json |
| タイプコード | テキストとバイナリ |
| 開発者 | 千千芳 |
| 初回リリース | 2020年9月16日[1] |
| 最新リリース | 1.0 ドラフト1 2020年9月16日[2] |
| フォーマットの種類 | データ交換 |
| 延長 | JSON、JData |
| オープンフォーマット? | はい |
| Webサイト | オープンJデータ |
JMeshは、三角形や四面体メッシュなどの離散化ジオメトリ、NURBS 曲線やサーフェスなどのパラメトリック ジオメトリ、形状プリミティブやメッシュの構成的ソリッド ジオメトリ (CGS) などの構成的ジオメトリを含む、非構造化ジオメトリ データの保存と交換のための JSON ベースの移植可能で拡張可能なファイル形式です。JData 仕様に基づいて構築されたJMeshファイルは、JSONおよび Universal Binary JSON ( UBJSON ) 構造を使用してジオメトリ データ構造をシリアル化およびエンコードするため、ほとんどの既存の JSON および UBJSON パーサーで直接処理できます。 JMesh 仕様は、N 次元 (ND) の頂点、曲線、表面、ソリッド要素、形状プリミティブ、それらの相互作用 (CGS など)、空間関係などのジオメトリ データをエンコードするための JSON 互換構造のリストと、それらの関連プロパティ (数値、色、法線、マテリアル、テクスチャ、グラフィックス データ操作、3D 製造、コンピューター グラフィックス レンダリング、アニメーションに関連するその他のプロパティ) を定義します。
JMesh ファイルの例
次のメッシュ(単位立方体の四面体メッシュ)には、8つの3D頂点、12の三角形の面、および6つの四面体要素が含まれています。
上記のメッシュはJMesh/JSON形式で次のように保存できます。
{
"_DataInfo_" :{ "JMeshVersion" : 0.5 、"CreationTime" : "2021 年 12 月 19 日 11:53:43" 、"Comment" : "iso2mesh 1.9.5-Rev(http:\/\/iso2mesh.sf.net) によって作成されました" } 、"MeshVertex3" :[ [ 0 、0 、0 ]、[ 1 、0 、0 ] 、[ 0 、1 、0 ]、[ 1 、1 、0 ] 、[ 0 、0 、1 ]、[ 1 、0 、1 ] 、[ 1 、1 、1 ] ] 、" MeshTri3" : [ [ 1 、2 、4 ]、[ 1 、2 、6 ] 、[ 1 、3 、4 ]、[ 1 、3 、7 ]、 [ 1 、5 、6 ]、[ 1 、5 、7 ]、[ 2 、8 、4 ]、[ 2 、8 、6 ]、[ 3 、8 、4 ], [ 3 , 8 , 7 ], [ 5 , 8 , 6 ], [ 5 , 8 , 7 ] ], "MeshTet4" :[ [ 1 , 2 , 4 , 8 ], [ 1 , 3 , 4 , 8 ], [ 1 , 2 , 6 , 8 ], [ 1 , 5 ] 、6、8 ] 、[ 1
、3 、7 、8 ]、
[ 1 、5 、7 、8 ] ] }
オプションの"_DataInfo_"レコードには、JData 仕様に従って追加のメタデータを含めることができます。
次元固有のメッシュ データ構造、つまり、、およびを使用する代わりにMeshVertex3、MeshTri3それらをそれぞれ対応する柔軟なメッシュ データ コンテナー、、、およびMeshTet4に置き換えることもできます。パーサーが各エントリの数値データを正しく処理できるように、メタデータ ヘッダーに追加することをお勧めします。
MeshNodeMeshSurfMeshElem"Dimension": 3"_DataInfo_"
あるいは、JMeshとJDataの仕様によれば、上記のJSONスタイルの2次元配列は、以下のようにJDataの注釈付きND配列形式を使用して構造体として保存し、追加のバイナリデータ型のサポートを追加することができます。
{
"_DataInfo_" :{ "JMeshVersion" : 0.5 、"Dimension" : 3 }、"MeshNode" :{ "_ArrayType_" : "double" 、"_ArraySize_" :[ 8 、3 ]、"_ArrayData_" :[ 0 、0 、0 、1 、0 、0 、0 、1 、0 、1 、1 、0 、0 、0 、 1 、1 、0 、 0 、1 、0 、1 、1 、1 、1 、1 ] }、"MeshSurf" :{ "_ArrayType_" : "uint8" 、"_ArraySize_" :[ 12 、3 ]、"_ArrayData_" :[ 1 、2 , 4 , 1 , 2 , 6 , 1 , 3 , 4 , 1 , 3 , 7 , 1 , 5 , 6 , 1 , 5 , 7 , 2 , 8 , 4 , 2 , 8 , 6 , 3 , 8 , 4 , 3 , 8 , 7 , 5 , 8 , 6 , 5 , 8 , 7 ] }, "MeshElem" :{ "_ArrayType_" : "uint8" , "_ArraySize_" :[ 6 , 4 ], "_ArrayData_" :[ 1 , 2 , 4 , 8 , 1 , 3 , 4 , 8 , 1 ,2 、6 、8 、
1 、5 、6 、8 、1 、3 、7 、8 、1 、5 、7 、8 ]
}
大きなメッシュデータファイルの場合、レコードレベルの圧縮はJData仕様でサポートされています。説明のために、上記のJMeshデータは次のようにも記述できます。
{
"_DataInfo_" :{ "JMeshVersion" : 0.5 、"Dimension" : 3 }、"MeshNode" :{ "_ArrayType_" : "double" 、"_ArraySize_" :[ 8 、3 ]、"_ArrayZipSize_" :[ 1 、24 ]、"_ArrayZipType_" : "zlib" 、"_ArrayZipData_" : "eJxjYMAHPtjjlcaQh/GJ1YdLPy51mDQAp2EONQ==" }、"MeshSurf" :{ "_ArrayType_" : "uint8" 、"_ArraySize_" :[ 12 、3 ]、"_ArrayZipSize_" :[ 1 、36 ]、"_ArrayZipType_" : "zlib" 、"_ArrayZipData_" : "eJwFwYcNAAAAIArAAMv6/2BY8MNBBhQOXOy7aafXi9QEJtwCj" }, "MeshElem" :{ "_ArrayType_" : "uint8" , "_ArraySize_" :[ 6 , 4 ], "_ArrayZipSize_" :[ 1 , 24 ], "_ArrayZipType_" : "zlib" , "_ArrayZipData_" : "eJxjZGLhYGQGYiY2DkZWIGZmB9LsHAAExABt" } }
ここで、 内の文字列には、で指定された精度で"_ArrayZipData_"、行優先シリアル化、Zlib圧縮、およびBase64エンコードされた生のバイナリ配列データのバイナリ ストリーム_ArrayType_が格納されます。レコード レベルのデータ圧縮により、大規模なメッシュ ファイルを格納する際に大幅なサイズ削減が実現される可能性があります。
フォーマットの概要
JMesh構文
すべての JMesh ファイルはJData仕様に準拠しています。JData と同様に、JSON シリアル化スキームに基づくテキスト形式と UBJSON シリアル化スキームに基づくバイナリ形式の両方を備えています。
サポートされているほぼすべてのメッシュ データ コンテナー (つまり、名前付き JData ノード) は、ND 配列または構造体の 2 つの形式のいずれかを使用して定義できます。
配列形式
単純なデータの場合、「配列形式」を使用して JMesh キーワードでデータを保存できます。この場合、データの形式は JData 仕様で定義されている「N 次元配列ストレージ キーワード」の規則に従う必要があります。たとえば、1 次元または 2 次元配列は、直接ストレージ形式を使用して次のように保存できます。
「jmesh_container_1d」: [ v 1 , v 2 , ... , v n ]、「jmesh_container_2d」: [ [ v 11 , v 12 , ... , v 1 n ], [ v 21 , v 22 , ... , v 2 n ], ... [ vm 1 , vm 2 , ... , vm n ] 】
または「注釈付きストレージ」形式を使用して
"jmesh_container_nd" : { "_ArrayType_" : "typename" , "_ArraySize_" : [ N 1 、N 2 、N 3 、... ], "_ArrayData_" : [ v 1 、v 2 、v 3 、... ] }
構造形式
JData 構造を使用して、プライマリ データを保存したり、コンテナーに関連付けられた追加のメタデータをサポートしたりすることもできます。たとえば、構造ベースのコンテナーには、以下のサブフィールドが含まれる場合があります。
"jmesh_container_struct" : { "_DataInfo_" :{ ... }, "データ" :[ ... ], "プロパティ" : [ ... ] }
必要なのはサブフィールドのみで"Data"あり、上記に示した「配列形式」(直接形式または注釈形式のいずれか)で保存されているのと同じデータを持っている必要があります。
オプションの"Properties"サブフィールドを使用すると、このシェイプ/メッシュ要素に追加データを保存できます。サブ"Properties"フィールドは、追加のサブフィールドを含む配列または構造体にすることができます。
オプションは、"_DataInfo_"この構造に関連付けられたメタデータを格納するための JData 構造です。データ取得日、オペレータ名、バージョン番号などの単純なメタデータを格納するために使用できます。メタデータを と に分割する方法は_DataInfo_、Propertiesユーザーによって異なります。
JMeshキーワードの概要
離散化ジオメトリに関連付けられたデータ コンテナー キーワードのほとんどには というプレフィックスが"Mesh"付きます。パラメトリック シェイプ構造に関連付けられたキーワードには という"Shape"プレフィックスが付きます。構成的ソリッド ジオメトリに関連付けられたキーワードには というプレフィックスが付きます"CSG"。キーワードの多くは、配列形式で保存されるときのデータの列番号を表す数値で終わります。
- メッシュグループ化:
MeshGroup、、MeshObjectMeshPart - 頂点:
MeshVertex1、、、MeshVertex2MeshVertex3MeshVertex4 - 行:
MeshLine、、MeshEdgeMeshBSpline2D - 表面:
MeshTri3、、、MeshQuad4MeshPLCMeshNURBS - 固体:
MeshTet4、MeshHex8、MeshPyramid5、MeshTet10 - フレキシブルコンテナ:
MeshNode、、、MeshSurfMeshPolyMeshElem - CSG演算子:
CSGObject、、、CSGUnionCSGIntersectCSGSubtract - テクスチャ:
Texture1D、、Texture2DTexture3D - 2次元形状プリミティブ:
ShapeBox2、、、、、、、ShapeDisc2ShapeEllipseShapeLine2ShapeArrow2ShapeAnnulusShapeGrid2 - 3D形状プリミティブ:
ShapeLine3、、、、、、、、、、、、、、、ShapePlane3 ShapeBox3ShapeDisc3ShapeGrid3ShapeSphereShapeCylinderShapeEllipsoidShapeTorusShapeConeShapeConeFrustumShapeSphereShellShapeSphereSegment - 押し出しと回転:
ShapeExtrude2D、、ShapeExtrude3DShapeRevolve3D - プロパティ:
Color、、、、、NormalSizeLabelValue
頂点
"MeshVertex1"1 次元の位置ベクトルを定義します。これは、N 行 1 列または 1 行 N 列の数値ベクトルとして定義する必要があります。ここで、N は頂点の総数に等しくなります。このベクトルの値は、1 次元の頂点の座標になります。
"メッシュ頂点1": [x1、x2、x3、...]
"MeshVertex2"2 次元の位置ベクトルを定義します。これは、N 行 2 列の数値配列として定義する必要があります。ここで、N は頂点の総数です。この配列の各行には、頂点の座標が含まれます。
"MeshVertex2" : [ [ x 1 , y 1 ], [ x 2 , y 2 ], [ x 3 , y 3 ], ... ]
"MeshVertex3"3D 位置ベクトルを定義します。MeshVertex2 と同様に、N 行 3 列の数値配列として定義する必要があります。
"MeshVertex3" : [ [ x 1 , y 1 , z 1 ], [ x 2 , y 2 , z 2 ], [ x 3 , y 3 , z 3 ], ... ]
線分と曲線
"MeshPolyLine"ノード インデックス (1 から始まる) の順序付けられた 1 次元リストを使用して、線分のセットを定義します。これは、1 行 N 列または N 行 1 列の整数ベクトルで定義する必要があります。インデックスが 0 の場合、現在の線分の終わりを示し、次のインデックスから新しい線分が始まります。
"メッシュポリライン": [N1、N2、N3、...]
"MeshEdge"配列の各行にノード インデックスのペアを持つ 2 次元配列を使用して線分のセットを定義します。これは、N 行 2 列の整数配列で定義する必要があります。ここで、N はエッジの合計数です。
「メッシュエッジ」: [ [ N 11 、N 12 ]、[ N 21 、N 22 ]、[ N 31 、N 32 ]、... ]
表面
"MeshTri3"配列の各行に 3 つのノード インデックスを持つ三角形で構成された離散化されたサーフェスを定義します。これは、N 行 3 列の整数配列で定義する必要があります。ここで、N は三角形の総数です。
「メッシュTri3」: [ [ N 11 、N 12 、N 13 ]、[ N 21 、N 22 、N 23 ]、[ N 31 、N 32 、N 33 ]、... ]
"MeshQuad4"配列の各行に 4 つのノード インデックスを持つ四辺形で構成される離散化されたサーフェスを定義します。これは、N 行 4 列の整数配列で定義する必要があります。ここで、N は四辺形の合計数です。
「MeshQuad4」: [ [ N 11 、N 12 、N 13 、N 14 ]、[ N 21 、N 22 、N 23 、N 24 ]、[ N 31 、N 32 、N 33 、N 24 ]、... ]
"MeshPLC"均一またはさまざまなエッジ サイズのポリゴン (区分線形複素数) で構成された離散化されたサーフェスを定義します。これは、等しい長さまたはさまざまな長さの整数ベクトルの要素を持つ配列によって定義される必要があります。
「MeshPLC」: [ [ N 11 、N 12 、N 13 、... ]、[ N 21 、N 22 、N 23 、N 24 、... ]、[ N 31 、N 32 、N 33 、N 34 、... 、... ]、... ]
固体要素
"MeshTet4"四面体要素で構成された離散化された体積ドメインを定義します。各要素は 4 つのノード インデックスで構成されます。これは、N 行 4 列の整数配列で定義する必要があります。ここで、N は四面体の総数です。
「MeshTet4」: [ [ N 11 、N 12 、N 13 、N 14 ]、[ N 21 、N 22 、N 23 、N 24 ]、[ N 31 、N 32 、N 33 、N 34 ]、... ]
"MeshHex8"8 ノードの六面体要素で構成された離散化された体積ドメインを定義します。各要素は 8 組のノード インデックスで指定されます。これは N 行 8 列の整数配列で定義する必要があります。ここで、N は六面体の総数です。
"MeshHex8" : [ [ N 11 、N 12 、N 13 、... 、N 18 ]、[ N 21 、N 22 、N 23 、... 、N 28 ]、[ N 31 、N 32 、N 33 、... 、N 28 ]、... ]
"MeshPyramid5"5 ノードのピラミッド要素で構成される離散化されたボリューム ドメインを定義します。各要素は 5 タプルのノード インデックスで指定されます。これは N 行 5 列の整数配列で定義する必要があります。ここで、N はピラミッドの総数です。
"MeshPyramid5" : [ [ N 11 , N 12 , N 13 , ... , N 15 ], [ N 21 , N 22 , N 23 , ... , N 25 ], [ N 31 , N 32 , N 33 、... 、N 25 ]、... ]
"MeshTet10"10 ノードの直線四面体要素で構成される離散化された体積ドメインを定義します。各要素は 10 組のノード インデックスで指定されます。これは N 行 10 列の整数配列で定義する必要があります。ここで、N は 10 ノード四面体の総数です。
"MeshTet10" : [ [ N 11 、N 12 、N 13 、... 、N 1 _ 10 ]、[ N 21 、N 22 、N 23 、... 、N 2 _ 10 ]、[ N 31 、N 32 、N 33 、... 、N 2 _ 10 ]、... ]
配列の最初の 4 列は、 と同一の四面体の 4 つの頂点のインデックスを指定し"MeshTet4"、配列の最後の 6 列は、以下の順序でソートされた中間エッジ ノードのインデックスを指定します。
[N1、N2、N3、N4、N12、N13、N14、N22、N23、N34]
柔軟なメッシュデータコンテナ
柔軟なメッシュ データ コンテナーを使用すると、単純な 2D 配列を使用して、幅広いメッシュ データをエンコードできます。
"MeshNode"頂点座標とそれに関連するプロパティを格納するための柔軟なコンテナを定義します。これは、N 行 M 列の配列で定義する必要があります。ここで、N は頂点の数、M は座標の数 (D) と各頂点に付随する数値プロパティの数 (P) の合計です。つまり、M = D + P です。
「MeshNode」: [ [ x 11 、y 11 、z 11 、... 、w 1 D 、... 、v 11 、v 12 、... 、v 1 P ]、[ x 21 、y 21 、z 21 、... 、w 2 D 、... 、v 21 、v 22 、... 、v 2 P ]、[ x 31 、y 31 、z 31 、... 、w 3 D 、... 、v 31 、v 32 、... 、v 3 P ]、... ]
"MeshSurf"固定ノード長のサーフェス パッチとそれに関連するプロパティを格納するための柔軟なコンテナーを定義します。これは N 行 M 列の配列で定義する必要があります。ここで、N はサーフェス要素の数、M は要素あたりの頂点の数 (K) と各頂点に付随する数値プロパティの数 (P) の合計です。つまり、M = K + P です。
"MeshSurf" : [ [ N 11 , N 11 , ... , N 1 K , ... , v 11 , v 12 , ... , v 1 P ], [ N 21 , N 21 , ... , N 2 K , ... , v 21 , v 22 , ... , v 2 P ], [ N 31 , N 31 , ... , N 3 K , ... , v 31 , v 32 , ... , v 3 P ], ... ]
"MeshPoly"は、可変ノード長のサーフェス パッチとそれに関連するプロパティを格納するための柔軟なコンテナを定義します。 と同様に"MeshPLC"、整数ベクトルの要素を持つ配列によって定義される必要がありますが、各要素に追加のメタデータを含めることができます。サーフェス パッチを表す各ベクトルでは、ベクトルの最初の非数値エントリ (構造体やサブ配列など) がプロパティ データの開始を示します。
" MeshPoly " : [ [ N 11 、N 12 、N 13 、... 、{プロパティ}]、[ N 21 、N 22 、N 23 、N 24 、... ] 、[ N 31 、N 32 、N 33 、N 34 、... 、... 、[プロパティ] ] 、... ]
"MeshElem"体積要素とそれに関連するプロパティを格納するための柔軟なコンテナを定義します。これは、N 行 M 列の配列で定義する必要があります。ここで、N は表面要素の数、M は要素あたりの頂点の数 (K) と各頂点に付随する数値プロパティの数 (P) の合計です。つまり、M = K + P です。
"MeshElem" : [ [ N 11 , N 11 , ... , N 1 K , ... , v 11 , v 12 , ... , v 1 P ], [ N 21 , N 21 , ... , N 2 K , ... , v 21 , v 22 , ... , v 2 P ], [ N 31 , N 31 , ... , N 3 K , ... , v 31 , v 32 , ... , v 3 P ], ... ]
形状プリミティブ
- ShapeBox2 : 2 つの対角点 (一方の端が "O"、もう一方の端が "P") によって定義される 2 次元の軸に沿った境界ボックス (AABB)
"ShapeBox2": {"O":[x0,y0], "P": [x1,y1]}
- ShapeDisc2 : 中心 ("O") と半径 "r" で定義される 2 次元ディスク
"ShapeDisc2": {"O":[x0,y0], "R": r}
- ShapeEllipse : 中心 ("O")、回転されていない座標系の x 軸と y 軸 ("rx" と "ry")、および回転角度 "theta0" によって定義される 2 次元の楕円
"楕円形": {"O":[x0,y0], "R": [r1,r2], "角度":theta0}
- ShapeLine2 : 線に沿った 1 つの点 ("O") によって定義される 2 次元線と、線の方向と一致する 2 次元ベクトル ("V")
"ShapeLine2": {"O":[x0,y0], "V": [v1,v2]}
- ShapeArrow2 : 線に沿った 1 つの点 ("O") によって定義される 2 次元矢印オブジェクト。2 次元ベクトル ("V") は線の方向と一致し、矢印の先端のサイズはスカラー "s" によって示されます。
"ShapeArrow2": {"O":[x0,y0], "V": [v1,v2], "サイズ": s}
- 形状環状体: 中心 ("O")、外半径 (r1)、内半径 (r2) によって定義される 2 次元環状体
"ShapeAnnulus": {"O":[x0,y0], "R": [r1,r2]}
- ShapeGrid2 : 対角線の一方の端 ("O") ともう一方の端 ("P") によって定義される 2 次元グリッド。最初の座標と 2 番目の座標に沿ったセグメントの数は、それぞれ "Nx" と "Ny" で示されます。
"ShapeGrid2": {"O":[x0,y0]、"P": [x1,y1]、"ステップ":[Nx,Ny]}
- ShapeLine3 : 線に沿った 1 つの点 ("O") によって定義される 3D 線と、線の方向と一致する 3D ベクトル ("V")
"ShapeLine3": {"O":[x0,y0,z0], "V": [v1,v2,v3]}
- ShapePlane3 : 線に沿った 1 つの点 ("O") と、平面の法線方向を指す 3D ベクトル ("N") によって定義される 3D 平面
"ShapePlane3": {"O":[x0,y0,z0], "N": [v1,v2,v3]}
- ShapeBox3 : 2 つの対角点 (一方の端が「O」、もう一方の端が「P」) によって定義される 3D 軸平行境界ボックス (AABB)
"ShapeBox3": {"O":[x0,y0,z0], "P": [x1,y1,z1]}
- ShapeDisc3 : 中心 ("O") と半径 "R" で定義される 3D ディスク。ディスクの法線方向は "N" で指定されます。
"ShapeDisc3": {"O":[x0,y0,z0], "R": r, "N"=[v1,v2,v3]}
- ShapeGrid3 : 対角線の一方の端 ("O") ともう一方の端 ("P") によって定義される 3D グリッド。x/y/z 座標に沿ったセグメントの数は、それぞれ "Nx"、"Ny"、"Nz" で示されます。
"ShapeGrid3": {"O":[x0,y0,z0], "P": [x1,y1,z1], "ステップ":[Nx,Ny,Nz]}
- ShapeSphere : 中心 ("O") と半径 "r" で定義される 3D 球体
「シェイプスフィア」: {「O」:[x0,y0,z0], 「R」: r}
- ShapeCylinder : 円筒軸の一方の端 ("O") と軸のもう一方の端 "P" によって定義される 3D 円筒。円筒の半径は "r" で指定されます。
"円柱形状": {"O":[x0,y0,z0], "P":[x1,y1,z1], "R": r}
- ShapeEllipsoid : 中心位置 ("O")、回転前の座標系 (rx、ry、rz) の x、y、z 軸、方位角回転角 theta0 および天頂回転角 phi0 によって定義される 3D 楕円体
"楕円体の形状": {"O":[x0,y0,z0], "R": [rx,ry,rz], "角度":[theta0, phi0]}
- ShapeTorus : トーラスの中心 ("O")、トーラスの半径 (r1)、チューブの半径 (r2)、法線方向ベクトル "N" によって定義される 3D トーラス
"ShapeTorus": {"O":[x0,y0,z0]、"R": r1、"Rtube": r2、"N":[v1,v2,v3]}
- ShapeCone : 円錐の底円の中心 ("O")、底円の半径 (r)、および先端の位置 "P" によって定義される 3D 円錐
"シェイプコーン": {"O":[x0,y0,z0], "P": [x1,y1,z1], "R": r}
ソフトウェアライブラリ
JMesh 仕様はJData仕様に基づいて定義されているため、同じ基礎データ シリアル化形式 (テキストベースの JMesh ファイル (.jmsh) の場合はJSON 、バイナリベースの JMesh ファイル (.bmsh) の場合は BJData/ UBJSON)を共有します。ほとんどの既存の JSON パーサーは、テキストベースの JMesh ファイルを簡単に解析できます。同様に、既存の UBJSON パーサーを使用して、変更せずに .bmsh ファイルを解析できます。
MATLAB / GNU Octaveでは、3D メッシュ生成ツールボックスである Iso2Meshでsavejmesh、関数を介してメッシュ データを JMesh 形式で保存することがサポートされています。
参照
参考文献
外部リンク
- 公式サイト
- NeuroJSON プロジェクト
- Iso2Mesh 3Dメッシュ生成ツールボックス
- JData 仕様 (最新)
