Küsimus:
Kas renderdamise kiirendamiseks saab kasutada funktsiooni `renderdamine '?
Lyndon White
2018-02-05 10:09:08 UTC
view on stackexchange narkive permalink

Kujundan OpenScadis mõõdukalt keerukat tükki.

See renderdatakse eelvaate režiimis (1 s) piisavalt kiiresti. Kuid kui ma teen täieliku renderduse, et saaksin STL-i eksportida, võtab see vanust (sisse 10 minutit)

Olen lugenud, et mõnikord on funktsioon render üldise renderdamise kiirendamiseks kasulik.

  • Kas see on õige või kas olen valesti aru saanud?
    • Kui olen valesti aru saanud, milleks on funktsioon render kasulik?
  • Kuidas see töötab?
  • Millistel asjaoludel saan seda rakendada?
Mis protsessori kiip on teie arvutis? Mis te arvate, miks just need konkreetsed funktsioonid (liit, erinevus) on probleem? Kas on põhjust, miks te ei saa enne renderdamist booleansi lõplikuks objektiks lõplikult vormistada?
Mida tähendab "logifailide lõplik vormistamine üheks objektiks"? (Ma arvasin, et renderdamine võib olla käsk seda teha, kui see minu arvates on) PC Proc on ühes arvutis Core2 Duo E6750 2,66Ghz ja teises i5-6400 2,70GHz. Ma arvan, et boolid on kuna nad on teadaolevalt aeglased, ilmuvad need peaaegu igas Google'i tulemuses renderdamise kiiruse kohta igas CAD-programmis.
Ehkki ausalt öeldes, arvan, et Booleanid ilmuvad ilmselt igas mittekokkuvõtlikus openScadi näites, neist on kasu, ma näpistan küsimust
Piisavalt õiglane - mõtlesin Meshmixeri mõistes, kus kahe objekti ühendamine võib toimuda igal ajal, enne lõplikku puhastamist või osade renderdamist.
@CarlWitthoft - Boole'i ​​toimingud CAD-is on * äärmiselt * kallid, eriti kui kärpimist vajavad pinnad on kõverad. Tegelikult on sellised toimingud nii keerulised, et neid pole mõistliku aja jooksul võimalik lahendada, ja seetõttu kasutavad CAD-paketid ligikaudseid andmeid, mis omakorda teevad enamiku 3D-mudelitest katki (ja põhjustavad aeg-ajalt krahhi). Google "Pinna-pinna ristumiskoha probleem", kui soovite sellest rohkem teada saada! :)
üks vastus:
mac
2018-02-06 07:20:14 UTC
view on stackexchange narkive permalink

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:

visuals vs in-memory model

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.

small test

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);  


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...