JMesh
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
![]() | |
Расширение имени файла |
.jmsh, .bmsh |
---|---|
Тип интернет-СМИ |
приложение/json |
Введите код | ТЕКСТ и ДВОИЧНЫЙ |
Разработано | Цяньцянь Фан |
Первоначальный выпуск | 16 сентября 2020 г [ 1 ] |
Последний выпуск | 1.0 Драфт 1 16 сентября 2020 г [ 2 ] |
Тип формата | Обмен данными |
Расширено с | JSON , JData |
Открытый формат ? | Да |
Веб-сайт | openjdata |
JMesh — это портативный и расширяемый формат файлов на основе JSON для хранения и обмена неструктурированными геометрическими данными, включая дискретизированную геометрию, такую как треугольные и тетраэдральные сетки, параметрическую геометрию, такую как кривые и поверхности NURBS, а также конструктивную геометрию, такую как конструктивная твердотельная геометрия (CGS). ) примитивов формы и сеток. Созданный на основе спецификации JData , файл JMesh использует конструкции JSON и Universal Binary JSON ( UBJSON ) для сериализации и кодирования геометрических структур данных, поэтому его можно напрямую обрабатывать большинством существующих анализаторов JSON и UBJSON. Спецификация JMesh определяет список JSON-совместимых конструкций для кодирования геометрических данных, включая N-мерные (ND) вершины, кривые, поверхности, твердотельные элементы, примитивы форм, их взаимодействия (например, CGS) и пространственные отношения, а также связанные с ними свойства, такие как числовые значения, цвета, нормали, материалы, текстуры и другие свойства, связанные с манипулированием графическими данными, 3D-производством, рендерингом компьютерной графики и анимацией.
Пример файла JMesh
[ редактировать ]Следующая сетка (тетраэдральная сетка единичного куба) содержит 8 трехмерных вершин, 12 треугольных граней и 6 тетраэдрических элементов.
Вышеуказанную сетку можно сохранить в формате JMesh/JSON как
{
"_DataInfo_":{
"JMeshVersion":0.5,
"CreationTime":"19-Dec-2021 11:53:43",
"Comment":"Created by 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]
]
}
Необязательный "_DataInfo_"
запись может содержать дополнительные метаданные согласно спецификации JData .
Вместо использования конструкций данных сетки для конкретных размеров, т.е. MeshVertex3
, MeshTri3
, и MeshTet4
, их также можно заменить соответствующими контейнерами данных гибкой сетки, MeshNode
, MeshSurf
, и MeshElem
, соответственно. Рекомендуется добавить "Dimension": 3
в "_DataInfo_"
заголовок метаданных, который помогает синтаксическим анализаторам правильно обрабатывать числовые данные в каждой записи.
В качестве альтернативы, согласно спецификациям JMesh и JData , вышеуказанные двумерные массивы в стиле JSON могут быть сохранены в виде структуры с использованием формата массива ND с аннотациями JData для добавления дополнительной поддержки типов двоичных данных, как показано ниже.
{
"_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]
}
}
Для больших файлов данных сетки сжатие на уровне записи поддерживается через спецификацию 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_":"eJwFwYcNAAAIArAAMv6/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 или структуры.
Форма массива
[ редактировать ]Для простых данных можно использовать «форму массива» для хранения данных под ключевым словом JMesh. В таком случае формат данных должен соответствовать правилам «Ключевое слово хранилища N-мерного массива», определенным в спецификации JData. Например, можно сохранить одномерный или двумерный массив, используя формат прямого хранения как
"jmesh_container_1d": [v1,v2,...,vn],
"jmesh_container_2d": [
[v11,v12,...,v1n],
[v21,v22,...,v2n],
...
[vm1,vm2,...,vmn]
]
или используя формат «аннотированного хранилища» как
"jmesh_container_nd": {
"_ArrayType_": "typename",
"_ArraySize_": [N1,N2,N3,...],
"_ArrayData_": [v1,v2,v3,...]
}
Форма структуры
[ редактировать ]Можно также использовать структуру JData для хранения первичных данных, а также для поддержки дополнительных метаданных, связанных с контейнером. Например, контейнер на основе структуры может иметь следующие подполя:
"jmesh_container_struct": {
"_DataInfo_":{
...
},
"Data":[
...
],
"Properties": [
...
]
}
Только "Data"
Подполе является обязательным и должно содержать те же данные, которые хранятся в «форме массива» (в прямом или аннотированном формате), как показано выше.
Необязательный "Properties"
Подполе позволяет хранить дополнительные данные с этим элементом формы/сетки. "Properties"
подполе может быть массивом или структурой с дополнительными подполями.
Необязательный "_DataInfo_"
— это конструкция JData для хранения метаданных, связанных с этой структурой. Его можно использовать для хранения простых метаданных, таких как дата получения данных, имя оператора или номер версии. Стратегии разделения метаданных между _DataInfo_
и Properties
зависит от пользователя.
Сводка ключевых слов JMesh
[ редактировать ]Большинство ключевых слов контейнера данных, связанных с дискретной геометрией, имеют префикс "Mesh"
; Ключевые слова, связанные с параметрическими конструкциями фигур, имеют префикс "Shape"
; Ключевые слова, связанные с конструктивной твердотельной геометрией, имеют префикс "CSG"
. Многие ключевые слова заканчиваются числовым значением, которое обычно представляет номер столбца данных при хранении в формате массива.
- Группировка сетки :
MeshGroup
,MeshObject
,MeshPart
- Вершины :
MeshVertex1
,MeshVertex2
,MeshVertex3
,MeshVertex4
- Линии :
MeshLine
,MeshEdge
,MeshBSpline2D
- Поверхности :
MeshTri3
,MeshQuad4
,MeshPLC
,MeshNURBS
- Твердый :
MeshTet4
,MeshHex8
,MeshPyramid5
,MeshTet10
- Гибкие контейнеры :
MeshNode
,MeshSurf
,MeshPoly
,MeshElem
- Операторы CSG :
CSGObject
,CSGUnion
,CSGIntersect
,CSGSubtract
- Текстура :
Texture1D
,Texture2D
,Texture3D
- Примитивы двумерной формы :
ShapeBox2
,ShapeDisc2
,ShapeEllipse
,ShapeLine2
,ShapeArrow2
,ShapeAnnulus
,ShapeGrid2
- Примитивы трехмерных форм :
ShapeLine3
,ShapePlane3
,ShapeBox3
,ShapeDisc3
,ShapeGrid3
,ShapeSphere
,ShapeCylinder
,ShapeEllipsoid
,ShapeTorus
,ShapeCone
,ShapeConeFrustum
,ShapeSphereShell
,ShapeSphereSegment
- Экструзия и вращение :
ShapeExtrude2D
,ShapeExtrude3D
,ShapeRevolve3D
- Характеристики :
Color
,Normal
,Size
,Label
,Value
Вершины
[ редактировать ]"MeshVertex1"
определяет одномерный вектор положения. Он должен быть определен как числовой вектор размером N на 1 или 1 на N, где N равно общему количеству вершин. Значения в этом векторе должны быть координатами одномерных вершин.
"MeshVertex1": [x1,x2,x3,...]
"MeshVertex2"
определяет двумерный вектор положения. Он должен быть определен как числовой массив размером N×2, где N — общее количество вершин. Каждая строка этого массива содержит координаты вершины.
"MeshVertex2": [
[x1,y1],
[x2,y2],
[x3,y3],
...
]
"MeshVertex3"
определяет трехмерный вектор положения. Подобно MeshVertex2, он должен быть определен как числовой массив размером N на 3.
"MeshVertex3": [
[x1,y1,z1],
[x2,y2,z2],
[x3,y3,z3],
...
]
Сегменты линий и кривые
[ редактировать ]"MeshPolyLine"
определяет набор сегментов линий, используя упорядоченный одномерный список индексов узлов (начиная с 1). Он должен быть определен вектором целых чисел размером 1 на N или N на 1. Если индекс равен 0, он отмечает конец текущего сегмента линии и начинает новый сегмент линии со следующего индекса.
"MeshPolyLine": [N1, N2, N3, ... ]
"MeshEdge"
определяет набор сегментов линии, используя двумерный массив с парой индексов узлов в каждой строке массива. Он должен быть определен целочисленным массивом размером N на 2, где N — общее количество ребер.
"MeshEdge": [
[N11,N12],
[N21,N22],
[N31,N32],
...
]
Поверхности
[ редактировать ]"MeshTri3"
определяет дискретизированную поверхность, состоящую из треугольников с тройкой индексов узлов в каждой строке массива. Он должен быть определен целочисленным массивом размером N на 3, где N — общее количество треугольников.
"MeshTri3": [
[N11, N12, N13],
[N21, N22, N23],
[N31, N32, N33],
...
]
"MeshQuad4"
определяет дискретизированную поверхность, состоящую из четырехугольника с четверкой индексов узлов в каждой строке массива. Он должен быть определен целочисленным массивом размером N на 4, где N — общее количество четырехугольников.
"MeshQuad4": [
[N11, N12, N13, N14],
[N21, N22, N23, N24],
[N31, N32, N33, N24],
...
]
"MeshPLC"
определяет дискретизированную поверхность, состоящую из многоугольников (кусочно-линейный комплекс) с одинаковыми или разными размерами ребер. Он должен быть определен массивом с элементами целочисленных векторов одинаковой или различной длины.
"MeshPLC": [
[N11, N12, N13, ...],
[N21, N22, N23, N24, ...],
[N31, N32, N33, N34, ..., ...],
...
]
Твердые элементы
[ редактировать ]"MeshTet4"
определяет дискретизированную объемную область, состоящую из тетраэдрических элементов, где каждый элемент состоит из четверки индексов узлов. Он должен быть определен целочисленным массивом размером Nx4, где N — общее количество тетраэдров.
"MeshTet4": [
[N11, N12, N13, N14],
[N21, N22, N23, N24],
[N31, N32, N33, N34],
...
]
"MeshHex8"
определяет дискретизированную объемную область, состоящую из 8-узловых шестигранных элементов, причем каждый элемент задается индексом узла из 8 кортежей. Он должен быть определен целочисленным массивом размером N на 8, где N — общее количество шестигранников.
"MeshHex8": [
[N11, N12, N13, ..., N18],
[N21, N22, N23, ..., N28],
[N31, N32, N33, ..., N28],
...
]
"MeshPyramid5"
определяет дискретизированную объемную область, состоящую из 5-узловых элементов пирамиды, где каждый элемент задается индексом узла из 5 кортежей. Он должен быть определен целочисленным массивом размером Nx5, где N — общее количество пирамид.
"MeshPyramid5": [
[N11, N12, N13, ..., N15],
[N21, N22, N23, ..., N25],
[N31, N32, N33, ..., N25],
...
]
"MeshTet10"
определяет дискретизированную объемную область, состоящую из 10-узловых прямолинейных тетраэдрических элементов, причем каждый элемент задается индексом узла из 10 кортежей. Он должен быть определен целочисленным массивом размером N на 10, где N — общее количество тетраэдров с 10 узлами.
"MeshTet10": [
[N11, N12, N13, ..., N1_10],
[N21, N22, N23, ..., N2_10],
[N31, N32, N33, ..., N2_10],
...
]
Первые 4 столбца массива задают индексы 4 вершин тетраэдра, идентичные "MeshTet4"
, а последние 6 столбцов массива указывают индексы узлов среднего края, отсортированные в следующем порядке:
[N1, N2, N3, N4, N12, N13, N14, N22, N23, N34]
Гибкие сетчатые контейнеры данных
[ редактировать ]Гибкие контейнеры данных сетки позволяют кодировать широкий спектр данных сетки, используя простой двумерный массив.
"MeshNode"
определяет гибкий контейнер для хранения координат вершин и связанных с ними свойств. Он должен быть определен массивом размером N на M, где N — количество вершин, а M — количество координат (D) плюс количество числовых свойств (P), прикрепленных вдоль каждой вершины, т. е. M = D + П
"MeshNode": [
[x11, y11, z11, ..., w1D, ..., v11, v12, ..., v1P],
[x21, y21, z21, ..., w2D, ..., v21, v22, ..., v2P],
[x31, y31, z31, ..., w3D, ..., v31, v32, ..., v3P],
...
]
"MeshSurf"
определяет гибкий контейнер для хранения участков поверхности фиксированной длины и связанных с ними свойств. Он должен быть определен массивом размером N на M, где N — количество элементов поверхности, а M — количество вершин на элемент (K) плюс количество числовых свойств (P), прикрепленных вдоль каждой вершины, т. е. M = К + П
"MeshSurf": [
[N11, N11, ..., N1K, ..., v11, v12, ..., v1P],
[N21, N21, ..., N2K, ..., v21, v22, ..., v2P],
[N31, N31, ..., N3K, ..., v31, v32, ..., v3P],
...
]
"MeshPoly"
определяет гибкий контейнер для хранения участков поверхности с переменной длиной узла и связанных с ними свойств. Похоже на:"MeshPLC"
, он должен определяться массивом с элементами целочисленных векторов, но может содержать дополнительные метаданные в каждом элементе. Для каждого вектора, представляющего участок поверхности, первая нечисловая запись вектора, например структура или подмассив, отмечает начало данных свойства.
"MeshPoly": [
[N11, N12, N13, ..., {properties}],
[N21, N22, N23, N24, ...],
[N31, N32, N33, N34, ..., ..., [properties] ],
...
]
"MeshElem"
определяет гибкий контейнер для хранения объемных элементов и связанных с ними свойств. Он должен быть определен массивом размером N на M, где N — количество элементов поверхности, а M — количество вершин на элемент (K) плюс количество числовых свойств (P), прикрепленных вдоль каждой вершины, т. е. M = К + П
"MeshElem": [
[N11, N11, ..., N1K, ..., v11, v12, ..., v1P],
[N21, N21, ..., N2K, ..., v21, v22, ..., v2P],
[N31, N31, ..., N3K, ..., v31, v32, ..., v3P],
...
]
Примитивы формы
[ редактировать ]- ShapeBox2 : двумерная ограничивающая рамка, выровненная по оси (AABB), определяемая двумя диагональными точками («O» как один конец и «P» как другой конец).
"ShapeBox2": {"O":[x0,y0], "P": [x1,y1]}
- ShapeDisc2 : двумерный диск, определяемый центром («O») и радиусом «r».
"ShapeDisc2": {"O":[x0,y0], "R": r}
- ShapeEllipse : двумерный эллипс, определяемый центром («O»), осями x и y в неповернутой системе координат («rx» и «ry») и углом поворота «theta0».
"ShapeEllipse": {"O":[x0,y0], "R": [r1,r2], "Angle":theta0}
- ShapeLine2 : двумерная линия, определяемая одной точкой вдоль линии («O»), а двумерный вектор («V») выравнивается по направлению линии.
"ShapeLine2": {"O":[x0,y0], "V": [v1,v2]}
- ShapeArrow2 : объект двумерной стрелки, определяемый одной точкой вдоль линии («O»), а двумерный вектор («V») выравнивается по направлению линии, а размер стрелки обозначается скаляром. "с"
"ShapeArrow2": {"O":[x0,y0], "V": [v1,v2], "Size": s}
- ShapeAnnulus : двумерное кольцевое пространство, определяемое центром («O»), внешним радиусом (r1) и внутренним радиусом (r2).
"ShapeAnnulus": {"O":[x0,y0], "R": [r1,r2]}
- ShapeGrid2 : двумерная сетка, определяемая одним концом диагональной линии («O») и другим концом («P»); номера сегментов по первой и второй координате обозначены «Nx» и «Ny» соответственно
"ShapeGrid2": {"O":[x0,y0], "P": [x1,y1], "Step":[Nx,Ny]}
- ShapeLine3 : трехмерная линия, определяемая одной точкой вдоль линии («O»), а трехмерный вектор («V») выравнивается по направлению линии.
"ShapeLine3": {"O":[x0,y0,z0], "V": [v1,v2,v3]}
- ShapePlane3 : трехмерная плоскость, определяемая одной точкой вдоль линии («O») и трехмерным вектором («N»), указывающим на нормальное направление плоскости.
"ShapePlane3": {"O":[x0,y0,z0], "N": [v1,v2,v3]}
- ShapeBox3 : трехмерная ограничивающая рамка, выровненная по оси (AABB), определяемая двумя диагональными точками («O» как один конец и «P» как другой конец).
"ShapeBox3": {"O":[x0,y0,z0], "P": [x1,y1,z1]}
- ShapeDisc3 : трехмерный диск, определяемый центром («O») и радиусом «R»; нормальное направление диска указано «N»
"ShapeDisc3": {"O":[x0,y0,z0], "R": r, "N"=[v1,v2,v3]}
- ShapeGrid3 : трехмерная сетка, определяемая одним концом диагональной линии («O») и другим концом («P»); количество сегментов по координатам x/y/z обозначается «Nx», «Ny» и «Nz» соответственно.
"ShapeGrid3": {"O":[x0,y0,z0], "P": [x1,y1,z1], "Step":[Nx,Ny,Nz]}
- ShapeSphere : трехмерная сфера, определяемая центром («O») и радиусом «r».
"ShapeSphere": {"O":[x0,y0,z0], "R": r}
- ShapeCylinder : трехмерный цилиндр, определяемый одним концом цилиндрической оси («O») и другим концом оси «P»; радиус цилиндра указан в «r»
"ShapeCylinder": {"O":[x0,y0,z0], "P":[x1,y1,z1], "R": r}
- ShapeEllipsoid : трехмерный эллипсоид, определяемый положением центра («O»), осями x, y и z в предварительно повернутой системе координат (rx, ry, rz), а также углом азимутального вращения theta0 и углом вращения зенита phi0.
"ShapeEllipsoid": {"O":[x0,y0,z0], "R": [rx,ry,rz], "Angle":[theta0, phi0]}
- ShapeTorus : трехмерный тор, определяемый центром тора («O»), радиусом тора (r1) и радиусом трубки (r2) и вектором направления нормали «N».
"ShapeTorus": {"O":[x0,y0,z0], "R": r1, "Rtube": r2, "N":[v1,v2,v3]}
- ShapeCone : трехмерный конус, определяемый центром нижнего круга конуса («O»), радиусом нижнего круга (r) и положением кончика «P».
"ShapeCone": {"O":[x0,y0,z0], "P": [x1,y1,z1], "R": r}
Библиотека программного обеспечения
[ редактировать ]Поскольку спецификация JMesh определяется на основе спецификации JData , она использует одни и те же базовые форматы сериализации данных, т.е. JSON для текстовых файлов JMesh (.jmsh) и BJData / UBJSON для двоичных файлов JMesh (.bmsh). Большинство существующих анализаторов JSON могут легко анализировать текстовые файлы JMesh, и аналогичным образом существующие анализаторы UBJSON можно использовать для анализа файлов .bmsh без изменений.
В MATLAB / GNU Octave сохранение данных сетки в формате JMesh поддерживается в Iso2Mesh — наборе инструментов для создания 3-D сетки — через savejmesh
функция.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Спецификация JMesh — Версия 1, черновик 1» . Гитхаб . 14 марта 2022 г.
- ^ «НейроJSON/jmesh» . Гитхаб . 14 марта 2022 г.