.[ ČeskéHry.cz ].
Pozicia kliku po rotaci

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
hybr1D



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 28. leden 2014, 15:26:05    Předmět: Pozicia kliku po rotaci Odpovědět s citátem

Zdravím.
Mám mensí problém a neviem kde robím chybu.
Mám aplikáciu, kde keď kliknem na obrazovku, má sa mi tam vykresliť bod. Všetko vykresluje správne, až kým so scénou nezarotujem. Po zarotovaní mi počíta nejaké divné súradnice. Tu je časť zdrojáku. Matice modelview, projection a viewport mám ako globálne premenné.

Prepočet súdraníc z 2D do 3D
kód:

        private Vektor openGLPos(int x, int y)
        {   //prepocet suradnic kliku v okne, na suradnice v 3D OpenGL

            Double outX, outY, outZ=0;    //vysupne suradnice

            Vektor win = new Vektor((float)x, (float)viewport[3] - y, 0);
            unsafe  //pracujem s pointrami tak musim byt v unsafe mode
            {
                GL.glReadPixels(x, viewport[3] - y, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, (&outZ));  //zizkam Ztovu suradnicu
            }

            //funkcia prepocita suradnice
            GL.gluUnProject((float)win.X, (float)win.Y, (float)win.Z, modelview, projection, viewport, out outX, out outY, out outZ);           

            Vektor temp = new Vektor(outX*100, outY*100, -zoom);

            return temp;
        }



Vykreslovanie
kód:

        public override void glDraw()
      {
            //vykreslenie sceny
           
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
            GL.glClearColor((float)(BGColor.R) / 255, (float)(BGColor.G) / 255, (float)(BGColor.B) / 255, 0);
            GL.glLoadIdentity();

            GL.glPushMatrix();  //pushnem si maticu

            //posun
            GL.glTranslatef(xpos, ypos, -10);

            //rotacia
            GL.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
            GL.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

            GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
            GL.glGetDoublev(GL.GL_PROJECTION_MATRIX, projection);
            GL.glGetIntegerv(GL.GL_VIEWPORT, viewport);

            //posun spat
            //GL.glTranslatef((float)modelview[2] * zoom, (float)modelview[6] * zoom, (float)modelview[10] * zoom);

            foreach (BodGL B in poleBodov)  //prejdem vsetky body
            {
                GL.glPushMatrix();

                GL.glTranslatef((float)(B.bod.Pozicia.X) , (float)(B.bod.Pozicia.Y) , (float)(B.bod.Pozicia.Z) );    //nastavim sa na poziciu bodu
               
                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview2);
                GL.glTranslatef((float)modelview2[2] * zoom, (float)modelview2[6] * zoom, (float)modelview2[10] * zoom);

                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview2);
                GL.glRotatef((float)B.bod.Rotation.X, (float)modelview2[0], (float)modelview2[4], (float)modelview2[8]);
 
                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview2);
                GL.glRotatef(-(float)B.bod.Rotation.Y, (float)modelview2[1], (float)modelview2[5], (float)modelview2[9]);

                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview2);
                GL.glRotatef(-(float)B.bod.Rotation.Z, (float)modelview2[2], (float)modelview2[6], (float)modelview2[10]);

                VykresliAtrBod(B); //vykreslim gluSphere

                GL.glPopMatrix();
            }
}

V udalosti mouse UP robím samotný prepočet
kód:

bod.bod.Pozicia = openGLPos(e.Location.X, e.Location.Y);


Tiež mi nie je celkom jasné, prečo musím vypočítané súradnice pomocou gluUnProject ešte prenásobiť 100 aby pasovali (Vektor temp = new Vektor(outX*100, outY*100, -zoom)Wink. Pred rotáciou mi outX a outY vypočíta okolo 0.003 a musím to teda prenásobiť aby to sedelo, ale akonáhle zarotujem tak outX a outY už počíta okolo 3 takže keď to prenásobím, uletí to kdesi het.
Sedím nad tým už niekoľko dní a neviem si s tým rady.

Ďakujem za pomoc a prajem príjemný deň.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna