Gå til innhold

openGL flate vs kant normaler


Anbefalte innlegg

jeg sliter med normalene mine.

 

1. vertex arrays virker som forutsetter normaler per hjørne, mens glBegin()-glEnd() med tilhørende glNormal3f ser ut til å forutsette flatenormaler. tar jeg feil? kan jeg gjøre noe med dette slik at jeg kan rendre vertexarrays med flatenormaler og omvendt?

 

2. .obj filene jeg leser eksporterer flatenormaler. Jeg vet at alle hosliggende flater til etvert punkt er trekanter. kan jeg gjøre noen billige anntakelser/smarte triks/gode teknikker for å finne normaler per kant?

 

3. Det virker som om openGL bare kan rendre glatte skygger med kantnormaler. Er det noe jeg kan gjøre med det? (glShadeModel(GL_SMOOTH vs glShadeModel(GL_SOLID) );

 

 

takk for all hjelp.

Lenke til kommentar
Videoannonse
Annonse
jeg sliter med normalene mine.

 

1. vertex arrays virker som forutsetter normaler per hjørne, mens glBegin()-glEnd() med tilhørende glNormal3f ser ut til å forutsette flatenormaler. tar jeg feil? kan jeg gjøre noe med dette slik at jeg kan rendre vertexarrays med flatenormaler og omvendt?

8034322[/snapback]

 

Både vertex array og glBegin-glEnd, brukes til å sette pr vertex normal, men med glBegin trenger du jo ikke å sette prVertex data flere ganger ettersom den vil alltid bruke de samme dataene som du sist har satt. Så hvis du setter normalen vil den bli brukt for alle vertexene helt til du setter en ny en.

 

2. .obj filene jeg leser eksporterer flatenormaler. Jeg vet at alle hosliggende flater til etvert punkt er trekanter. kan jeg gjøre noen billige anntakelser/smarte triks/gode teknikker for å finne normaler per kant?

8034322[/snapback]

 

Du må bruke flate normalen på alle vertexene i trekanten hvis du ikke gjøre det blir rendringen feil. Du må rett å slett duplisere verteksene, men du må ha ulik normal.

 

3. Det virker som om openGL bare kan rendre glatte skygger med kantnormaler. Er det noe jeg kan gjøre med det? (glShadeModel(GL_SMOOTH vs glShadeModel(GL_SOLID) );

8034322[/snapback]

 

Hvordan lager du skygger?

Usikker på hva du sprør om men jeg håper dette hjelper. OGL støtter bare pr vertex lys (uten shadere), men glShadeModel(GL_SMOOTH) gjør at ogl utfører en interpolering av fargene som vertexene i trekanten har, glShadeModel(GL_SOLID) tar derimot gjenomsnittet av fargene i de 3 vertexene og farger hele trekanten med denne fargen.

 

Du har sikkert sett på siden, men den er et must for for som holder på å lære seg OGL

NeHe

Lenke til kommentar

Tusen takk for hjelpa. det begynner å gå opp for meg at jeg har hatt ganske grunnleggende forståelsesfeil. siden nehe og tutorials på nett aldri gidder å definere mer enn en normal per flate == samme normal for alle hjørnene i en flate, fikk jeg et inntrykk av at det var to forskjellige måter å gjøre ting på. det forklarer hvorfor glShadeModel() ikke klarer å fjerne den harde belysningen på flatene mine heller. Gjennomsnittet av tre normaler med samme verdi er jo den samme normalen.

 

Men det ser fortsatt ikke helt ut til at jeg forstår hva jeg driver med. Som kjent er normalene i en kule det samme som punktene i en kule (hvis du gjør sakene dine riktig), så med det i bakhodet, tenkte jeg like gjerne at jeg kunne gjøre det samme for en figur jeg tegner.

bilde

posisjonen og tykkelsen på figuren følger en funkjson.

Jeg tegner den som grupper av separate ringer med glBegin(GL_QUAD_STRIP);

slik

Jeg hadde håpet at normalene skulle bli riktig hvis jeg bare pushet inn punktkoordinaten som normal for hvert punkt, men den gang ei. Som vi ser vi ser blir fargeovergangen mellom hver ring hard stygg.

senere prøvde jeg med å bruke samme normal for to og to (vertikale) punkter i ormen.

bilde (beklager dårlig bilde)

da får hele ringen samme skygge i y-rettning, men overgangene er fortsatt harde.

 

jeg aner ikke helt hvordan jeg skal generere gode normaler. noen som kan hjelpe?

takk for alle svar. Du redder dagen min.

Endret av znora
Lenke til kommentar

Jeg ser at du skriver at du bruker GL_QUAD_STRIP, men det vedlagte bilde (winding.jpg) viser bruken av GL_TRIANGLE_STRIP.

 

Min kunnskap om geometri er begrenset, men jeg kan nok være enig i at normalene til en kule er lik posisjonen, men da må kulen ha en radius på 1 og være sentrert i origo. Tar jeg helt feil?

 

Din figur er lang utenfor min forståelse.

 

OGL må (tror jeg) ha verdiene på normaler fra 0-1, har du utenfor dette?

 

Ellers så virker det på meg som om du genererer normalene feil siden du får et hardt skille, dette kan tyde på at du bruker flere normaler på samme verteks posisjon. Har jeg rett i dette?

 

lykke til og håper mitt svar hjelper

Lenke til kommentar
Jeg ser at du skriver at du bruker GL_QUAD_STRIP, men det vedlagte bilde (winding.jpg) viser bruken av GL_TRIANGLE_STRIP.

 

Min kunnskap om geometri er begrenset, men jeg kan nok være enig i at normalene til en kule er lik posisjonen, men da må kulen ha en radius på 1 og være sentrert i origo. Tar jeg helt feil?

 

Din figur er lang utenfor min forståelse.

 

OGL må (tror jeg) ha verdiene på normaler fra 0-1, har du utenfor dette?

 

Ellers så virker det på meg som om du genererer normalene feil siden du får et hardt skille, dette kan tyde på at du bruker flere normaler på samme verteks posisjon. Har jeg rett i dette?

 

lykke til og håper mitt svar hjelper

8049464[/snapback]

 

All respekt til Giddion som gidder å spandere sin tid på oss uerfarene.

 

Det du sier er rett med unntakk av:

* Alle normaler må ha lengde 1 med mindre man har brukt glEnable(GL_NORMALIZE). (jeg har hørt rykter om at shadere må ha normaler med lengde 1.)

 

 

Etter mye om og men har jeg lokalisert en del feil. Problemet lå i at jeg pushet normalen etter punktet. Når man pusher punktet vil farge og normal som ble anngitt sist bli brukt. Når jeg da pushet normaler i feil rekkefølge fikk jeg en forskyvning på normalene mine, og helt tilfeldige normaler i kantene, som vist på bildet.

Lenke til kommentar

skal du ha korrekte vertex-normaler fra noe som er eksportert fra et 3d-program, så må du nesten ta hensyn til smoothing groups.

 

ting som er i samme smoothing-group vil dele normal med naboene sine..

 

Greia er at i 3d-programmer, får du ofte ut data slik. (eller noe i den duren)

 

Triangel1

Vertex1 normal1, vertex2 normal2 , vertex3 normal3

Triangel2

vertex1 normal4

.....

Som du ser har vertex1 her to normaler.

Om du har tilgang til smoothing-group-informasjon, så er det ønskelig at de normalene smelter sammen dersom det er samme smoothing-group, og du må duplisere vertex hvis ikke.

 

Du kan få tilgang på noe exporter-kode som eksporterer fra 3d-studio slik at alt stemmer og er klart for tegning. bare spør.

Lenke til kommentar
Du kan få tilgang på noe exporter-kode som eksporterer fra 3d-studio slik at alt stemmer og er klart for tegning. bare spør.

8074230[/snapback]

 

Jeg har fått skrapet sammen en enkel objekt loader som leser .obj fra blender som godt som det lar seg gjøre (det er et 1:3 forhold mellom punkter og normaler i de filene). Jeg her heller ikke særlig konfortabel med max, men takk for tilbudet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...