Saltar al contenido

C++ OpenGL, GLFW Dibujar un cubo simple

Tenemos la mejor solución que descubrimos on line. Nuestro deseo es que te sirva de ayuda y si quieres aportar algo que nos pueda ayudar a crecer hazlo con total libertad.

Solución:

  1. Nunca establece una matriz de proyección (significativa).
  2. No abuse de la pila de matriz de proyección.
  3. No establezca sus matrices en drawCube()principio de responsabilidad única y todo eso.
  4. Establezca su ventana gráfica antes de tratando de dibujar
  5. C++ tiene c-versiones prefijadas (stdio.h -> cstdio) de los encabezados C. Usa esos en su lugar.

Todos juntos:

#include 
#include 

#include 

void controls(GLFWwindow* window, int key, int scancode, int action, int mods)

    if(action == GLFW_PRESS)
        if(key == GLFW_KEY_ESCAPE)
            glfwSetWindowShouldClose(window, GL_TRUE);


GLFWwindow* initWindow(const int resX, const int resY)

    if(!glfwInit())
    
        fprintf(stderr, "Failed to initialize GLFWn");
        return NULL;
    
    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing

    // Open a window and create its OpenGL context
    GLFWwindow* window = glfwCreateWindow(resX, resY, "TEST", NULL, NULL);

    if(window == NULL)
    
        fprintf(stderr, "Failed to open GLFW window.n");
        glfwTerminate();
        return NULL;
    

    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, controls);

    // Get info of GPU and supported OpenGL version
    printf("Renderer: %sn", glGetString(GL_RENDERER));
    printf("OpenGL version supported %sn", glGetString(GL_VERSION));

    glEnable(GL_DEPTH_TEST); // Depth Testing
    glDepthFunc(GL_LEQUAL);
    glDisable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    return window;


void drawCube()

    GLfloat vertices[] =
    
        -1, -1, -1,   -1, -1,  1,   -1,  1,  1,   -1,  1, -1,
        1, -1, -1,    1, -1,  1,    1,  1,  1,    1,  1, -1,
        -1, -1, -1,   -1, -1,  1,    1, -1,  1,    1, -1, -1,
        -1,  1, -1,   -1,  1,  1,    1,  1,  1,    1,  1, -1,
        -1, -1, -1,   -1,  1, -1,    1,  1, -1,    1, -1, -1,
        -1, -1,  1,   -1,  1,  1,    1,  1,  1,    1, -1,  1
    ;

    GLfloat colors[] =
    
        0, 0, 0,   0, 0, 1,   0, 1, 1,   0, 1, 0,
        1, 0, 0,   1, 0, 1,   1, 1, 1,   1, 1, 0,
        0, 0, 0,   0, 0, 1,   1, 0, 1,   1, 0, 0,
        0, 1, 0,   0, 1, 1,   1, 1, 1,   1, 1, 0,
        0, 0, 0,   0, 1, 0,   1, 1, 0,   1, 0, 0,
        0, 0, 1,   0, 1, 1,   1, 1, 1,   1, 0, 1
    ;

    static float alpha = 0;
    //attempt to rotate cube
    glRotatef(alpha, 0, 1, 0);

    /* We have a color array and a vertex array */
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glColorPointer(3, GL_FLOAT, 0, colors);

    /* Send data : 24 vertices */
    glDrawArrays(GL_QUADS, 0, 24);

    /* Cleanup states */
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    alpha += 1;


void display( GLFWwindow* window )

    while(!glfwWindowShouldClose(window))
    
        // Scale to window size
        GLint windowWidth, windowHeight;
        glfwGetWindowSize(window, &windowWidth, &windowHeight);
        glViewport(0, 0, windowWidth, windowHeight);

        // Draw stuff
        glClearColor(0.0, 0.8, 0.3, 1.0);
        glClear(GL_COLOR_BUFFER_BIT 


int main(int argc, char** argv)

    GLFWwindow* window = initWindow(1024, 620);
    if( NULL != window )
    
        display( window );
    
    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;

Creo que su problema es que básicamente está usando proyección ortográfica, o ciertamente algo que no es perspectiva, que es lo que le dará al cubo más apariencia “3D” que creo que está buscando.

Intente algo como lo siguiente para establecer una matriz de proyección de perspectiva correcta:

glMatrixMode(GL_PROJECTION_MATRIX);
glLoadIdentity();
gluPerspective(45, windowWidth / windowHeight, 0.1f, 100.0f);

// Draw calls.

valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *