Gå til innhold

OpenGL Viewpoint hjelp...


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av Hagenz
Lenke til kommentar

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

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

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

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. :D

Lenke til kommentar

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

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 av Hagenz
Lenke til kommentar

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
  • 2 uker senere...
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...