JMesh

JMesh
OpenJData.png
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 . ; 2 lata temu ( 2020-09-16 )
Najnowsze wydanie

1.0 Wersja robocza 1 16 września 2020 r . ; 2 lata temu ( 2020-09-16 )
Typ formatu Wymiana danych
Przedłużony od JSON , JData
Otwarty format ? Tak
Strona internetowa openjdata.org _

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

Marching tetrahedrons.png

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 .

Zobacz też

Linki zewnętrzne