Spørsmål:
Kan `gjengi`-funksjonen brukes til å øke gjengivelsen?
Lyndon White
2018-02-05 10:09:08 UTC
view on stackexchange narkive permalink

Jeg designer et moderat komplisert stykke i OpenScad.

Det gjengis raskt nok i forhåndsvisningsmodus (1s). Men når jeg gjør en full gjengivelse slik at jeg kan eksportere til STL, tar det aldre (i de ti minuttene)

Jeg har lest at funksjonen render noen ganger er nyttig for å øke hastigheten på gjengivelsen.

  • Er dette riktig, eller har jeg misforstått?
    • Hvis jeg har misforstått, hva er gjengi -funksjonen nyttig for?
  • Hvordan fungerer dette?
  • Under hvilke omstendigheter kan jeg bruke den?
Hvilken prosessorbrikke er det på PC-en din? Hvorfor tror du de spesielle funksjonene (union, forskjell) er problemet? Er det en grunn til at du ikke kan fullføre booleanene til et enkelt objekt før gjengivelse?
Hva betyr det å "fullføre booleanene til et enkelt objekt"? (Jeg trodde ganske gjengivelse kan være kommandoen for å gjøre dette, hvis det er det jeg tror det er) PC Proc er Core2 Duo E6750 2.66Ghz på en datamaskin, og i5-6400 2.70GHz på den andre. Jeg tror boolene er en problem fordi de er kjent for å være treg, de dukker opp i nesten hvert google-resultat om gjengivelseshastighet i hvert CAD-program.
Skjønt, for å være rettferdig, antar jeg at booleanere sannsynligvis dukker opp i hvert ikke-open-scad-eksempel, de er nyttige, jeg vil justere spørsmål
Greit nok - jeg tenkte i Meshmixer-termer, hvor sammenslåing av to objekter kan gjøres når som helst, før en endelig opprydding eller delvis gjengivelse.
@CarlWitthoft - Boolske operasjoner i CAD er * ekstremt * dyre, spesielt når overflatene som skal trimmes er buet. Faktisk er slike operasjoner så kompliserte at de ikke kan løses på en fornuftig tid, og av denne grunn bruker CAD-pakker tilnærminger som igjen gjør at de fleste 3D-modeller går i stykker (og genererer en og annen krasj). Googles "Surface-to-Surface Crossing Probleem" hvis du vil lære mer om dette! :)
En svar:
mac
2018-02-06 07:20:14 UTC
view on stackexchange narkive permalink

Først en ansvarsfraskrivelse: Jeg er langt fra en ekspert på emnet, jeg er bare en vanlig Joe som tilfeldigvis bruker OpenSCAD og har gjort noen eksperimenter med det. Jeg tror svaret nedenfor er riktig, men jeg vil være veldig takknemlig hvis feil eller misforståelser ble gjort oppmerksom på meg i kommentarene. :)

Jeg har lest at funksjonen gjengivelse noen ganger er nyttig for å øke hastigheten på gjengivelsen. Er dette riktig, eller har jeg misforstått det?

Jeg er ikke klar over om det er mulig å bruke render () for å øke hastigheten på "total gjengivelse", men Jeg er ganske trygg på at det tiltenkte formålet for render () er å forenkle representasjonen i minnet av modellen og dermed responsen til forhåndsvisningsvinduet , i stedet for å øke den endelige gjengivelsen.

Hvordan fungerer dette?

For å forstå hvordan dette fungerer, må man forstå hvordan konstruktiv solid geometri (CSG) fungerer.

Hele forutsetningen for CSG er at bruk av boolske operasjoner mellom primitive faste former, er det mulig å representere komplekse former.

Imidlertid, mens den menneskelige operatøren kan se subtraktive operasjoner som forskjell og skjæringspunkt som noe som gjør modellen mindre i volum og dermed muligens lettere å håndtere, datamaskinen ser hver eneste operasjon som legger til geometri og kompleksitet til delen, som følgende bilde passende illustrerer:

visuals vs in-memory model

Når du manipulerer modellen i CAD-visningsprogrammet, er OpenSCAD i forhåndsvisningsmodus og alt som "usynlig geometri" må behandles for hver justering av visningsområdet. Det er lett å nå et nivå der OpenSCAD-visningen blir nervøs eller ikke svarer.

Hva render () -funksjonen gjør, er å fortelle OpenSCAD å beregne masken som følge av de boolske operasjonene som er omsluttet av render () -anropet, og bruke det enkeltnettet i stedet for de underliggende boolske-kombinerte primitivene når du håndterer modellen i visningen. Netting er det som vanligvis brukes i gjengivelsesmodus av OpenSCAD (F6) i stedet for i forhåndsvisningen en, men her er deres fordel ikke bedre visuell kvalitet, men det faktum at OpenSCAD trenger å håndtere mye mindre geometri.

Under hvilke omstendigheter kan jeg bruke den?

Du kan bruke den når som helst du vil, egentlig, men det er en kompromiss : en modell som bruker render () -funksjonen internt, vil ta lenger tid å vise sin første forhåndsvisning (fordi å generere masken er en kostbar operasjon), men den vil oppføre seg veldig bra i betrakteren. Omvendt vil en stor modell som ikke utnytter render () være nervøs å håndtere i betrakteren, men den vil gjengis til skjerm i en brøkdel av tiden. Det må bemerkes at OpenSCAD benytter hurtigbufring tungt, så den første forhåndsvisningen er den som vil ta lengst tid, mens påfølgende kan være mye raskere.

small test

For referanse oppførte koden nederst i dette svaret (som genererer bildet ovenfor) slik:

  • Med gjengi () kode>: 15s for forhåndsvisning, 1m29s mer for riktig gjengivelse ( TOTAL: 1m44s ).
  • Uten gjengivelse () : 0s for forhåndsvisning , 1m45s mer for riktig gjengivelse ( TOTAL: 1m45s ).

Jeg vet ikke om det faktum at totalene ligner hverandre er et tilfeldighet som er spesiell for modellen min eller en generell tommelfingerregel (funksjonen render () skaper effektivt en del av den endelige gjengivelsen under forhåndsvisning), men du er fri til å leke med koden og hvis du finner ut et mønster, vær så snill å legge igjen en kommentar.

I den følgende koden må du kanskje øke rutenettstørrelsen til 20x20 hvis du vil se forskjellen i respons mellom vaniljekode og funksjonen render () .

Husk også å lukke og åpne OpenSCAD på nytt mellom testene, for å tømme hurtigbufferen.


  $ fn = 30; module shape () {render () difference () {sphere () ; sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, 90, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([45, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([- 45, 0, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, 45, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([0, -45, 0]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, 45]) sylinder (r = 0,3, h = 3, sentrum = sann); roter ([90, 0, -45]) sylinder (r = 0,3, h = 3, sentrum = sann); }} modullinje (x, y) {translate ([x * 2, y, 0]) form (); hvis (x > 0) linje (x - 1, y);} modul rutenett (x, y) {linje (x, y * 2); hvis (y > 0) rutenett (x, y - 1);} rutenett (3, 3);  


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...