que proyeccion perspectiva paso isometricos isometrico isometrica ejercicios ejemplos dimetrica dibujos dibujo caballera axonometrica c++ opengl projection isometric

c++ - perspectiva - proyeccion dimetrica



Proyección isométrica verdadera con opengl. (4)

Soy un novato en la programación OpenGL con C ++ y no soy muy bueno en matemáticas. ¿Hay una forma sencilla de tener proyección isométrica?

Me refiero a la verdadera proyección isométrica , no a la proyección ortogonal general.

(La proyección isométrica ocurre solo cuando las proyecciones de los vectores de unidad X, Y y Z son igualmente largas y los ángulos entre ellos son exactamente de 120 grados).

Los fragmentos de código son muy apreciados ..


Si no desea utilizar GLU, aquí está el uso de glOrtho

void gl_enter_2_5d_mode (void) { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); double scale = 50; glOrtho(-scale, scale, -scale * 0.7, scale * 0.7, -scale, scale); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glRotatef(35.264f, 1.0f, 0.0f, 0.0f); glRotatef(-45.0f, 0.0f, 1.0f, 0.0f); } void gl_leave_2_5d_mode (void) { glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); } then draw a cube in it void cube (double size) { glBegin(GL_QUADS); glVertex3f(size,size,size); glVertex3f(-size,size,size); glVertex3f(-size,-size,size); glVertex3f(size,-size,size); glVertex3f(size,size,-size); glVertex3f(-size,size,-size); glVertex3f(-size,-size,-size); glVertex3f(size,-size,-size); glVertex3f(size,size,size); glVertex3f(size,-size,size); glVertex3f(size,-size,-size); glVertex3f(size,size,-size); glVertex3f(-size,size,size); glVertex3f(-size,-size,size); glVertex3f(-size,-size,-size); glVertex3f(-size,size,-size); glVertex3f(size,size,size); glVertex3f(-size,size,size); glVertex3f(-size,size,-size); glVertex3f(size,size,-size); glVertex3f(size,-size,size); glVertex3f(-size,-size,size); glVertex3f(-size,-size,-size); glVertex3f(size,-size,-size); glEnd(); } void test (void) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBindTexture(GL_TEXTURE_2D, 0); cube(1.0); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); }

y llamar a algo como esto

gl_enter_2_5d_mode() test() gl_leave_2_5d_mode()

Si desea cambiar entre 2d y 2.5d (para poder dibujar su IU), tengo funciones similares para entrar y salir del modo 2d, por ejemplo.

void gl_init_2d_mode (void) { /* * Enable Texture Mapping */ glEnable(GL_TEXTURE_2D); /* * Enable alpha blending for sprites */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* * Setup our viewport */ glViewport(0, 0, game.video_pix_width, game.video_pix_height); /* * Make sure we''re changing the model view and not the projection */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); /* * Reset the view */ glLoadIdentity(); gl_init_fbo(); } void gl_enter_2d_mode (void) { /* * Change to the projection matrix and set our viewing volume. */ glMatrixMode(GL_PROJECTION); glPushMatrix(); /* * Reset the view */ glLoadIdentity(); /* * 2D projection */ glOrtho(0, game.video_gl_width, game.video_gl_height, 0, -1200.0, 1200.0); /* * Make sure we''re changing the model view and not the projection */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); /* * Reset the view */ glLoadIdentity(); }


Tal vez no estoy asimilando las matemáticas correctamente, pero ¿no podría simplemente ubicar su cámara como se explica en ese enlace de Wikipedia y usar una proyección ortogonal estándar?

Incluso si no es lo mismo, la pila de proyección depende completamente de usted.

glMatrixMode(GL_PROJECTION); glLoadIdentity(); // your isometric matrix here (see math on Wikipedia) glMatrixMode(GL_MODELVIEW);


Trate de usar gluLookAt

glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* use this length so that camera is 1 unit away from origin */ double dist = sqrt(1 / 3.0); gluLookAt(dist, dist, dist, /* position of camera */ 0.0, 0.0, 0.0, /* where camera is pointing at */ 0.0, 1.0, 0.0); /* which direction is up */ glMatrixMode(GL_MODELVIEW); glBegin(GL_LINES); glColor3d(1.0, 0.0, 0.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(1.0, 0.0, 0.0); glColor3d(0.0, 1.0, 0.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(0.0, 1.0, 0.0); glColor3d(0.0, 0.0, 1.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(0.0, 0.0, 1.0); glEnd(); glFlush();

Resultados en

Podemos dibujar un cubo para comprobar que las líneas paralelas son paralelas

glPushMatrix(); glTranslated(0.5, 0.5, 0.5); glColor3d(0.5, 0.5, 0.5); glutWireCube(1); glPopMatrix();


Una proyección isométrica es solo una cuestión de usar una proyección ortográfica con un ángulo de rotación específico.

Debería poder elegir cualquiera de las 8 orientaciones potenciales, con una proyección ortográfica, y obtener una vista isométrica perfecta de su modelo. Simplemente siga las matemáticas en su artículo de Wiki referenciado para configurar la matriz de vista, y haga una proyección ortográfica para su matriz de proyección, y estará listo.