hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 28. leden 2014, 15:26:05 Předmět: Pozicia kliku po rotaci |
|
|
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). 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ň. |
|