Como dibujar un crosshair en OpenGL (How to draw a crosshair in OpenGL)

En los videojuegos, principalmente en los de género FPS (First Person Shooter) se integra un crosshair para poder apuntar al objetivo al que se quiere disparar, ya sea un enemigo o un objeto cualquiera, los crosshairs son imprescindibles a pesar de que algunos shooters no lo tienen para usar otros modos de disparo.

Aquí se va a mostrar como realizar un crosshair en un programa que usa la API de OpenGL para un entorno 3D. Se basa en que en la función callback que alberga las instrucciones para llevar a cabo el renderizado de figuras en el programa se harán en un principio para un entorno 3D, y después pasaremos al entorno 2D desabilitando las funciones como el de profundidad y cargar la matriz de proyección en el cual con glOrtho se crea una proyección ortográfica con con el alto y largo de la medida de la ventana y dibujar las dos líneas que representan el crosshair.

Frágmento del código:

display()
{
    //Draw something 3D: triangles, cubes, spheres, ...

    //Crosshair
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_LIGHTING);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();
    glColor3f(1, 1, 1);
    glLineWidth(2.0);
    glBegin(GL_LINES);
    //horizontal line
        glVertex3f(WIDTH / 2 - 7, HEIGHT / 2, 0.0f);
        glVertex3f(WIDTH / 2 + 7, HEIGHT / 2, 0.0f);
    glEnd();
    //vertical line
    glBegin(GL_LINES);
        glVertex3f(WIDTH / 2, HEIGHT / 2 + 7, 0.0f);
        glVertex3f(WIDTH / 2, HEIGHT / 2 - 7, 0.0f);
    glEnd();
    glPopMatrix();

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);

    glutSwapBuffers(); //swap the buffers
}

Por supuesto, utilizar primitivas como GL_LINES es algo que se puede considerar ya obsoleto y si se desea se puede cambiar por glDrawArrays:

display()
{
    //Draw something 3D: triangles, cubes, spheres, ...

    //Crosshair
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_LIGHTING);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();
    glColor3f(1, 1, 1);
    glLineWidth(2.0);

    int crosshair[8] = {
    WIDTH / 2 - 7, HEIGHT / 2, // horizontal line
    WIDTH / 2 + 7, HEIGHT / 2,
   
    WIDTH / 2, HEIGHT / 2 + 7, //vertical line
    WIDTH / 2, HEIGHT / 2 - 7};

    //Enable vertex array
    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(2, GL_INT, 0, crosshair);

    glDrawArrays(GL_LINES, 0, 2); //draw horizontal line
    glDrawArrays(GL_LINES, 2, 2); //draw vertical line

    //Disable vertex array
    glDisableClientState(GL_VERTEX_ARRAY);
    glPopMatrix();

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);

    glutSwapBuffers(); //swap the buffers
}

Resultado:



Comentarios

Entradas populares