wahr isometrische Projektion mit opengl
-
21-08-2019 - |
Frage
Ich bin ein Neuling in OpenGL-Programmierung mit C ++ und nicht sehr gut in Mathematik. Gibt es eine einfache Art und Weise Isometrie zu haben?
Ich meine die wahre Isometrie , nicht die allgemeine orthogonale Projektion.
(isometrische Projektion geschieht nur, wenn Vorsprünge der Einheit X, Y und Z-Vektoren gleich lang sind und die Winkel zwischen ihnen sind genau 120 Grad.)
Code-Schnipsel sind sehr geschätzt ..
Lösung
Versuchen Sie es mit 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();
Ergebnisse in
Wir können einen Würfel ziehen zu überprüfen, dass parallele Linien in der Tat parallel sind
glPushMatrix();
glTranslated(0.5, 0.5, 0.5);
glColor3d(0.5, 0.5, 0.5);
glutWireCube(1);
glPopMatrix();
Andere Tipps
Eine isometrische Projektion ist nur eine Frage der eine orthogonale Projektion mit einem bestimmten Drehwinkel verwendet wird.
Es sollte möglich sein, eine der acht möglichen Ausrichtungen zu wählen, mit einer orthographischen Projektion und eine perfekte isometrische Ansicht des Modells erhalten. eine orthogonale Projektion für Ihre Projektionsmatrix folgen Sie einfach der Mathematik in der referenzierten Wiki Artikel zum Einstellen der Ansicht Matrix auf, und tun, und Sie sind alle gesetzt.
Vielleicht bin ich nicht ganz grokking die Mathematik richtig, konnte aber nicht, dass Sie nur Ihre Kamera positionieren, wie es in dieser Empfehlungen und die Verwendung einer Standard-orthogonale Projektion erklärt?
Auch wenn es nicht das gleiche ist, ist der Vorsprung Stapel ganz Ihnen überlassen.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// your isometric matrix here (see math on Wikipedia)
glMatrixMode(GL_MODELVIEW);
Wenn Sie GLU nicht verwenden wollen, hier ist nackte Knochen mit 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);
}
und rufen Sie so etwas wie dieses
gl_enter_2_5d_mode()
test()
gl_leave_2_5d_mode()
sollten Sie wollen zwischen 2d und 2.5d wechseln (so dass Sie Ihre UI zeichnen können) dann ähnliche Funktionen Ich habe zu betreten und verlassen 2D-Modus z.
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();
}