Jump to content

JMesh

JMesh
Расширение имени файла
.jmsh, .bmsh
Тип интернет-СМИ
приложение/json
Введите код ТЕКСТ и ДВОИЧНЫЙ
Разработано Цяньцянь Фан
Первоначальный выпуск 16 сентября 2020 г .; 3 года назад ( 16.09.2020 ) [ 1 ]
Последний выпуск
1.0 Драфт 1
16 сентября 2020 г .; 3 года назад ( 16.09.2020 ) [ 2 ]
Тип формата Обмен данными
Расширено с JSON , JData
Открытый формат ? Да
Веб-сайт openjdata .org

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 функция.

См. также

[ редактировать ]
  1. ^ «Спецификация JMesh — Версия 1, черновик 1» . Гитхаб . 14 марта 2022 г.
  2. ^ «НейроJSON/jmesh» . Гитхаб . 14 марта 2022 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a9b2214aa82c51e12ea84ee6130f84be__1710408780
URL1:https://arc.ask3.ru/arc/aa/a9/be/a9b2214aa82c51e12ea84ee6130f84be.html
Заголовок, (Title) документа по адресу, URL1:
JMesh - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)