Kõigepealt lahtiütlus: ma pole kaugeltki selle teema asjatundja, olen lihtsalt tavaline Joe, kes juhtumisi kasutab OpenSCAD-i ja on sellega veidi katsetanud. Usun, et allpool toodud vastus on õige, kuid olen väga tänulik, kui kommentaarides juhiti minu tähelepanu vigadele või väärarusaamadele. :)
Olen lugenud, et mõnikord on renderdamise funktsioon kasulik üldise renderdamise kiirendamiseks. Kas see on õige või olen ma valesti aru saanud?
Ma ei tea, kas "üldise renderdamise" kiirendamiseks on võimalik kasutada render ()
, kuid Olen üsna kindel, et render ()
-i sihtotstarve on mudeli mälus oleva kujutise ja seega eelvaate akna reageerimise lihtsustamine , selle asemel et kiirendada selle lõplikku renderdamist.
Kuidas see töötab?
Selle töö mõistmiseks tuleb mõista, kuidas töötab konstruktiivne tahke geomeetria (CSG).
CSG kogu eeldus on see, et kasutades logioperatsioone primitiivsete tahkete kujundite vahel, on võimalik esitada keerukaid kujundeid. Inimoperaator võib näha lahutavaid toiminguid nagu erinevus ja ristmik midagi, mis muudab mudeli mahult väiksemaks ja võib-olla hõlpsamini käsitsetavaks. geomeetria ja keerukus osale, nagu illustreerib tabavalt järgmine pilt:
CAD-i vaataja mudeli manipuleerimisel on OpenSCAD eelvaate režiim ja kogu see "nähtamatu geomeetria" tuleb iga vaateava korrigeerimise jaoks töödelda. On lihtne jõuda tasemeni, kus OpenSCAD-i vaataja muutub närviliseks või ei reageeri.
Funktsioon render ()
teeb OpenSCAD-ile käsu arvutada render ()
-kõnesse lisatud tõeväärtustoimingutest tulenev võrk ja kasutada see üksik võrgusilma aluseks olevate boolean-kombineeritud primitiivide asemel mudelis vaataja käsitsemisel. Võrgusilmi kasutatakse tavaliselt OpenSCAD (F6) renderdamisrežiimis , mitte eelvaates. üks, kuid siin pole nende eeliseks parem visuaalne kvaliteet, vaid see, et OpenSCAD peab hakkama saama palju vähem geomeetriaga.
Millistel tingimustel saan seda rakendada?
Saate seda rakendada igal ajal, kui soovite, kuid see on kompromiss : mudel, mis kasutab funktsiooni render ()
sisemiselt, võtab esialgse eelvaate kuvamiseks kauem (kuna võrgusilma genereerimine on kallis toiming), kuid see käitub vaatajas väga hästi. Seevastu suurt mudelit, mis ei kasuta funktsiooni render ()
, on vaatajas küll närvitsev käsitseda, kuid see kuvatakse ekraanil murdosa ajast. Tuleb märkida, et OpenSCAD kasutab vahemällu palju, nii et esimene eelvaade võtab kõige kauem aega, samas kui järjestikused võivad olla palju kiiremad.
Viitamiseks käitus selle vastuse allosas olev kood (mis loob ülaltoodud pildi) järgmiselt:
- With
render ()
: eelvaate jaoks 15s, korraliku renderdamise jaoks 1m29s rohkem ( KOKKU: 1m44s ). - Ilma
render'ita ()
: 0s eelvaate jaoks , 1m45s rohkem korraliku renderdamise jaoks ( KOKKU: 1m45s ).
Ma ei tea, kas see, et kogusummad üksteisega sarnanevad, on minu mudelile omane kokkusattumus või üldine rusikareegel (funktsioon render ()
loob eelvaate ajal osa lõplikust renderdamisest, kuid võite vabalt koodiga mängida ja kui leiate mustri, jätke kommentaar.
Järgmises koodis peate võib-olla suurendama ruudustiku suurust 20x20-ni, kui soovite näha vanillikoodi ja funktsiooni render ()
reageerimisvõime erinevust.
Ärge unustage vahemälu tühjendamiseks ka testide vahel OpenSCAD sulgeda ja uuesti avada.
$ fn = 30; mooduli kuju () {render () erinevus () {sfäär () ; silinder (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([90, 0, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([0, 90, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([45, 0, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([- 45, 0, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([0, 45, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([0, -45, 0]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([90, 0, 45]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); pöörake ([90, 0, -45]) silindrit (r = 0,3, h = 3, keskpunkt = tõene); }} moodulirida (x, y) {translate ([x * 2, y, 0]) kuju (); if (x > 0) rida (x - 1, y);} mooduliruudustik (x, y) {rida (x, y * 2); if (y > 0) ruudustik (x, y - 1);} ruudustik (3, 3);