JMesh
Rozszerzenie nazwy pliku |
.jmsh, .bmsh
|
---|---|
Rodzaj mediów internetowych |
aplikacja/json
|
Wpisz kod | TEKSTOWE i BINARNE |
Opracowany przez | Qianqian Fang |
Pierwsze wydanie | 16 września 2020 r |
Najnowsze wydanie | 1.0 Wersja robocza 1 16 września 2020 r |
Typ formatu | Wymiana danych |
Przedłużony od | JSON , JData |
Otwarty format ? | Tak |
Strona internetowa |
JMesh to przenośny i rozszerzalny format plików oparty na formacie JSON do przechowywania i wymiany nieustrukturyzowanych danych geometrycznych, w tym geometrii dyskretyzowanych, takich jak siatki trójkątne i czworościenne, geometrii parametrycznych, takich jak krzywe i powierzchnie NURBS, oraz geometrii konstrukcyjnych, takich jak konstruktywna geometria bryłowa (CGS ) prymitywów kształtów i siatek. Zbudowany w oparciu o JData , plik JMesh wykorzystuje JSON i Universal Binary JSON ( UBJSON ) do serializacji i kodowania struktur danych geometrycznych, dlatego może być bezpośrednio przetwarzany przez większość istniejących parserów JSON i UBJSON. Specyfikacja JMesh definiuje listę konstrukcji kompatybilnych z JSON do kodowania danych geometrycznych, w tym wierzchołków N-wymiarowych (ND), krzywych, powierzchni, elementów bryłowych, prymitywów kształtu, ich interakcji (takich jak CGS) i relacji przestrzennych wraz z powiązanymi z nimi właściwości, takie jak wartości liczbowe, kolory, normalne, materiały, tekstury i inne właściwości związane z manipulacją danymi graficznymi, wytwarzaniem trójwymiarowym, renderowaniem grafiki komputerowej i animacjami.
Przykład pliku JMesh
Następująca siatka (czworościenna siatka sześcianu jednostkowego) zawiera 8 trójwymiarowych wierzchołków, 12 trójkątnych ścian i 6 czworościennych elementów
Powyższą siatkę można zapisać w formacie JMesh/JSON jako
{ "_DataInfo_":{ "JMeshVersion":0.5, "CreationTime":"19-gru-2021 11:53:43", "Comment":"Utworzono przez 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], [0,1,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] ] }
Opcjonalny rekord „_DataInfo_”
może zawierać dodatkowe metadane zgodnie ze specyfikacją JData .
Zamiast używać konstrukcji danych siatki specyficznych dla wymiarów, tj. MeshVertex3
, MeshTri3
i MeshTet4
, można je również zastąpić odpowiednimi elastycznymi kontenerami danych siatki, odpowiednio MeshNode
, MeshSurf
i MeshElem
. Zaleca się dodanie „Dimension”: 3
w nagłówku metadanych „_DataInfo_”
, aby pomóc parserom poprawnie przetwarzać dane liczbowe w każdym wpisie.
Alternatywnie, zgodnie ze specyfikacjami JMesh i JData , powyższe tablice 2-D w stylu JSON można przechowywać jako strukturę przy użyciu formatu tablicy ND z adnotacjami JData , aby dodać obsługę dodatkowego typu danych binarnych, jak poniżej
{ "_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,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] } }
W przypadku dużych plików danych siatki kompresja na poziomie rekordu jest obsługiwana przez specyfikację JData . Dla celów ilustracyjnych powyższe dane JMesh można również zapisać jako
{ "_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_":"eJwFwYcNAAAIArAAMv6/2BY8MNBBhQOXOy7aafXi9QEJtwCj"}, "MeshElem":{ "_ArrayType_":"uint8", "_ArraySize_":[6,4], "_ArrayZipSize_ ":[1,24], "_ArrayZipType_":"zlib", "_ArrayZipData_":"eJxjZGLhYGQGYiY2DkZWIGZmB9LsHAAExABt" } }
gdzie ciągi znaków w „_ArrayZipData_”
przechowują serializowany główny wiersz, skompresowany Zlib i zakodowany w Base64 strumień binarny nieprzetworzonych danych tablicy binarnej z precyzją określoną w _ArrayType_
. Kompresja danych na poziomie rekordu może znacznie zmniejszyć rozmiar podczas przechowywania dużych plików siatkowych.
Przegląd formatu
Składnia JMesh
Wszystkie pliki JMesh są zgodne ze specyfikacją JData . Podobnie jak JData, ma zarówno format tekstowy oparty na schemacie serializacji JSON, jak i format binarny oparty na schemacie serializacji UBJSON.
Prawie wszystkie obsługiwane kontenery danych typu mesh (tj. nazwane węzły JData) można zdefiniować przy użyciu jednej z dwóch form: tablicy ND lub struktury.
Forma tablicowa
W przypadku prostych danych można użyć „formularza tablicy” do przechowywania danych pod słowem kluczowym JMesh. W takim przypadku format danych musi być zgodny z „N-Dimensional Array Storage Keyword” zdefiniowanymi w specyfikacji JData. Na przykład można przechowywać tablicę 1-D lub 2-D przy użyciu bezpośredniego formatu przechowywania jako
"jmesh_container_1d": [v1,v2,...,vn], "jmesh_container_2d": [[v11,v12,...,v1n], [v21,v22,...,v2n], ... [vm1 ,vm2,...,vmn] ]
lub używając formatu „pamięć z adnotacjami” as
"jmesh_container_nd": { "_ArrayType_": "nazwa typu", "_ArraySize_": [N1,N2,N3,...], "_ArrayData_": [v1,v2,v3,...] }
Forma struktury
Można również użyć struktury JData do przechowywania danych podstawowych, jak również do obsługi dodatkowych metadanych powiązanych z kontenerem. Na przykład kontener oparty na strukturze może mieć poniższe pola podrzędne:
"jmesh_container_struct": { "_DataInfo_":{ ... }, "Dane":[ ... ], "Właściwości": [ ... ] }
tylko podpole „Dane”
i musi ono zawierać te same dane przechowywane w „formie tablicy” (w formacie bezpośrednim lub z adnotacjami), jak pokazano powyżej.
Opcjonalne podpole „Właściwości”
umożliwia przechowywanie dodatkowych danych z tym elementem kształtu/siatki. Podpole "Właściwości"
może być tablicą lub strukturą z dodatkowymi polami podrzędnymi.
Opcjonalne „_DataInfo_”
to konstrukcja JData do przechowywania metadanych powiązanych z tą strukturą. Może służyć do przechowywania prostych metadanych, takich jak data pozyskania danych, nazwa operatora czy numer wersji. Strategie dzielenia metadanych między _DataInfo_
i Properties
zależą od użytkownika.
Podsumowanie słów kluczowych JMesh
Większość słów kluczowych kontenerów danych powiązanych z dyskretyzowanymi geometriami ma przedrostek „Siatka”
; słowa kluczowe związane z parametrycznymi konstrukcjami kształtu mają przedrostek „Kształt”
; słowa kluczowe związane z konstruktywnymi geometriami bryłowymi mają przedrostek „CSG”
. Wiele słów kluczowych kończy się wartością liczbową, która zazwyczaj reprezentuje numer kolumny danych przechowywanych w formacie tablicowym.
-
Grupowanie siatki :
MeshGroup
,MeshObject
,MeshPart
-
Wierzchołki :
MeshVertex1
,MeshVertex2
,MeshVertex3
,MeshVertex4
-
Linie :
MeshLine
,MeshEdge
,MeshBSpline2D
-
Powierzchnie :
MeshTri3
,MeshQuad4
,MeshPLC
,MeshNURBS
-
Bryła :
MeshTet4
,MeshHex8
,MeshPyramid5
,MeshTet10
-
Elastyczne kontenery :
MeshNode
,MeshSurf
,MeshPoly
,MeshElem
-
Operatory CSG :
CSGObject
,CSGUnion
,CSGIntersect
,CSGSubtract
-
Tekstura :
Tekstura1D
,Tekstura2D
,Tekstura3D
-
Prymitywy kształtu 2-D :
ShapeBox2
,ShapeDisc2
,ShapeEllipse
,ShapeLine2
,ShapeArrow2
,ShapeAnnulus
,ShapeGrid2
-
Prymitywy kształtu 3-W :
ShapeLine3
,ShapePlane3
,ShapeBox3
,ShapeDisc3
,ShapeGrid3
,ShapeSphere
,ShapeCylinder
,ShapeEllipsoid
,ShapeTorus
,ShapeCone
,ShapeConeFrustum
,ShapeSphereShell
,ShapeSphereSegment
-
Wytłaczanie i obracanie :
ShapeExtrude2D
,ShapeExtrude3D
,ShapeRevolve3D
-
Właściwości :
Kolor
,Normalny
,Rozmiar
,Etykieta
,Wartość
Wierzchołki
-
„MeshVertex1”
definiuje wektor pozycji 1-D. Musi być zdefiniowany jako wektor liczbowy N na 1 lub 1 na N, gdzie N jest równe całkowitej liczbie wierzchołków. Wartości w tym wektorze będą współrzędnymi wierzchołków 1-D.
"MeshVertex1": [x1,x2,x3,...]
-
"MeshVertex2"
definiuje dwuwymiarowy wektor pozycji. Musi być zdefiniowana jako tablica numeryczna N na 2, gdzie N to całkowita liczba wierzchołków. Każdy wiersz tej tablicy zawiera współrzędne wierzchołka.
„SiatkaVertex2”: [[x1,y1], [x2,y2], [x3,y3], ... ]
-
„SiatkaVertex3”
definiuje trójwymiarowy wektor pozycji. Podobnie jak MeshVertex2, musi być zdefiniowana jako tablica liczbowa N na 3.
"Siatka Wierzchołek3": [[x1,y1,z1], [x2,y2,z2], [x3,y3,z3], ...]
Segmenty linii i krzywe
-
„MeshPolyLine”
definiuje zestaw segmentów linii przy użyciu uporządkowanej 1-D listy indeksów węzłów (zaczynając od 1). Musi być zdefiniowany przez wektor liczb całkowitych 1 na N lub N na 1. Jeśli indeks wynosi 0, oznacza koniec bieżącego segmentu linii i rozpoczyna nowy segment linii od następnego indeksu.
„MeshPolyLine”: [N1, N2, N3, ... ]
-
„MeshEdge”
definiuje zestaw segmentów linii przy użyciu tablicy 2-D z parą indeksów węzłów w każdym rzędzie tablicy. Musi być zdefiniowana przez tablicę liczb całkowitych N na 2, gdzie N to całkowita liczba krawędzi.
„Krawędź siatki”: [[N11,N12], [N21,N22], [N31,N32], ...]
Powierzchnie
-
„MeshTri3”
definiuje zdyskretyzowaną powierzchnię złożoną z trójkątów z trójką indeksów węzłów w każdym rzędzie tablicy. Musi być zdefiniowany przez tablicę liczb całkowitych N na 3, gdzie N to całkowita liczba trójkątów.
„MeshTri3”: [ [N11, N12, N13], [N21, N22, N23], [N31, N32, N33], ... ] „MeshQuad4”
-
definiuje
zdyskretyzowaną powierzchnię wykonaną z czworoboku z czwórką indeksów węzłów w każdy wiersz tablicy. Musi być zdefiniowany przez tablicę liczb całkowitych N na 4, gdzie N to całkowita liczba czworokątów.
„MeshQuad4”: [[N11, N12, N13, N14], [N21, N22, N23, N24], [N31, N32, N33, N24], ... ] „MeshPLC” definiuje dyskretyzowaną powierzchnię utworzoną z
-
wielokątów
( częściowy kompleks liniowy) o jednolitych lub zróżnicowanych rozmiarach krawędzi. Musi być zdefiniowany przez tablicę z elementami wektorów całkowitych o równej lub różnej długości.
"MeshPLC": [ [N11, N12, N13, ...], [N21, N22, N23, N24, ...], [N31, N32, N33, N34, ..., ...], . .. ]
Solidne elementy
-
„MeshTet4”
definiuje zdyskretyzowaną domenę objętościową utworzoną z elementów czworościennych, przy czym każdy element składa się z czwórki indeksów węzłów. Musi być zdefiniowany przez tablicę liczb całkowitych N na 4, gdzie N to całkowita liczba czworościanów.
„MeshTet4”: [[N11, N12, N13, N14], [N21, N22, N23, N24], [N31, N32, N33, N34], ... ] „MeshHex8” definiuje zdyskretyzowaną domenę objętościową złożoną
-
z
8 -węzłowe elementy szesnastkowe, z każdym elementem określonym przez 8-krotkowy indeks węzła. Musi być zdefiniowany przez tablicę liczb całkowitych N na 8, gdzie N to całkowita liczba sześcianów.
"MeshHex8": [ [N11, N12, N13, ..., N18], [N21, N22, N23, ..., N28], [N31, N32, N33, ..., N28], ... ]
-
„MeshPyramid5”
definiuje zdyskretyzowaną domenę wolumetryczną utworzoną z 5-węzłowych elementów piramidy, z każdym elementem określonym przez indeks 5-krotek węzłów. Musi być zdefiniowana przez tablicę liczb całkowitych N na 5, gdzie N to całkowita liczba piramid.
"MeshPiramida5": [N11, N12, N13, ..., N15], [N21, N22, N23, ..., N25], [N31, N32, N33, ..., N25], ... ]
-
„MeshTet10”
definiuje zdyskretyzowaną domenę objętościową utworzoną z 10-węzłowych elementów czworościennych w linii prostej, przy czym każdy element jest określony przez 10-krokowy indeks węzłów. Musi być zdefiniowany przez tablicę liczb całkowitych N na 10, gdzie N to całkowita liczba czworościanów 10-węzłowych.
"MeshTet10": [N11, N12, N13, ..., N1_10], [N21, N22, N23, ..., N2_10], [N31, N32, N33, ..., N2_10], ... ]
Pierwsze 4 kolumny tablicy określają indeksy 4 wierzchołków czworościanu, identyczne z "MeshTet4"
, a ostatnie 6 kolumn tablicy określa indeksy węzłów środkowej krawędzi, posortowane w następującej kolejności:
[N1, N2, N3, N4, N12, N13, N14, N22, N23, N34]
Elastyczne kontenery danych siatki
Elastyczne kontenery danych siatki umożliwiają kodowanie szerokiego zakresu danych siatki przy użyciu prostej tablicy 2-D.
-
„MeshNode”
definiuje elastyczny kontener do przechowywania współrzędnych wierzchołków i powiązanych właściwości. Musi być zdefiniowany przez tablicę N na M, gdzie N to liczba wierzchołków, a M to liczba współrzędnych (D) plus liczba właściwości numerycznych (P) dołączonych wzdłuż każdego wierzchołka, tj. M = D + P
"Węzeł siatki": [x11, y11, z11, ..., w1D, ..., v11, v12, ..., v1P], [x21, y21, z21, ..., w2D, ... , v21, v22, ..., v2P], [x31, y31, z31, ..., w3D, ..., v31, v32, ..., v3P], ... ] "MeshSurf
-
"
definiuje elastyczny kontener do przechowywania łat powierzchni o stałej długości węzłów i powiązanych właściwości. Musi być zdefiniowany przez tablicę N na M, gdzie N to liczba elementów powierzchniowych, a M to liczba wierzchołków na element (K) plus liczba właściwości liczbowych (P) dołączonych wzdłuż każdego wierzchołka, tj. M = K + P
"MeshSurf": [ [N11, N11, ..., N1K, ..., v11, v12, ..., v1P], [N21, N21, ..., N2K, ..., v21, v22, ..., v2P], [N31, N31, ..., N3K, ..., v31, v32, ..., v3P], ... ] "
-
MeshPoly"
definiuje elastyczny kontener do przechowywania łat powierzchni o zmiennej długości węzłów i powiązanych właściwości. Podobnie jak„MeshPLC”
, musi być zdefiniowany przez tablicę z elementami wektorów całkowitych, ale może zawierać dodatkowe metadane w każdym elemencie. Dla każdego wektora reprezentującego łatę powierzchni, pierwszy wpis nienumeryczny, na przykład struktura lub podtablica wektora, oznacza początek danych właściwości.
"MeshPoly": [[N11, N12, N13, ..., {właściwości}], [N21, N22, N23, N24, ...], [N31, N32, N33, N34, ..., .. ., [właściwości] ], ... ]
-
"MeshElem"
definiuje elastyczny kontener do przechowywania elementów objętościowych i powiązanych właściwości. Musi być zdefiniowany przez tablicę N na M, gdzie N to liczba elementów powierzchniowych, a M to liczba wierzchołków na element (K) plus liczba właściwości liczbowych (P) dołączonych wzdłuż każdego wierzchołka, tj. M = K + P
"MeshElem": [ [N11, N11, ..., N1K, ..., v11, v12, ..., v1P], [N21, N21, ..., N2K, ..., v21, v22, ..., v2P], [N31, N31, ..., N3K, ..., v31, v32, ..., v3P], ... ]
Prymitywy kształtu
- ShapeBox2 : prostokąt ograniczający 2-W wyrównany do osi (AABB) zdefiniowany przez dwa punkty po przekątnej („O” jako jeden koniec i „P” jako drugi koniec) „ShapeBox2”: {„O”:[x0
, y0], "P": [x1,y1]}
- ShapeDisc2 : Dwuwymiarowy dysk zdefiniowany przez środek („O”) i promień „r”
„ShapeDisc2”: {„O”:[x0,y0], „ R": r}
- ShapeEllipse : Dwuwymiarowa elipsa zdefiniowana przez środek („O”), osie x i y w nieobróconym układzie współrzędnych („rx” i „ry”) oraz kąt obrotu „theta0”
"ShapeEllipse": {"O":[x0,y0], "R": [r1,r2], "Angle":theta0} ShapeLine2
- : Dwuwymiarowa linia zdefiniowana przez jeden punkt wzdłuż linii („O”) , a dwuwymiarowy wektor („V”) jest wyrównany z kierunkiem linii
„ShapeLine2”: {„O”:[x0,y0], „V”: [v1,v2]}
- ShapeArrow2 : A 2-D obiekt strzałki zdefiniowany przez jeden punkt wzdłuż linii („O”), a wektor 2-D („V”) jest wyrównany z kierunkiem linii, a rozmiar grotu strzałki jest oznaczony skalarnym „s”
"ShapeArrow2": {"O":[x0,y0], "V": [v1,v2], "Size": s} ShapeAnnulus : Dwuwymiarowy
- pierścień zdefiniowany przez środek („O”) i promień zewnętrzny (r1) i promień wewnętrzny (r2)
"ShapeAnnulus": {"O":[x0,y0], "R": [r1,r2]}
- ShapeGrid2 : Dwuwymiarowa siatka zdefiniowana przez jeden koniec linia ukośna („O”), a drugi koniec („P”); numery segmentów wzdłuż pierwszej i drugiej współrzędnej są oznaczone odpowiednio przez „Nx” i „Ny”.
"ShapeGrid2": {"O":[x0,y0], "P": [x1,y1], "Step":[Nx,Ny]} ShapeLine3 : Trójwymiarowa linia zdefiniowana przez jeden punkt wzdłuż
- linii ( „O”), a trójwymiarowy wektor („V”) jest wyrównany z kierunkiem linii
„ShapeLine3”: {„O”:[x0,y0,z0], „V”: [v1,v2,v3 ]}
- ShapePlane3 : Trójwymiarowa płaszczyzna zdefiniowana przez jeden punkt wzdłuż linii („O”) i trójwymiarowy wektor („N”) wskazujący normalny kierunek płaszczyzny „
ShapePlane3”: {„O”: [x0,y0,z0], "N": [v1,v2,v3]}
- ShapeBox3 : Trójwymiarowa prostokątna granica wyrównana do osi (AABB) zdefiniowana przez dwa przekątne („O” na jednym końcu i „P” na drugim końcu) „ShapeBox3”: {„O”:[x0,
y0 ,z0], "P": [x1,y1,z1]}
- ShapeDisc3 : Trójwymiarowy dysk zdefiniowany przez środek ("O") i promień "R"; normalny kierunek dysku jest określony w "N"
"ShapeDisc3": {"O":[x0,y0,z0], "R": r, "N"=[v1,v2,v3]}
- ShapeGrid3 : Trójwymiarowa siatka zdefiniowana przez jeden koniec ukośnej linii („O”) i drugi koniec („P”); numery segmentów wzdłuż współrzędnych x/y/z są oznaczone odpowiednio przez „Nx”, „Ny” i „Nz”, odpowiednio „
ShapeGrid3”: {„O”:[x0,y0,z0], „P”: [ x1,y1,z1], "Step":[Nx,Ny,Nz]}
- ShapeSphere : Kula 3-W zdefiniowana przez środek ("O") i promień "r"
"ShapeSphere": {"O":[ x0,y0,z0], "R": r}
- Walec kształtu : Cylinder trójwymiarowy określony przez jeden koniec osi cylindrycznej („O”) i drugi koniec osi „P”; promień walca jest określony w "r"
"ShapeCylinder": {"O":[x0,y0,z0], "P":[x1,y1,z1], "R": r} ShapeEllipsoid :
- A 3 -D elipsoida zdefiniowana przez położenie środkowe („O”), osie x, y i z we wstępnie obróconym układzie współrzędnych (rx, ry, rz) oraz azymutalny kąt obrotu theta0 i zenitowy kąt obrotu phi0 „ShapeEllipsoid”
: {"O":[x0,y0,z0], "R": [rx,ry,rz], "Kąt":[theta0, phi0]} Torus
- kształtu : Trójwymiarowy torus zdefiniowany przez środek torusa („O”), promień torusa (r1) i promień rury (r2) oraz wektor kierunku normalnego „N” „ShapeTorus”: {„O
” :[x0,y0,z0], "R": r1, "Rtube": r2, "N":[v1,v2,v3]} Stożek kształtu : Trójwymiarowy stożek zdefiniowany
- przez środek dolnego okręgu stożek („O”), promień dolnego okręgu (r) i położenie wierzchołka „P”
„ShapeCone”: {„O”:[x0,y0,z0], „P”: [x1,y1,z1 ], "R": r}
Biblioteka oprogramowania
Ponieważ specyfikacja JMesh jest zdefiniowana w oparciu o specyfikację JData , ma te same podstawowe formaty serializacji danych, tj. JSON dla tekstowych plików JMesh (.jmsh) i BJData/ UBJSON dla binarnych plików JMesh (.bmsh). Większość istniejących parserów JSON może z łatwością analizować tekstowe pliki JMesh i podobnie, istniejące parsery UBJSON mogą być używane do analizowania plików .bmsh bez modyfikacji.
W MATLAB / GNU Octave zapisywanie danych siatki do formatu JMesh jest obsługiwane w Iso2Mesh - zestawie narzędzi do generowania siatki 3-D - za pośrednictwem funkcji savejmesh
.