Stran 1 od 1

Reshape

OdgovorObjavljeno: Ne Jan 15, 2012 1:38 pm
Napisal/-a klemzi
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);


}

Re: Reshape

OdgovorObjavljeno: Ne Jan 15, 2012 4:58 pm
Napisal/-a impulse9
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

Re: Reshape

OdgovorObjavljeno: Ne Jan 15, 2012 8:26 pm
Napisal/-a klemzi
Ja žal ne dela, mi izbriše coleten zaslon,.. :(( Nič ne bo

Re: Reshape

OdgovorObjavljeno: Po Jan 16, 2012 11:08 pm
Napisal/-a klemzi
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..

Re: Reshape

OdgovorObjavljeno: To Jan 17, 2012 4:22 pm
Napisal/-a tomaa
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š.