STL (від англ.stereolithography) — формат файлу, який широко[3][4] застосовують для зберігання тривимірних моделей об'єктів для використання в адитивних технологіях. Інформація про об'єкт зберігається як список трикутних граней, які описують його поверхню, та їхніх нормалей. STL-файл може бути текстовим (ASCII) або двійковим. Свою назву отримав від скорочення терміну «Stereolithography», оскільки спочатку застосовувався саме в цій технологіїтривимірного друку.
ASCII STL
Файл типу ASCII STL починається з рядка:
solid name
де name — необов'язковий рядок (але якщо name опущено, після solid все одно має бути пропуск). Файл продовжується довільним числом описів трикутників такого вигляду:
facet normal ni nj nk
outer loop
vertex v1xv1yv1z
vertex v2xv2yv2z
vertex v3xv3yv3z
endloop
endfacet
де кожне n і v — число з рухомою комою у форматі: знак, мантиса, «e», знак, порядок, наприклад «-2.648000e-002». Файл завершується рядком:
Двійковий формат
Оскільки файл ASCII STL може бути великим, існує двійкова версія цього формату. Файл починається із заголовка з 80 символів (який зазвичай нехтується, але не може починатися зі 'solid', оскільки з цієї послідовності починається файл ASCII STL). Після заголовка йде 4-байтове беззнакове ціле число (little-endian), що вказує на кількість трикутних граней у файлі. Після цього йдуть дані, що характеризують кожен із трикутників.
Кожен трикутник описують дванадцятьма 32-бітовими числами з рухомою комою: 3 числа для нормалі та по 3 числа на кожну з трьох вершин для координат X/Y/Z. Далі йдуть 2 байти беззнакового 'short', яке називається 'attribute byte count'. У звичайному файлі має дорівнювати нулю, оскільки більшість програм не розуміє інших значень[5].
Числа з рухомою комою подають у вигляді числа IEEE з рухомою комою та мають зворотний порядок байтів, хоча цього не зазначено в документації.
UINT8[80] – заголовок
UINT32 – число трикутників
для кожного з трикутників
REAL32[3] – вектор нормалі
REAL32[3] – вершина 1
REAL32[3] – вершина 2
REAL32[3] – вершина 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) звіряють нормалі у файлі з розрахованими за правилом правої руки і попереджають про розбіжності. Інше програмне забезпечення може нехтувати це і використовувати лише правило правої руки.
Недоліки
Невисока точність геометрії[6] (у версії ASCII можна задавати довільну точність).