Korak 1: Priprema modela
Biranje modela
Modele možemo izabrati i skinuti sa bilo koje od brojnih besplatnih biblioteka (Free3D, cgtrader… neke zahtevaju registraciju).Iz iskustva zaključili smo da model bi trebao da bude u obj. formatu, “polygon mesh” geometrije po mogućnosti ispod 10.000 poligona (game ready, low poly), i sastavljen od što manje zasebnih mesh-ova (3D printable ready). Takođe treba napomenuti da modeli iz softveras “blender” i “zbrush” su se pokazali lakim za rad.
U ovoj vežbi smo koristili modele koje ispunjavaju i ne ispunjavaju sve ove kriterijume da bi pokazali i moguće probleme u radu i probali da time unapredimo algoritam.
Korišćeni modeli:
- https://free3d.com/3d-model/diplodocus-v1–471374.html
- https://free3d.com/3d-model/american-paint-horse-nuetral-v1–575385.html
- https://free3d.com/3d-model/low-poly-tree-96065.html
- https://www.cgtrader.com/3d-models/furniture/chair/le-bambole-armchair-bb-italia
Uvoženje modela
Kad skinemo sa nekog od sajtova rar. datoteku i iz njega izvučemo obj. fajl modela, najjednostavnije da ga prevučemo u prozor otvorenog rhnoceros-a i idemo: import file>nothing; import OBJ objects (čekiraj)>ok.
Model proveriti, obrisati ako ima neki element viška. Proveriti merne jedinice: Tools>Options>Units i podesimo po želji. Takođe proveriti skalu i podesiti. Ako model ima previše poligona, moguće je dosta bezbedno smanjiti broj sa Mesh>Mesh Edit Tools> Reduce (izaberemo procenat).
Zbog načina na koji ćemo praviti algoritam nije neophodno da model bude centriran na presek osa (nultu tačku), ali je bitno da bude uspravan.
Korak 2: Smišljanje algoritma
Osnova algoritma
Trebamo da ima mesto za uvoženje modela (mesh) i kutiju (box) formiranu u odnosu na model.Kutiji ćemo takođe dati mogućnost rotacije (Rotate) i skaliranja (Scale). Ona će nam poslužiti kao mali koordinantni sistem u odnosu na koji ćemo sve pozicionirati i menjati dalje u algoritmu, pa ćemo je sa komandom DeBrep rastaviti na potrebne delove. Posle bilo koji od elemenata biramo sa definiciom Item, index elementa biramo sa NumberSlider-om. Ovo će nam dati mogućnost da ne moramo precizno postavljati model da bi radili sa njim i takođe omogućava rad sa više modela istovremeno.
Pozicioniranje preseka
Treba odrediti osu (zapravo duž) u odnosu na koju sečemo model, broj preseka kao i njihov raspored ako je moguće.
Ose uzimamo sa naše osnovne kutije iz prethodnog koraka. Broj preseka treba da bude podesiv i nalazimo ga tako što dužinu ose (tj osu) delimo sa željenim brojem (NumbSlid+PFrames) da bi našli dužinu segmenta između preseka. Rasporedom smo manipulisali na način, umesto da ostavimo duž sa ravnima preseka (isti onaj NumbSlid+PFrames) (ravni su upravne na duž), i te ravni da seku model (PlOrigin>Sec), mi smo tu duž zakrivili (End;A+B;Item>Cat) (podesivo je). Ako stavimo da ortogonalni preseci na zakrivljenoj duži seku (PCX) pravu duž, (sa istim početnim i krajnjim tačkama) dobićemo novi raspored presečnih tačaka, povećane gustine u centralnoj zoni. Takođe moguće je fino podesiti preseke “levo-desno” tj “napred-nazad”(Move) proporcionalno po dužini ose.
*Iako postoji comanda contour, koja je jednostavnija za pripremu, konstantnije rezultate preseka smo dobijali sa mesh/plane (sec) komandom.
Uređivanje preseka
Pri operaciji mesh/plane(sec) može doći do određenih problema i neželjenih rezultata kao što su neželjeni preseci, otvorene linije ili prekomplikovane konture.
Neželjene preseke ćemo rešiti ručnim otklanjanjem, čekiranjem (ValueList>Item). Otvorene linije rešavamo pronalaženjem njihovih krajeva i spajanjem (Crv>End>Line>Join). Prekomplikovane ili oštre konture se rešavaju direktno komandama RedPLine i SmoothPLine.
*Postoje situacije kada imamo 2 ili više preklapajućih koplanarnih kontura a željeni rezultat je njihova unija tada koristimo komandu RUnion, ali često ume da se ponaša na nepredvidiv način. Ovo zahteva ručno prespajanje algoritma.
Zasecanje preseka
Da bi zasekli preseke moramo prvo da im damo debljinu (extr). Pre extruzije ćemo pomeriti presek za polovinu dužine u suprotnom pravcu vektora pomeranja (Move sa expresiom -(x/2)). Vektor pomeranja pravimo od krajnjih tačaka (end) jedne od horizontalnih linija iz naše kutije na početku i komande Vec2Pt. Rezultat ćemo podeliti (A/B) sa dužinom prvobitne horizontalne duzi (End>Ln>Len) da bi doboli jedinični vektor koji je lakši za rad. Ovo je deo kad se 2 stabla algoritma spajaju. Ukrštamo preseke sa komandom BBX, nepravilnosti ispravljamo sa BBox i pomeramo ih za polovinu dužine elemenata po Z osi u oba smera, ovde smo opet razdvojili algoritam. Radi sigurnosti skaliramo elemente minimalno i sa SDiff komandom volumene štapova oduzmemo od preseka.
*Kod štapova koji imaju kratke prekide desi se da komanda BBox zanemari prekid i što bi trebalo da bude 2 iliviše kolinearna štapa pretvori u 1. Ovo nekad znači da dođe do potpunog otsecanja elemenata od celine, i bivaju neupotrebljivi. Ovo za sad ispravljamo prosto nalaženjem boljih preseka, ali bi trebalo naći bolje rešenje.
Prostiranje preseka po površini
Da bi model pripremili za 2d sečenje, od dobijenih zasečenih tvorevina (preseka) trebamo da uzmemo odgovarajuće konturne (Item>Plane) linije i da ih prostremo (Orient) po željenoj površini, koju uzmemo odakle želimo, organizovane u tabelu pomoću komande RecGrid. Na kraju smo numerisali preseke (Points) radi lakšeg raspoznavanja pri sklapanju.
*Način organizacije preseka bi trebalo možda jednostavnije uraditi.