hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 11. listopad 2013, 14:45:04 Předmět: openGL translation, rotation a suradnice |
|
|
Zdravim.
Mam menší problém s mojim programom. Ide o to, že keď kliknem na obrazovku, má sa mi na danom mieste vykresliť guľa. Funguje to super, až kým nepohnem scénou (urobim Translate alebo Rotate). Potom mi vykreslí guľu na veľmi vzdialenom mieste alebo nevykreslí vôbec. Všetky matice sú rovnaké aj vo funkcii glDraw aj v openGLPos (kontroloval som ich). Z-tovu súradnicu som dal 0, lebo keď som ju počítal pomocou glReadPixels, nevykreslilo sa vôbec nič.
Tu je časť kódu:
kód: |
private Vektor openGLPos(int x, int y)
{ //prepocet suradnic kliku v okne, na suradnice v 3D OpenGL
double outX, outY, outZ; //vysupne suradnice
float z = 0;
Vektor win = new Vektor((float)x, (float)viewport[3] - y, z);
unsafe //pracujem s pointrami tak musim byt v unsafe mode
{
GL.glReadPixels(x, (int)win.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, z, modelview, projection, viewport, out outX, out outY, out outZ);
//vratime prepocitane suradnice uz aj s posunom sceny a zoomo
Vektor temp = new Vektor(outX, outY, 0); // outZ - zoom / 100
return temp;
}
public override void glDraw()
{
//vykreslenie sceny
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
InitGLContext();
//GL.glLoadIdentity();
GL.glPushMatrix(); //pushnem si maticu
//posun
GL.glTranslatef(xpos, ypos, zoom);
//rotacia
GL.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
GL.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
foreach (BodGL B in poleBodov) //prejdem vsetky body
{
GL.glTranslatef((float)(B.bod.Pozicia.X * 100), (float)(B.bod.Pozicia.Y * 100), (float)(B.bod.Pozicia.Z * 100)); //nastavim sa na poziciu bodu
//if (Math.Round((B.bod.Pozicia.Z * 100 + 10) + zoom) == 0) B.bod.Farba = Color.FromArgb(B.bod.Farba.R, B.bod.Farba.G, B.bod.Farba.B); //zjasnenie bodov na aktualnej rovine zoomu
VykresliAtrBod(B.Quad, B.bod.Priemer, B.bod.Farba, B.bod.Fill); //vykreslim gluSphere
//if (Math.Round((B.bod.Pozicia.Z * 100 + 10) + zoom) == 0) B.bod.Farba = Color.FromArgb(B.bod.Farba.R,B.bod.Farba.G, B.bod.Farba.B); //ztmavnutie bodov mimo akt. roviny zoomu
GL.glTranslatef(-(float)(B.bod.Pozicia.X * 100), -(float)(B.bod.Pozicia.Y * 100), -(float)(B.bod.Pozicia.Z * 100)); //vratim sa naspet na povodnu poziciu
}
GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
GL.glGetDoublev(GL.GL_PROJECTION_MATRIX, projection);
GL.glGetIntegerv(GL.GL_VIEWPORT, viewport);
GL.glPopMatrix(); //popnem si maticu
}
|
Prosím poraďte, kde robím chybu.
Ďakujem. |
|