Tutorial 14 - Movimiento-3D (Avión)
Fecha Miércoles, 05 septiembre a las 23:16:47
Tema DirectX/Opengl


Esta vez vamos a salir volando. Como en el ejemplo anterior, habría que añadir física para reproducir fielmente el vuelo de un avión, ya que cuando giramos, sólo es un giro sobre el eje Z y nuestro "avión" no se desplaza lateralmente ni pierde altura como debería ser. Pero bueno.



Para volar, sólo tenemos que realizar unos giros diferentes a como lo hacíamos en el ejemplo anterior. Según pulsemos las teclas del cursor, elevará o bajará el morro (pitch en inglés) o girará en el eje Z (alabeo o roll en inglés).


    ///////////////////////////////////////////////////////////////////////////////
    ///     CheckMovement: Comprueba si hay pulsada una tecla.
    ///
    ///     @param  long msElapsed: misilegundos transcurridos entre cada frame.
    ///
    ///     @return  nada
    ///////////////////////////////////////////////////////////////////////////////
    void GraphicApplication::CheckMovement( long msElapsed )
    {
        float speed= m_Player.GetSpeed();

        if ( m_KeysPressed[KEY_PLUS] || m_KeysPressed[KEY_NUMERIC_PLUS] )
        {
            m_Player.SetSpeed( speed + OBJECT_ACCELERATION );   // Aceleramos
        }

        if ( m_KeysPressed[KEY_MINUS] || m_KeysPressed[KEY_NUMERIC_MINUS] )
        {
            m_Player.SetSpeed( speed - OBJECT_ACCELERATION );   // Frenamos
        }

        m_Player.Forward( speed * msElapsed );                      // Avanzamos


    // ********************************* NEW **************************************

        if ( m_KeysPressed[KEY_UP] || m_KeysPressed[''W''] )
        {
            m_Player.Pitch  ( -OBJECT_TURN * msElapsed  );          // Picado
        }
        else if ( m_KeysPressed[KEY_DOWN] || m_KeysPressed[''S''] )
        {
            m_Player.Pitch  (  OBJECT_TURN * msElapsed );           // Elevación
        }

        // ¿Giramos?
        if ( m_KeysPressed[KEY_LEFT] || m_KeysPressed[''A''] )
        {
            m_Player.Roll ( -OBJECT_TURN  * msElapsed );            // Alabeo Izquierda
        }
        else if ( m_KeysPressed[KEY_RIGHT] || m_KeysPressed[''D''] )
        {
            m_Player.Roll (  OBJECT_TURN  * msElapsed );            // Alabeo Derecha
        }

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

Podéis descargaros el ejemplo: tutorial-14.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=15