noesIdel Skrevet 6. august 2008 Del Skrevet 6. august 2008 Hei jeg skal lage en liten 3d verden i opengl som man kan bevege seg rundt i. Det går bra bortsett fra at jeg sliter med å sende viewpointen i riktig retning. Noen som kunne rettet opp i denne snippeten så den sender personen framover hvis case 'w', tivenstre med a høgre med s og bakover med d? Takker på forhånd case 'w': gluLookAt (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); glScalef (1.0, 1.0, 1.0); break; case 'a': break; case 's': break; case 'd': break; Lenke til kommentar
Giddion Skrevet 7. august 2008 Del Skrevet 7. august 2008 Mener noe slikt burde fikse biffen. float x: foat y; case 'w': y++; break; case 'a': x++; break; case 's': y--; break; case 'd': x--; break; gluLookAt (x, y, 0.0, 0.0, y+1.0, 0.0, 0.0f, 1.0f, 0.0f); Veldig godt mulig jeg tar feil av retningene, men det burde være lett å fikse på. Lenke til kommentar
GeirGrusom Skrevet 8. august 2008 Del Skrevet 8. august 2008 Enklere er vel bare å kjøre en glTranslate på Modelview matrisen. Lenke til kommentar
noesIdel Skrevet 9. august 2008 Forfatter Del Skrevet 9. august 2008 (endret) Nå ser funksjonen min slik ut men den vil ikke fungere ... resultatet blir at objektene forsvinner eller att jeg får vist dem fra en merkelig vinkel... Noen som kunne lage et kjappt eksempel som virker bedre enn dette...? Takker for svar void key(unsigned char key, int x, int y) { float cx; float cy; // Check key switch (key) { case (char) 27: glutDestroyWindow(glutGetWindow()); exit(0); break; case 'w': cy++; break; case 'a': cx++; break; case 's': cy--; break; case 'd': cx--; break; default: break; } // Poind Camera gluLookAt (cx, cy, 0.0, 0.0, cy+1.0, 0.0, 0.0f, 1.0f, 0.0f); // Redraw window glutPostRedisplay(); } Endret 9. august 2008 av Hagenz Lenke til kommentar
GeirGrusom Skrevet 9. august 2008 Del Skrevet 9. august 2008 Prøv å enten last en identity matrise eller bruk PushMatrix og PopMatrix. Nå er ikke jeg sikker på om gluLookAt jobber på projection eller både projection og modelview. Det er litt viktig å vite forskjellen, fordi tåkeberegnelser vil bli feil dersom du bruker glTranslate på Projection matrisen for å flytte kameraet, ihvertfall med NV_radial_distance_fog skrudd på. Lenke til kommentar
Giddion Skrevet 9. august 2008 Del Skrevet 9. august 2008 Som GeirGrusom tror jeg også at du gjør noe galt i mainloopen. Mulig jeg tar feil, men jeg tror main loopen din er feil. Main loopen skal se noe ala dette ut... sånn ca glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); gluLookAt(...);//etter denne kan du tegne ting glPushMatrix();//pusher nåværende matrise ned på prosjektering matrise stack (mulig feilstavinger her ja :)) //tegn object 1 glPopMatrix();//popper matrisen som ble laget av gluLookAt tilbake... så matrisen er den samme som rett etter gluLookAt() glPushMatrix(); //tegn object 2 glPopMatrix();//du kan droppe den siste pop siden man bruker glLoadIdentity() Hvis du bare tegner for testing så trenger du ikke bruke glPushMatrix/glPopMatrix. gluLookAt jobber på den nåværende matrisen så vidt jeg vet. lykke til. Lenke til kommentar
noesIdel Skrevet 9. august 2008 Forfatter Del Skrevet 9. august 2008 Dette er main loopen min int main(int argc, char *argv[]) { // Set Glut Init Values glutInit(&argc, argv); glutInitWindowPosition(left, top); glutInitWindowSize(width, height); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // Create Window glutCreateWindow(name.c_str()); // Set Glut Handlers glutDisplayFunc(render); glutKeyboardFunc(key); glutReshapeFunc(resize); glutIdleFunc(idle); // OpenGL Enables glEnable(GL_DEPTH_TEST); // Set some statements glClearColor(0, 0, 0, 0); if (!cursor) glutSetCursor(GLUT_CURSOR_NONE); if (fullscreen) glutFullScreen(); // Glut main loop and exit glutMainLoop(); return 0; } Lenke til kommentar
Giddion Skrevet 9. august 2008 Del Skrevet 9. august 2008 Beklager jeg var uklar, jeg mente den funksjonen der rendringen din gjøres. Utfra koden din ut til å være "render". Lenke til kommentar
noesIdel Skrevet 10. august 2008 Forfatter Del Skrevet 10. august 2008 Ok dette er render funsjonen: void render(void) { // Clear window glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw glBegin(GL_LINE_LOOP); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.55f, 0.8f); glVertex2f (-0.76f, 0.34f); glVertex2f (-0.34f, 0.34f); glEnd(); // Print out glutSwapBuffers(); } Det eneste den gjør er vel å rendre en blå trekant. Lenke til kommentar
Giddion Skrevet 10. august 2008 Del Skrevet 10. august 2008 Jeg har hørt at linjer ikke støttes så bra overalt så kunne du prøvd GL_TRIANGLES istede, men det virker som om det burde rendres en firkant og ikke en trekant. Jeg ser ikke noe galt, men hvis du ikke har noe imot det så hadde det hjulpet om du lastet opp hele koden din eller et bilde av problemet. hvis du legger til koden under over //draw så vil nok du kunne bevege deg (tror jeg ) glLoadIdentity() GluLookAt(variablene dine); Lenke til kommentar
noesIdel Skrevet 10. august 2008 Forfatter Del Skrevet 10. august 2008 (endret) Her er iallefall hele koden men vet ikke helt hvor jeg skla putte ting // Include Standard Librarys #include <string> // Include OpenGL #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> // Include Project Files class.h e foreløpig tom #include "class.h" // Setup NameSpace using namespace std; // Some Variables string name = "My Game"; bool fullscreen = false; bool cursor = true; int left = 100; int top = 100; int width = 640; int height = 400; // Functions void resize(int width, int height); void render(void); void key(unsigned char key, int x, int y); void idle(); /*----------------------------------------------------- /* Main Function /*-----------------------------------------------------*/ int main(int argc, char *argv[]) { // Set Glut Init Values glutInit(&argc, argv); glutInitWindowPosition(left, top); glutInitWindowSize(width, height); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // Create Window glutCreateWindow(name.c_str()); // Set Glut Handlers glutDisplayFunc(render); glutKeyboardFunc(key); glutReshapeFunc(resize); glutIdleFunc(idle); // OpenGL Enables //glEnable(GL_DEPTH_TEST); // Set some statements glClearColor(0, 0, 0, 0); if (!cursor) glutSetCursor(GLUT_CURSOR_NONE); if (fullscreen) glutFullScreen(); // Glut main loop and exit glutMainLoop(); return 0; } /*----------------------------------------------------- /* Window Resize Function /*-----------------------------------------------------*/ void resize(int width, int height) { // Check if window is to low if (height < 1) height = 1; float ratio = width / height; // Reset Coordinates glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Fix viewport glViewport(0, 0, width, height); // Fix perspective gluPerspective(45, ratio, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); // Redraw glutPostRedisplay(); } /*----------------------------------------------------- /* Screen Render Function /*-----------------------------------------------------*/ void render(void) { // Clear window glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw glBegin(GL_LINE_LOOP); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.55f, 0.8f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.76f, 0.34f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.34f, 0.34f); glEnd(); // Print out glutSwapBuffers(); } /*----------------------------------------------------- /* Keboard Function /*-----------------------------------------------------*/ void key(unsigned char key, int x, int y) { float cx; float cy; // Check key switch (key) { case (char) 27: glutDestroyWindow(glutGetWindow()); exit(0); break; case 'w': cy++; break; case 'a': cx++; break; case 's': cy--; break; case 'd': cx--; break; default: break; } // Poind Camera gluLookAt (cx, cy, 0.0, 0.0, cy+1.0, 0.0, 0.0f, 1.0f, 0.0f); // Redraw window glutPostRedisplay(); } /*----------------------------------------------------- /* Idle Function /*-----------------------------------------------------*/ void idle() { glutPostRedisplay(); } Endret 10. august 2008 av Hagenz Lenke til kommentar
GeirGrusom Skrevet 10. august 2008 Del Skrevet 10. august 2008 Hver gang du kjører gluLookAt så vil projection matrisen multipliseres med gluLookAt resultatet. Derfor må du hente tilbake den gamle matrisen, eller lage hele matrisen på nytt (som kanskje er det enkleste) // Kjekt å ha struct vector3 { float x; float y; float z; vector3(float x, float y, float z) { this->x = x; this->y = y; this->z = z; } }; void SetupProjection(vector3& cam_pos, float aspect, float fov) { glPushAttribute(GL_MATRIX_MODE); { glMatrixMode(GL_PROJECTION) glLoadIdentity(); gluPerspective(fov, aspect, 1, 1000); gluLookAt(cam_pos.x, cam_pos.y, cam_pos.z, /* Up vector, jeg liker å bruke y */0, 1, 0); } glPopAttribute(GL_MATRIX_MODE); } void SomeFunction() { while(app_running) { DoWindowEvents(); // PeekMessage etc. CheckKeyState(); // Read key data SetupProjection(/* Camera position */ vector3(cx, cy, 0),/* Aspect ratio */ 1.0f, /* Field of view in degrees */ 45.0f); Render(); } } Noe slikt-ish. Jeg synes det er litt enklere dersom en bruker egne matriseklasser, en det er en helt annen sak. Lenke til kommentar
Mr.Garibaldi Skrevet 24. august 2008 Del Skrevet 24. august 2008 void key(unsigned char key, int x, int y) { float cx; float cy; // Check key switch (key) { case (char) 27: glutDestroyWindow(glutGetWindow()); exit(0); break; case 'w': cy++; break; case 'a': cx++; break; case 's': cy--; break; case 'd': cx--; break; default: break; } // Poind Camera gluLookAt (cx, cy, 0.0, 0.0, cy+1.0, 0.0, 0.0f, 1.0f, 0.0f); // Redraw window glutPostRedisplay(); } Bare ganske kort kommentar til hvorfor koden over ikke fungerer, du initialiserer aldri cx og cy, så når du da bruker ++ -- får du helt tilfeldige tall som som regel ikke vil gi deg verdien du ønsker å bruke i gluLookAt(). Lenke til kommentar
GeirGrusom Skrevet 24. august 2008 Del Skrevet 24. august 2008 Det er jo sant, og compileren skal gi en feilmelding om dette. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå