Nous avons un jeu principalement 2D qui fonctionne en mode orthographique, mais une partie montre un modèle 3D qui est rendu entre les autres objets 2D. Comment puis-je passer en mode perspective, rendre ce modèle, puis revenir en arrière pour rendre les autres objets en mode orthographique? Bravo si vous pouvez montrer comment cela se fait dans OpenGL ES.Basculer OpenGL en mode perspective sur une scène orthographique semi-rendue?
4
A
Répondre
4
Je pense que ce n'est pas exactement la question spécifiée. Voulez-vous plus de vues? Ou vous voulez avoir un fond 2D, des objets de jeu en 3D, 2D gui. Si vous voulez cela, alors:
- rendre fond plein écran
- ensemble fenêtre à la position = obj.pos-obj.size/2, size = obj.size, rendre objet
- rendu 2D IUG
Ou vous voulez quelque chose d'autre?
EDIT:
Voici peu de code:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,w,0,h,near,far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(pos.x,...);
DrawQuads();
//if you want to keep your previus matrix
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(90,width/(float)height,0.001,1000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(pos.x,...);
glRotate(-45.0f,1,0,0);
glTranslate(0,0,distance from object);
glRotate(90.0f,1,0,0);
// or use gluLookAt
// 0,0,1 - if you want have z as up in view
// 0,1,0 - for y
//gluLookAt(pos.x,pos.y,pos.z,cam.x,cam.y,cam.z,0,0,1);
glScale(object.width/model.width,...);
DrawModel();
// Restore old ortho
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
2
Eh bien, "just do it"
- définir votre matrice de projection ortho
- définir votre modelview pour les objets 2D
- Rendez vos objets 2D
- définir votre matrice de projection projection
- définir votre modelview pour les objets 3D
- effectue le rendu des objets 3D
... et cela peut aller à nouveau un nouveau
- et des tampons d'échange .
Si vous CONNAISSEZ l'ordre de vos objets comme vous semblez le faire, vous pouvez également effacer le z-buffer entre chaque rendu.
0
Je suis d'accord avec les messages précédents, et je pense que le cas plus général est comme objet 3D et 2D gui. Juste pour ré-accentuation. :)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)s_width/(GLfloat)s_height, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// render 3D object
glUseProgram(modelProgram);
glSetUniformMat(glGetUniformLocation(model.mvp, "mvp"), mvpMat);
glBindVertexArray(model.vao);
glDrawArrays(GL_TRIANGLES, 0, model.size);
glUseProgram(0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// draw GUI
renderGUI();
Je suis rendu plusieurs quadriceps en mode orthographiques en arrière-plan (sprites) après cela, je dois rendre un modèle 3D en mode perspective, puis après que je dois rendre un peu plus sprites au premier plan. Ce n'est pas seulement un arrière-plan en plein écran. Cela a-t-il du sens? –
Je l'ai édité, cela vous aidera-t-il? – kravemir
Merci d'avoir pris le temps de faire l'exemple du code. Je n'avais pas réalisé que tu pouvais pousser une matrice de projection. Le code de rotation/traduction était également utile. –