Reshape

Za vse novince v izdelovanju iger.

Reshape

OdgovorNapisal/-a klemzi » Ne Jan 15, 2012 1:38 pm

Pozdravljeni zanima me , kako narediti funkcijo reshape, če spremenimo obliko okna ali pa povečamo na glutfullscreen();- če preberemo da smo pritisnili črk of v mainu pa imam glutDisplayFunc(display);
glutReshapeFunc(reshape);
Hočem da se mi poveča oblika okna liki pa ne v tem primeru se mi pa vse skupaj poveča čez ekran , tako da človek hodi pod vidno linijo ekrana, tako da človeček hodi čez ekran in potem nekako ga psravim nazaj
Koda: Izberi vse
void reshape (int w, int h)
{

  int width, height;
  double left, right, bottom, top, znear, zfar;
  width = w;
  height = h;

  if (w == h)
  {
    left = -width/(1.0*height);
    right = width/(1.0*height);
    bottom = -1.0;
    top = 1.0;
  }
  else
  {
    left = -1.0;
    right = 1.0;
    bottom = -height/(1.0*width);
    top = height/(1.0*width);
  }
  znear = -1.0;
  zfar = 1.0;
  glViewport (0, 0, width, height);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
  glOrtho(left, right, bottom, top, znear, zfar);
  glMatrixMode(GL_MODELVIEW);


}
klemzi
novinec
novinec
 
Prispevkov: 4
Pridružen: Ne Jan 15, 2012 1:31 pm

Re: Reshape

OdgovorNapisal/-a impulse9 » Ne Jan 15, 2012 4:58 pm

Pozdravljen.

Poskusi tole:

Koda: Izberi vse
void changeSize(int w, int h)
{
   if (h == 0) // preprecimo deljenje z 0 (w je vedno > 0)
      h = 1;
   float ratio = 1.0f * w / h;

   // uporabi projekcijsko matriko
   glMatrixMode(GL_PROJECTION);

   // resetiraj matriko
   glLoadIdentity();

   // nastavi vidno polje
   glViewport(0, 0, w, h);

   // nastavi perspektivo
   gluPerspective(45, ratio, 1, 1000);

   // nazaj v pogled modela
   glMatrixMode(GL_MODELVIEW);
}


Lp
What
Uporabniški avatar
impulse9
SGD Moderator
SGD Moderator
 
Prispevkov: 397
Pridružen: Pe Jan 10, 2003 10:14 pm

Re: Reshape

OdgovorNapisal/-a klemzi » Ne Jan 15, 2012 8:26 pm

Ja žal ne dela, mi izbriše coleten zaslon,.. :(( Nič ne bo
klemzi
novinec
novinec
 
Prispevkov: 4
Pridružen: Ne Jan 15, 2012 1:31 pm

Re: Reshape

OdgovorNapisal/-a klemzi » Po Jan 16, 2012 11:08 pm

Zdej sem ugtovil kako to dela, problem je samo pri spodnji in zgorni meje, verjetno je zato ker ni širina in dolžina različne poveš pa lahko ti..
klemzi
novinec
novinec
 
Prispevkov: 4
Pridružen: Ne Jan 15, 2012 1:31 pm

Re: Reshape

OdgovorNapisal/-a tomaa » To Jan 17, 2012 4:22 pm

Glede na to, da uporabljaš glOrtho(..), boš mogu krčenje / širjenje okna (in s tem vse kar se izriše) obravnavati na drugačen način.
Problem je v tem, da imaš pri pravokotni projekciji (orthogonal) dimenzije in pozicije elementov (objektov) podane v pikslih in ne v enotah kot pri perspektivni projekciji.

v reshape(..) funkciji poskusi zamenjati:
Koda: Izberi vse
glOrtho(left, right, bottom, top, znear, zfar);

z (predpostavljam, da je prvotna velikost okna 640 x 480):
Koda: Izberi vse
glOrtho(0.0f, 640.0f, 0.0f, 480.0f, 1.0f, -1.0f);

Torej, levi in spodnji rob sta 0 (OpenGL ima koordinatno izhodišče pri pravokotni projekciji v levem spodnjem kotu), zgornji in desni pa sta enaka začetni velikosti okna.
Zgornji in desni rob naj bosta vedno enaka prvotni velikosti okna.

Povedano po domače: S tem "prisiliš" OpenGL naj izris velikosti 640x480 spravi na nove dimenzije.. če so nove dimenzije večje, se bo izris razširil, sicer pa skrčil.

Če rabiš več "globine" povečaj zNear (1.0) & zFar (-1.0)

Trenutno delam, tako da svoje teorije ne morem potrditi / zavreči. Bom preveril, ko pridem domov.
Ti pa kar stestiraj, pa če ne bo šlo te prosim, da pošlješ kak košček kode kjer izrisuješ enega izmed objektov, oz. karkoli pač izrisuješ.
Uporabniški avatar
tomaa
novinec
novinec
 
Prispevkov: 21
Pridružen: Če Okt 27, 2011 10:38 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 2 gostov

cron