Opengl mozgás egérrel 3D-ben

Opengl mozgás egérrel 3D-ben
2012-02-16T20:08:08+01:00
2012-02-17T17:34:00+01:00
2022-11-24T18:00:39+01:00
*deleted_08075237
Sziasztok!

A következő problémám lenne:
Egy olyat szeretnék csinálni opengl-ben, hogy nyilak + egér használatával lehessen "repkedni" 3D-ben.
Addig eljutottam, hogy egy fix 'y' helyzetben ezt meg lehessen tenni. Csak azt nem tudom megcsinálni, hogy emelkedni, és csökkenni is tudjak olyan mértékben amennyire felfelé, lefelé nézek.

forráskód egy része:

GLfloat move1 = 0.0f; GLfloat move2 = 0.0f; GLfloat move3 = -5.0f; GLfloat xRot = 0.0f; GLfloat yRot = 0.0f; GLfloat zRot = 0.0f; void RenderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glRotatef(zRot, 0.0f, 0.0f, 1.0f); glTranslatef(move1,move3,move2); glBegin(GL_POLYGON); .... } GLfloat Angle(){ GLfloat angle = 0.0f; int i; for(i=0;i<120;i++){ angle += 3.1415/60; if(yRot==i*3) return angle; } } void SpecialKeys(int key, int x, int y){ if(key == GLUT_KEY_DOWN){ move2 -= 2*cos(Angle()); move1 += 2*sin(Angle()); }else if(key == GLUT_KEY_UP){ move2 += 2*cos(Angle()); move1 -= 2*sin(Angle()); }else if(key == GLUT_KEY_LEFT){ move2 += 2*sin(Angle()); move1 += 2*cos(Angle()); }else if(key == GLUT_KEY_RIGHT){ move2 -= 2*sin(Angle()); move1 -= 2*cos(Angle()); } glutPostRedisplay(); } void mousedrag(int x, int y){ static int X=0; static int Y=0; if(x<X) yRot-=3; else if(x>X) yRot+=3; if(y<Y) xRot-=3; else if(y>Y) xRot+=3; if(yRot==360) yRot = 0; if(yRot==-3) yRot = 357; if(xRot<-90) xRot = -90; if(xRot>90) xRot = 90; X = x; Y = y; glutPostRedisplay(); }
Mutasd a teljes hozzászólást!
Sikerült megoldanom a problémát. Más oldalon találtam hozzá hasonló cos(), sin() cuccot, azt alakítottam át, és jó lett így.


