Struktura STL datoteke

Nakon obavljenog 3D skeniranja, prvo pitanje korisnika je: “U kom programu mogu da otvorim STL datoteku?”

Skoro da nema softvera za 3D modeliranje koji ne može da otvori ono što je zapisano u STL datoteci. STL datoteka sadrži “mrtvu geometriju”, odnosno skup trouglova koji predstavljaju model površine posmatranog objekta. Svaki trougao (u daljem tekstu faset) definisan je vektorom normale na površinu i temenima trougla zapisanim u pozitivnom matematičkom smeru u odnosu na vektor normale.

stl

Imajući ovo na umu, vrlo je jasno da čuvanje oblaka tačaka ili poligonalnog modela u bilo kom drugom formatu (IGES, STP i nativni formati savremenih softvera za 3D modeliranje) ne može da unese nikakav novi kvalitet u model. Model koji se sastoji od matematički definisanih površina, kakve su na primer NURBS ili osnovni geometrijski oblici (površi, srefe, kupe, …), dobija se isključivo procesom koji se naziva reverzni inženjering.

Zbog toga, u nastavku ovog teksta dajemo objašnjenje strukture STL datoteke u ASCII i binarnom obliku, kao i nestandardizovane modifikacije formata koje sadrže i podatke o boji poligonalne mreže.

ASCII STL

ASCII STL datoteka počinje linijom:

solid name

gde je name opcioni string. Datoteka se nastavlja sa proizvoljnim brojem trouglova, pri čemu je svaki opisan na sledeći način:

facet normal ni nj nk
    outer loop
        vertex v1x v1y v1z
        vertex v2x v2y v2z
        vertex v3x v3y v3z
    endloop
endfacet

gde je svaki n ili v realni broj zapisan u eksponencijalnom formatu (na primer, “2.648000e-002”). Datoteka se završava linijom:

endsolid name

Binarni STL

Pošto ASCII STL datoteka može da sadrži veliki broj trouglova, njena veličina može da se smanji zapisivanjem u binarnoj verziji STL datoteke. Binarna STL datoteka ima heder od 80 karaktera. Softvei uglavnom ignorišu ovu liniju i ona ne bi smela da počne terminom “solid” koji mnoge softvere navodi da se radi o ASCII STL datoteci. U sledećoj liniji zapisan je 4-bitni integer koji označava broj trouglova u datoteci. Datoteka se završava poslednjim trouglom.

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

Informacija o boji poligonalne mreže u binarnoj STL datoteci

Postoje najmanje dve nestandardizovane varijacije binarnog STL formata u kojima je sadržana i informacija o boji poligonalne mreže, na kraju svakog trougla za čuvanje 15-bit RGB boje:

  • Varijanta 1 (VisCAM i SolidView)
    • bitovi od 0 do 4 predstavljaju intenzitet plave boje (0 to 31),
    • bitovi od 5 do 9 predstavljaju intenzitet zelene boje (0 to 31),
    • bitovi od 10 do 14 predstavljaju intenzitet crvene boje (0 to 31),
    • bit 15 ima vrednost 1 ako boja postoji, ili 0 ukoliko boja ne postoji (kao kod standardizovane STL datoteke).
  • Varijanta 2 (Materialise Magics):
    • bitovi od 0 do 4 predstavljaju intenzitet crvene boje (0 to 31),
    • bitovi od 5 do 9 predstavljaju intenzitet zelene boje (0 to 31),
    • bitovi od 10 do 14 predstavljaju intenzitet plave boje (0 to 31),
    • bit 15 ima vrednost 0 ako boja postoji, ili 1 ukoliko boja ne postoji (kao kod standardizovane STL datoteke).

Vektor normale na faset

I kod ASCII i binarne verzije STL datoteke, vektor normale na facet treba da bude jedinični vektor spoljašnje normale na površinu. U većini softvera ovaj vektor može biti definisan skupom (0,0,0), pa softver automatski određuje normalu na osnovu redosleda temena trouglova korišćenjem pravila desne ruke. Neki od softvera za učitavanje (na primer STL plugin za Art of Illusion) proveravaju da li normala zapisana u datoteci odgovara normali izračunatoj korišćenjem pravila desne ruke i obaveštava korisnika ukoliko ove vrednosti nisu jednake, sa zadatom tolerancijom. Ostali softveri mogu potpuno da ignorišu zapisanu normalu na faset i koriste izračunatu pravilom desne ruke. Da bi STL datoteka bila potpuno portabilna, treba da sadrži pravilno određen vektor normale na faset i temena zapisana prema odgovarajućem redosledu.