Egérrel való mozgatás Open GL-ben+ kommentezés

Egérrel való mozgatás Open GL-ben+ kommentezés
2010-11-10T10:48:28+01:00
2010-12-13T08:36:35+01:00
2022-11-20T03:50:38+01:00
allinignath
A problémám a következő: Egy tilitoli játékot kell szerkezsztenem OpenGL-be, amelyben az egyes kockákat egérrel lehet mozgatni. Egy kockát tudok mozgatni egérrel, ez eddig sikerült, de a többit nem!! Tudnátok segíteni? Kommenteznétek a progit, mert ha vmit nem jól csináltam akkor a hibákat próbálom javítani!
Íme a forráskód:

#include <GL/glut.h> float green_light[] = { 0.0, 1.0, 0.0, 1.0 }; float left_light_position[] = { -5.0, 5.0, -5.0, 0.0 }; float upper_light_position[] = { 0.0, 5.0, 0.0, 0.0 }; int flag = 0; void flan(void) { glBegin(GL_QUAD_STRIP); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-1.53846153846, -0.384615384615, 0.0); glVertex3f(-1.53846153846, -0.384615384615, -1.0); glVertex3f(-0.230769230769, -0.384615384615, 0.0); glVertex3f(-0.230769230769, -0.384615384615, -1.0); glNormal3f(1.0, 0.0, 0.0); glVertex3f(-0.230769230769, 1.15384615385, 0.0); glVertex3f(-0.230769230769, 1.15384615385, -1.0); glNormal3f(0.0, 0.0, -1.0); glVertex3f(-1.53846153846, 1.15384615385, 0.0); glVertex3f(-1.53846153846, 1.15384615385, -1.0); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.53846153846, -0.384615384615, 0.0); glVertex3f(-1.53846153846, -0.384615384615, -1.0); glEnd(); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.53846153846, -0.384615384615, 0.0); glVertex3f(-0.230769230769, -0.384615384615, 0.0); glVertex3f(-0.230769230769, 1.15384615385, 0.0); glVertex3f(-1.53846153846, 1.15384615385, 0.0); glEnd(); } void display(void) { glClearColor(0.3, 0.3, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, 1, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(22, 10.0, 15, 0.0, 10.0, 0.0, 0.0, 0.0, 1.0); glTranslatef(10.0, 10.0, 5.0); glRotatef(90.f, 0.0, .0, 1.0); glPushMatrix(); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-4.0, -4.0, 0.0); glVertex3f(2.40, -4.0, 0.0); glVertex3f(2.40, 6.4, 0.0); glVertex3f(-4.0, 6.4, 0.0); glEnd(); glBegin(GL_QUAD_STRIP); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-4.0, -4.0, 0.0); glVertex3f(2.4, -4.0, 0.0); glVertex3f(-4.0, -4.0, 1.0); glVertex3f(2.4, -4.0, 1.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-3.5, -3.5, 1.0); glVertex3f(1.9, -3.5, 1.0); glNormal3f(0.0, 0.0, -1.0); glNormal3f(1.0, 0.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(-1.0, 0.0, 0.0); glNormal3f(0.0, 0.0, -1.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(0.0, 0.0, 1.0); glNormal3f(0.0, 0.0, 1.0); glNormal3f(1.0, 0.0, 0.0); glNormal3f(-1.0, 0.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(1.0, 0.0, 0.0); glVertex3f(-3.5, -3.5, 0.0); glVertex3f(1.9, -3.5, 0.0); glNormal3f(1.0, 0.0, 0.0); glVertex3f(2.4, -4.0, 0.0); glVertex3f(2.4, 5.4, 0.0); glVertex3f(2.4, -4.0, 1.0); glVertex3f(2.4, 5.4, 1.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(1.9, -3.5, 1.0); glVertex3f(1.9, 4.9, 1.0); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(1.9, -3.5, 0.0); glVertex3f(1.9, 4.9, 0.0); glNormal3f(0.0, 0.0, -1.0); glVertex3f(2.4, 5.4, 0.0); glVertex3f(-4.0, 4.0, 0.0); glVertex3f(2.4, 5.4, 1.0); glVertex3f(-4.0, 5.4, 1.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(1.9, 4.9, 1.0); glVertex3f(-3.5, 4.9, 1.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(0.5, 4.9, 1); glVertex3f(-3.5, 4.9, 1); glVertex3f(0.5, 3.3, 1); glVertex3f(-3.5, 3.3, 1); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.5, 3.3, 0); glVertex3f(-3.5, 3.3, 0); glNormal3f(0.0, 0.0, 1.0); glVertex3f(2.1, 4.9, 0); glVertex3f(2.1, 4.9, 1); glVertex3f(0.5, 4.9, 0); glVertex3f(0.5, 4.9, 1); glNormal3f(1.0, 0.0, 0.0); glVertex3f(0.5, 2.9, 0); glVertex3f(0.5, 2.9, 1); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-4.0, 5.4, 0.0); glVertex3f(-4.0, -4.0, 0.0); glVertex3f(-4.0, 5.4, 1.0); glVertex3f(-4.0, -4.0, 1.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-3.5, 4.9, 1.0); glVertex3f(-3.5, -3.5, 1.0); glNormal3f(1.0, 0.0, 0.0); glVertex3f(-3.5, 4.9, 0.0); glVertex3f(-3.5, -3.5, 0.0); glEnd(); int i = 0; int j = 0; float poz = 0; float pozy = 0; for (j = 0, pozy = -4.7; j < 4; j++) { pozy = pozy + 1.65; glPushMatrix(); glTranslatef(0, pozy, 0.50); for (i = 0, poz = -3.3; i < 4; i++) { poz = poz + 1.35; glPushMatrix(); glTranslatef(poz, 0, 0.5); if (i == 3 && j == 3 && flag) { glTranslatef(0, poz, 0.0); } flan(); glPopMatrix(); } glPopMatrix(); } glFlush(); glutSwapBuffers(); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { // printf("left mouse click\n"); flag = !flag; } break; default: break; } glutPostRedisplay(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("TiliToli"); glutDisplayFunc(display); glutMouseFunc(mouse); glLightfv(GL_LIGHT0, GL_POSITION, left_light_position); glLightfv(GL_LIGHT1, GL_POSITION, upper_light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, green_light); glLightfv(GL_LIGHT1, GL_DIFFUSE, green_light); glShadeModel(GL_FLAT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glutMainLoop(); return 0; }
Mutasd a teljes hozzászólást!
Szia! OpenGL-ben objektumok kivalasztasara un. "Picking"-et hasznalnak. Te adsz az adott objektumnak egy ID-t, s majd le tudod kerdezni az OpenGL-tol hogy melyik objektumnak az "ID"-jara volt kattintva.
Googleben keress ra(OpenGL picking)...
Mutasd a teljes hozzászólást!

  • Mi kommentezzük a progit?? Azt annak kéne aki írja.
    Bár egy sörbe mernék fogadni, hogy ezt bizony nem te írtad.
    Mi ez a hányás a display()-ben? Osztályokról hallottál már?
    Nem ártana odaírni hogy melyik rész mit rajzol ki, mert senki nem fogja megfejteni helyetted később.

    void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { // printf("left mouse click\n"); flag = !flag; } break; default: break; } glutPostRedisplay(); }

    Ebbe a függvénybe kéne jönnie a mozgatásnak gondolom én.
    Megvizsgálod, hogy az adott x,y koordinátán melyik kocka van, aztán azt mozgatod. Ehhez nem ártana mondjuk egy kocka osztályt legalább létrehoznod szerintem, különben elég fapados lesz az egész. Nem hiszem, hogy ezzel a kóddal te tudod bármelyik kockát is mozgatni, jelen állapotában.
    Mellesleg, hogy még egy kicsit trollkodjak, programot "szerkeszteni" nem szokás.
    Mutasd a teljes hozzászólást!

  • Attól hogy valaki nem olyan zseni mint TEE, azért nem kell leoltani!!!
    Mutasd a teljes hozzászólást!
  • Miért nem kell?
    Mutasd a teljes hozzászólást!
  • A leghasznosabb rész az ez:
    glNormal3f(0.0, 0.0, -1.0); glNormal3f(1.0, 0.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(-1.0, 0.0, 0.0); glNormal3f(0.0, 0.0, -1.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(0.0, 0.0, 1.0); glNormal3f(0.0, 0.0, 1.0); glNormal3f(1.0, 0.0, 0.0); glNormal3f(-1.0, 0.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glNormal3f(1.0, 0.0, 0.0);

    Mutasd a teljes hozzászólást!
  • Nem vagyok zseni, és nem is mondtam ezt magamról, nem tudom ezt hol olvastad.
    Azért oltottalak le, mert a hozzászólásod alapján tipikusan olyan vagy, aki elvárja hogy megcsinálják helyette a programot, hogy neki ne kelljen semmit se csinálnia.

    Az is látszik, hogy nem sok közöd van (egyelőre) a programozáshoz, legalábbis aki ilyet ír mint te a display függvényedbe...
    Vegyél elő egy jó kis c++ könyvet, meg egy objektum orientált programozásról szóló könyvet, aztán ha ezeken végigrágtad magad, akkor kezdd el újra az opengl-t, addig szvsz nem sok értelme van.
    Mutasd a teljes hozzászólást!
  • Szia! OpenGL-ben objektumok kivalasztasara un. "Picking"-et hasznalnak. Te adsz az adott objektumnak egy ID-t, s majd le tudod kerdezni az OpenGL-tol hogy melyik objektumnak az "ID"-jara volt kattintva.
    Googleben keress ra(OpenGL picking)...
    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