#include <stdio.h> #include <GL/glut.h> #include <math.h> GLfloat move1 = 0.0f; GLfloat move2 = 0.0f; GLfloat move3 = -5.0f; GLint xRot = 0; GLint yRot = 90; GLint zRot = 0; void RenderScene(void){ int i, j; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glRotatef(zRot, 0.0f, 0.0f, 1.0f); glTranslatef(move1,move3,move2); glBegin(GL_QUADS); for(i=0;i<10;i++) for(j=0;j<10;j++){ if((i+j)%2==0) glColor3f(0,0,1); else glColor3f(1,0,0); glVertex3f(20-i*2,0,18-j*2); glVertex3f(20-i*2,0,20-j*2); glVertex3f(18-i*2,0,20-j*2); glVertex3f(18-i*2,0,18-j*2); } glEnd(); glPopMatrix(); glutSwapBuffers(); } GLfloat Angle(){ GLfloat angle = 0.0f; int i; for(i=0;i<120;i++){ angle += 3.1415/60; if(yRot==i*3) break; } return angle; } GLfloat Angle2(){ GLfloat angle = 0.0f; int i; for(i=0;i<120;i++){ if(xRot==i*3) break; angle += 3.1415/60; } return angle; } void SpecialKeys(int key, int x, int y){ float angle1 = Angle(); float angle2 = Angle2(); if(key == GLUT_KEY_DOWN){ move2 -= 2*cos(angle1)*cos(angle2); move1 += 2*sin(angle1)*cos(angle2); move3 -= sin(angle2); }else if(key == GLUT_KEY_UP){ move2 += 2*cos(angle1)*cos(angle2); move1 -= 2*sin(angle1)*cos(angle2); move3 += sin(angle2); }else if(key == GLUT_KEY_LEFT){ move2 += 2*sin(angle1); move1 += 2*cos(angle1); }else if(key == GLUT_KEY_RIGHT){ move2 -= 2*sin(angle1); move1 -= 2*cos(angle1); } glutPostRedisplay(); } void mousedrag(int x, int y){ static int X=0; static int Y=0; if(x<X) yRot-=3; else if(x>X) yRot+=3; if(y<Y) xRot-=3; else if(y>Y) xRot+=3; if(yRot==360) yRot = 0; if(yRot==-3) yRot = 357; if(xRot==360) xRot = 0; if(xRot==-3) xRot = 357; if(xRot==267) xRot = 270; if(xRot==93) xRot = 90; X = x; Y = y; glutPostRedisplay(); } void ChangeSizePerspective(GLsizei w, GLsizei h){ GLfloat fAspect; if(h == 0)h = 1; glViewport(0, 0, w, h); fAspect = (GLfloat)w/(GLfloat)h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f, fAspect, 1.0, -1); gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Repules"); glutReshapeFunc(ChangeSizePerspective); // Perspektiv vetites glutSpecialFunc(SpecialKeys); glutDisplayFunc(RenderScene); glutMotionFunc(mousedrag); glutMainLoop(); return 0; }
Mutasd a teljes hozzászólást!

  • Elég nehezen kivehető a problémád. Ha jó értelmezem, akkor az megoldottad, hogy az alakzatod forogjon körbe egy helyben, csak amikor felszáll, akkor a látótered nem emelkedik. Ehhez pedig van egy függvény, amellyel a kamerát oda mozgatod, ahova akarod, ha jól tudom, akkor: gluLookAt a neve.

    Esetleg ha nem jól értelmezem, akkor próbáld meg elmagyarázni.
    Mutasd a teljes hozzászólást!
  • Konkrétan nekem csak annyi kéne, hogy a SpecialKeys-ben a Down-t, és az Up-ot kibővíteni a move3-al.

    Tehát ha felfelé nézek 90 fokban (párhuzamos az 'y' tengely), akkor 0-val kéne szorzódnia a move1-nek, és a move2-nek, és 1-el a move3-nak (ami még nincs benne).

    Ha merőlegesen állok az 'y' tengellyel akkor pedig 0-val szorzódik a move3 (mert nincs emelkedés), és 1-el a move1, move2.
    Mutasd a teljes hozzászólást!
  • Sikerült megoldanom a problémát. Más oldalon találtam hozzá hasonló cos(), sin() cuccot, azt alakítottam át, és jó lett így.


    #include <stdio.h> #include <GL/glut.h> #include <math.h> GLfloat move1 = 0.0f; GLfloat move2 = 0.0f; GLfloat move3 = -5.0f; GLint xRot = 0; GLint yRot = 90; GLint zRot = 0; void RenderScene(void){ int i, j; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glRotatef(zRot, 0.0f, 0.0f, 1.0f); glTranslatef(move1,move3,move2); glBegin(GL_QUADS); for(i=0;i<10;i++) for(j=0;j<10;j++){ if((i+j)%2==0) glColor3f(0,0,1); else glColor3f(1,0,0); glVertex3f(20-i*2,0,18-j*2); glVertex3f(20-i*2,0,20-j*2); glVertex3f(18-i*2,0,20-j*2); glVertex3f(18-i*2,0,18-j*2); } glEnd(); glPopMatrix(); glutSwapBuffers(); } GLfloat Angle(){ GLfloat angle = 0.0f; int i; for(i=0;i<120;i++){ angle += 3.1415/60; if(yRot==i*3) break; } return angle; } GLfloat Angle2(){ GLfloat angle = 0.0f; int i; for(i=0;i<120;i++){ if(xRot==i*3) break; angle += 3.1415/60; } return angle; } void SpecialKeys(int key, int x, int y){ float angle1 = Angle(); float angle2 = Angle2(); if(key == GLUT_KEY_DOWN){ move2 -= 2*cos(angle1)*cos(angle2); move1 += 2*sin(angle1)*cos(angle2); move3 -= sin(angle2); }else if(key == GLUT_KEY_UP){ move2 += 2*cos(angle1)*cos(angle2); move1 -= 2*sin(angle1)*cos(angle2); move3 += sin(angle2); }else if(key == GLUT_KEY_LEFT){ move2 += 2*sin(angle1); move1 += 2*cos(angle1); }else if(key == GLUT_KEY_RIGHT){ move2 -= 2*sin(angle1); move1 -= 2*cos(angle1); } glutPostRedisplay(); } void mousedrag(int x, int y){ static int X=0; static int Y=0; if(x<X) yRot-=3; else if(x>X) yRot+=3; if(y<Y) xRot-=3; else if(y>Y) xRot+=3; if(yRot==360) yRot = 0; if(yRot==-3) yRot = 357; if(xRot==360) xRot = 0; if(xRot==-3) xRot = 357; if(xRot==267) xRot = 270; if(xRot==93) xRot = 90; X = x; Y = y; glutPostRedisplay(); } void ChangeSizePerspective(GLsizei w, GLsizei h){ GLfloat fAspect; if(h == 0)h = 1; glViewport(0, 0, w, h); fAspect = (GLfloat)w/(GLfloat)h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f, fAspect, 1.0, -1); gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Repules"); glutReshapeFunc(ChangeSizePerspective); // Perspektiv vetites glutSpecialFunc(SpecialKeys); glutDisplayFunc(RenderScene); glutMotionFunc(mousedrag); glutMainLoop(); return 0; }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd