Tutorial 09 - Cubo-3D
Fecha Miércoles, 05 septiembre a las 20:21:05
Tema DirectX/Opengl


Por fin llegan las 3-D. Vamos a ver un sencillo ejemplo en el cual vamos a renderizar un cubo en modo malla ya que hasta el siguiente tutorial en el que añadiremos iluminación, no podremos ver un objeto sólido correctamente.



Para renderizar un cubo, necesitamos especificar unos puntos en el espacio 3-D con coordenadas (x,y,z). En OpenGL, la coordenada X es el eje horizontal, la Y el eje vertical y la Z es el eje de profundidad con valor positivo hacia fuera de la pantalla.

Así que nuestro cubo estará formado por 8 vértices que para renderizarlos los recorreremos en el orden indicado por el array de índices, cuyo valor indica qué vértice debe renderizarse en cada momento.


//      v7     v6
//      *------*
//   v4/.  v5 /|
//    *-----*  |
//   v|3*...|..* v2
//    |.    | /
//    *-----*/
//   v0     v1
float GraphicApplication::m_Cube[8][3] =
{
    {-5,-5, 5}, /* v0 */
    { 5,-5, 5}, /* v1 */
    { 5,-5,-5}, /* v2 */
    {-5,-5,-5}, /* v3 */
    {-5, 5, 5}, /* v4 */
    { 5, 5, 5}, /* v5 */
    { 5, 5,-5}, /* v6 */
    {-5, 5,-5}  /* v7 */
};

// Recorrido: v4,v0,v5,v1,v6,v2,v7,v3,v4,v0
int GraphicApplication::m_IndexCube[10]= {4,0,5,1,6,2,7,3,4,0};

De esta forma, renderizar el cubo resulta sencillo, sólo hay quer recorrer el array de índices renderizando cada vértice que éste nos indica:


///////////////////////////////////////////////////////////////////////////////
///     RenderObjects: Dibuja las geometrías.
///
///     @param  nada
///
///     @return  nada
///////////////////////////////////////////////////////////////////////////////
void GraphicApplication::RenderObjects()
{
    Vertex vertexArray[10];

    if ( m_pVideoDriver )
    {
// ********************************* NEW **************************************

        for (int i=0; i<10; i++)
        {
            vertexArray[i].x= m_Cube[m_IndexCube[i]][0];
            vertexArray[i].y= m_Cube[m_IndexCube[i]][1];
            vertexArray[i].z= m_Cube[m_IndexCube[i]][2];
            vertexArray[i].color.rgba= 0xffffffff;
        }

        m_pVideoDriver->RenderVertexArray( eTriangleStrip, (BYTE*)vertexArray, sizeof(Vertex), 0, 10, eFVF_XYZ|eFVF_DIFFUSE );

// ****************************************************************************
    }
}

Para que el cubo tenga un aspecto en perspectiva, usaremos ahora una proyección diferente, en la que se especifica el valor de perspeciva (FOV) la relación de aspecto ancho/alto de la pantalla:


m_pVideoDriver->SetPerspective( FOV, m_WindowProps.width, m_WindowProps.height );

Finalmente, hay que especificar el punto de vista del observador mediante LookAt().


m_pVideoDriver->LookAt( Vector3(10.0f, 2.0f,30.0f) ,    // Posición de la cámara.
                        Vector3( 0.0f, 0.0f, 0.0f) ,    // A dónde mira.
                        Vector3( 0.0f, 1.0f, 0.0f) );   // Dónde se encuentra el "techo", eje Y. 

Podéis descargaros el ejemplo: tutorial-09.zip



Compartir en Facebook



Este artículo proviene de Programacion Grafica: Desarrollo 2D/3D con C++ y DirectX/OpenGL/GLUT/SDL - Windows/Linux
http://www.programaciongrafica.com

La dirección de esta noticia es:
http://www.programaciongrafica.com/modules.php?name=News&file=article&sid=10