Gå til innhold

OpenGL Dybde og rotasjon


Anbefalte innlegg

Driver å tester ut forskjellige ting i GL og stucker p denne, hvorfor vil ikke den lage en 3 dimensjonal pyramide, som er litt vridd?

 

#include <GL/glut.h>

void display() {
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glRotatef(0.7, 0.0, 1.0, 0.0);
glBegin(GL_TRIANGLE_STRIP);
	glColor3d(1.0, 0.0, 0.0); 	glVertex3d(-0.75, -0.75,  1.0);
	glColor3d(0.0, 1.0, 0.0);	glVertex3d( 0.75, -0.75,  1.0);
	glColor3d(1.0, 1.0, 1.0); 	glVertex3d(  0.0,  0.75,  1.0);
	glColor3d(0.0, 0.0, 1.0);	glVertex3d(  0.0, -0.75, -1.0);
	glColor3d(1.0, 0.0, 0.0); 	glVertex3d(-0.75, -0.75,  1.0);
glEnd();
glPopMatrix();

glFinish();
glutSwapBuffers();
}

int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("OpenGL Depth Test");
glutDisplayFunc(display);
glutMainLoop();
}

Lenke til kommentar
Videoannonse
Annonse

For det første brukerdu glRotate funksjonen feil, for det andre kan jeg ikke se at du har satt opp noen projection matrise.

 

glRotate brukes slik:

glRotate(x_akse, y_akse, z_akse, vinkel)

vinkel MÅ være mer enn null for å få noen effekt.

 

For å sette perspektiv, har du tre muligheter: du kan bruke glFrustum funksjonen, gluPerspective funksjonen, eller lage din egen matrise. gluPerspective er greiest når du skal lære deg OpenGL.

 

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 1, .0001f,  2);
glMatrixMode(GL_MODELVIEW);

Lenke til kommentar

Hmmm, virker til å ha liten effekt...

 

#include <GL/glut.h>

void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glRotatef(0.0, 0.0, 1.0, 0.5);
glBegin(GL_TRIANGLE_STRIP);
	glColor3d(1.0, 0.0, 0.0); 	glVertex3d(-0.75, -0.75,  1.0);
	glColor3d(0.0, 1.0, 0.0);	glVertex3d( 0.75, -0.75,  1.0);
	glColor3d(1.0, 1.0, 1.0); 	glVertex3d(  0.0,  0.75,  1.0);
	glColor3d(0.0, 0.0, 1.0); 	glVertex3d(  0.0, -0.75, -1.0);
	glColor3d(1.0, 0.0, 0.0); 	glVertex3d(-0.75, -0.75,  1.0);
glEnd();
glPopMatrix();

glFinish();
glutSwapBuffers();
}

int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("OpenGL Depth Test");
glutDisplayFunc(display);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(0, 1, .0001f,  2); // noen annet enn 0 i 1  param gjør skjermen svart, hmm?
glMatrixMode(GL_MODELVIEW);
glClearColor(0, 0, 0, 0);

glutMainLoop();
}

Lenke til kommentar
  • 2 uker senere...

#include <GL/glut.h>

static float rotation = 0.0f;

void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity(); // Ikke gå ut ifra at matrisen er I.

	glTranslatef(0.0f, 0.0f, -5.0f); // 5 enheter bakover med kamera.

	glRotatef(rotation, 0.0f, 1.0f, 0.0f); // Litt rotation rundt Y-aksen.
	glPushMatrix();
	glRotatef(0.0, 0.0, 1.0, 0.5);
	glBegin(GL_TRIANGLE_STRIP);
	glColor3d(1.0, 0.0, 0.0); glVertex3d(-0.75, -0.75, 1.0);
	glColor3d(0.0, 1.0, 0.0); glVertex3d( 0.75, -0.75, 1.0);
	glColor3d(1.0, 1.0, 1.0); glVertex3d( 0.0, 0.75, 1.0);
	glColor3d(0.0, 0.0, 1.0); glVertex3d( 0.0, -0.75, -1.0);
	glColor3d(1.0, 0.0, 0.0); glVertex3d(-0.75, -0.75, 1.0);
	glEnd();
	glPopMatrix();

	glutSwapBuffers(); // Trenger kun glFinish() ved ett framebuffer (GLUT_SINGLE til glutInitDisplayMode).
}

void idle()
{
	rotation = rotation + 0.5f; // Burde gjøres med timing for å mappe til real-time.
	glutPostRedisplay(); // Si til GLUT at den skal tegne igjen.
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h); // Tilpass området det tegnes til.
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60, (float)w / (float)h, 0.1f, 1000.0f); // Sett opp passende perspektiv.
}

void initGL()
{
	glClearColor(0, 0, 0, 0);
}

int main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(800, 600);
	glutInitWindowPosition(0, 0);
	glutCreateWindow("OpenGL Depth Test");
	glutDisplayFunc(display);
	glutReshapeFunc(reshape); // Når vinduet reshapes (også en gang ved oppstart).
	glutIdleFunc(idle); // Kalles når messageloopen ikke har noen meldinger.
	glutMainLoop();
}

 

Et eksempel på å dele opp problemene i sine egne funksjoner. Her ser du også litt mer hva som skjer i verdenen du lager med en liten rotasjon. Lykke til! :)

Endret av LostOblivion
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å
×
×
  • Opprett ny...