STL (от англ.stereolithography) — формат файла, широко[4][5] используемый для хранения трёхмерных моделей объектов для использования в аддитивных технологиях. Информация об объекте хранится как список треугольных граней, которые описывают его поверхность, и их нормалей. STL-файл может быть текстовым (ASCII) или двоичным. Своё название получил от сокращения термина «Stereolithography», поскольку изначально применялся именно в этой технологии трёхмерной печати.
где name — необязательная строка (но если name опущено, всё равно должен быть пробел после solid). Файл продолжается произвольным числом треугольников, описываемых следующим способом:
facet normal ni nj nk
outer loop
vertex v1xv1yv1z
vertex v2xv2yv2z
vertex v3xv3yv3z
endloop
endfacet
где каждое n и v — число с плавающей точкой в формате: знак, мантисса, «e», знак, экспонента, например «-2.648000e-002». Файл завершается строкой:
endsolid name
Двоичный формат
Поскольку файл ASCII STL может быть очень большим, существует двоичная версия этого формата. Файл начинается с заголовка из 80 символов (который обычно игнорируется, но не должен начинаться с 'solid', так как с этой последовательности начинается файл ASCII STL). После заголовка идёт 4-байтовое беззнаковое целое число (little-endian), указывающее количество треугольных граней в данном файле. После этого идут данные, характеризующие каждый треугольник, в свою очередь.
Каждый треугольник описывается двенадцатью 32-битными числами с плавающей запятой: 3 числа для нормали и по 3 числа на каждую из трёх вершин для координат X/Y/Z. После идут 2 байта беззнакового 'short', который называется 'attribute byte count'. В обычном файле должно быть равно нулю, так как большинство программ не понимает других значений.[6]
Числа с плавающей запятой представляются в виде числа IEEE с плавающей запятой и имеют обратный порядок байтов, хотя это не указано в документации.
UINT8[80] – Header
UINT32 – Number of triangles
foreach triangle
REAL32[3] – Normal vector
REAL32[3] – Vertex 1
REAL32[3] – Vertex 2
REAL32[3] – Vertex 3
UINT16 – Attribute byte count
end
Цвета в двоичном STL
Существует как минимум 2 способа добавления информации о цвете:
VisCAM и SolidView используют 2 байта 'attribute byte count' в конце описания каждого треугольника для хранения 15 бит цвета RGB:
биты с 0 по 4 — уровень интенсивности для синего (0 до 31)
биты с 5 по 9 — уровень интенсивности для зелёного (0 до 31)
биты с 10 по 14 — уровень интенсивности для красного (0 до 31)
если бит 15 равен 1, то цвет используется
если бит 15 равен 0, то цвет не используется (для совместимости со стандартным STL)
Materialise Magics работает по-другому. Он использует 80 байт заголовка для представления общего цвета. Также там может быть представлена информация о материале. Цвет каждой грани описывается в 'attribute byte count' как:
биты с 0 по 4 — уровень интенсивности для красного (0 до 31)
биты с 5 по 9 — уровень интенсивности для зелёного (0 до 31)
биты с 10 по 14 — уровень интенсивности для синего (0 до 31)
если 15 равен 0, то данная грань имеет свой цвет
если 15 равен 1, то используется цвет всего объекта
Нормали граней
В двоичной и ASCII-версиях STL нормаль грани должна быть единичным вектором, направленным от объекта. В большинстве программ она может быть установлена в (0,0,0), и программа автоматически рассчитает нормаль на основе порядка вершин треугольника, используя правило правой руки. Некоторые загрузчики STL (к примеру, плагин STL для Art of Illusion) сверяют нормали в файле с рассчитанными по правилу правой руки и предупреждают при несовпадении. Другое ПО может игнорировать и использовать только правило правой руки.
Недостатки
Невысокая точность геометрии[7] (в версии ASCII можно задавать произвольную точность).