Automatisk kamera i OpenGL

Allting som har med programmering att göra.

Automatisk kamera i OpenGL

Inläggav VilleK » 01 sep 2009, 11:04

Hur gör jag för att automatiskt visa hela min scen oavsett storlek? Alltså ungefär som i ett 3d-modelleringsverktyg att kameran centreras runt ett markerat objekt i lämplig skala så att objektet fyller ut vyn. Detta i OpenGL. Jag har googlat men inte hittat något bra exempel. Tacksam för hjälp!
Användarvisningsbild
VilleK
 
Inlägg: 30
Blev medlem: 12 maj 2009, 09:26

Re: Automatisk kamera i OpenGL

Inläggav dooz » 01 sep 2009, 12:45

En busenkel variant borde väl vara att skapa en bounding sphere för hela scenen, sätter kamerans x, y till motsvarande värden för sfären, bestämmer sig för ett visst FOV på kameran, och sen använder radien på sfären och FOV-vinkel för att räkna ut kamerans z.

En liten disclaimer på att jag aldrig skrivit/testat ovanstående, så jag har ingen aning om hur dåligt det kan bli, samt att scenens utseende avgör givetvis hur bra det blir med en sfär. För läääänge sedan kollade jag lite på hur man bygger upp bra OBBer (dvs fritt orienterade bounding boxar), och man kan säkert använda sig av något därifrån för att hitta hur man bör rotera sina kamera för att få en så bra 2d OBB som möjligt, som borde vara ett bra kameraplan..


Edit: Jag googlade lite, och hittade kod för "best fitting plane", http://codesuppository.blogspot.com/ (post från 12:e juni), som skulle kunna vara intressant. Man kan tänka sig att en bra kamera bör ha sitt near/far plan parallellt med ett "best fitting plane", och att den bör titta längs planets normal (eller -normal, whatever).
Användarvisningsbild
dooz
 
Inlägg: 37
Blev medlem: 11 maj 2009, 21:04
Ort: Göteborg

Re: Automatisk kamera i OpenGL

Inläggav VilleK » 01 sep 2009, 13:38

Tack för ett bra svar.
dooz skrev:En busenkel variant borde väl vara att skapa en bounding sphere för hela scenen, sätter kamerans x, y till motsvarande värden för sfären, bestämmer sig för ett visst FOV på kameran, och sen använder radien på sfären och FOV-vinkel för att räkna ut kamerans z.

Det skulle räcka i mitt fall eftersom den scen jag vill visa alltid är centrerad runt origo samt innehållet är av en typ som kan omslutas av en sfär på ett bra sätt och kameran behöver inte roteras.

Här är en som föreslår samma lösning som du:

http://groups.google.com/group/comp.gra ... a6696ad57c

Avståndet beräknar han så här:

dist = radius / tan( FOV / 2 )

Låter det vettigt? Jag är på för osäker mark här för att bedöma det själv :-). Jag har försökt koda den här lösningen men får det inte riktigt att stämma ännu. Om det är någon som har ett exempel på hur man gör detta med OpenGL-anrop så vore det toppen.
Användarvisningsbild
VilleK
 
Inlägg: 30
Blev medlem: 12 maj 2009, 09:26

Re: Automatisk kamera i OpenGL

Inläggav dooz » 01 sep 2009, 14:11

Mmm, jag får samma avstånd. Det är rätt enkelt att se om man ritar upp det så här:
  1.  
  2.   radie 
  3. +----+
  4. \    |
  5.  \   |  avstånd
  6.   \  |
  7.    \ |
  8.      +
  9.     fov/2
  10.   

Då är det i princip definitionen på tangens..
Användarvisningsbild
dooz
 
Inlägg: 37
Blev medlem: 11 maj 2009, 21:04
Ort: Göteborg

Re: Automatisk kamera i OpenGL

Inläggav Hildenborg » 05 sep 2009, 09:08

Följande kod borde kunna vara rätt användbar för dig:

  1.  
  2. glMatrixMode(GL_PROJECTION);
  3. glLoadIdentity();
  4. gluPerspective(degfov,aspect,0.1,1000);
  5. gluLookAt(eye.x, eye.y, eye.z, lookat.x, lookat.y, lookat.z, up.x, up.y, up.z);
  6.  


Jag använder mig av GLU som finns på alla plattformar (utom de som använder OpenGL ES).
degfov är brännvidden.
aspect är width/height på viewporten.
0.1,1000 är bara godtyckliga värden för farplane och nearplane. Välj värden som passar dig.
eye är positionen för kameran.
lookat är positionen du tittar på. I ditt fall så skulle det förslagsvis vara centrum av världen.
up är uppåtvektorn.

Så sätter du bara eye till den position där avståndet till lookat är såpass långt borta att världen ryms inom brännvidden.
Sun Tzu: "In peace prepare for war, in war prepare for peace."
Användarvisningsbild
Hildenborg
Site Admin
 
Inlägg: 191
Blev medlem: 22 apr 2009, 20:25
Ort: Göteborg

Re: Automatisk kamera i OpenGL

Inläggav VilleK » 07 sep 2009, 10:38

Tusen tack, då ska jag kunna få ordning på det här. Trots att jag har hållit på med OpenGL från och till i 10 år så kan jag ibland fastna på såna här newbie-problem. Oftast är orsaken min bristande kunskap i matematik.
Användarvisningsbild
VilleK
 
Inlägg: 30
Blev medlem: 12 maj 2009, 09:26

Re: Automatisk kamera i OpenGL

Inläggav Hildenborg » 07 sep 2009, 18:11

dooz skrev:Mmm, jag får samma avstånd. Det är rätt enkelt att se om man ritar upp det så här:
  1.  
  2.   radie 
  3. +----+
  4. \    |
  5.  \   |  avstånd
  6.   \  |
  7.    \ |
  8.      +
  9.     fov/2
  10.   

Då är det i princip definitionen på tangens..


Du har ritat fel :)
Avståndet är hypotenusan, och inte den närliggande sidan.
Sun Tzu: "In peace prepare for war, in war prepare for peace."
Användarvisningsbild
Hildenborg
Site Admin
 
Inlägg: 191
Blev medlem: 22 apr 2009, 20:25
Ort: Göteborg


Återgå till Programmering

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 0 gäster

cron