La sección anterior te enseñó cómo colorear triángulos y cuadriláteros. Esta lección le enseñará cómo rotar estos objetos de colores alrededor de sus ejes de coordenadas.
De hecho, basta con añadir unas pocas líneas al código de la sección anterior. Reescribamos toda la rutina nuevamente. Te conviene saber qué se ha añadido y qué se ha modificado.
Agregue dos variables para controlar la rotación de estos dos objetos. Estas dos variables se agregan después de las otras variables al comienzo del programa (bool fullscreen=TRUE; dos líneas más abajo). Son variables de tipo punto flotante que nos permiten rotar objetos con mucha precisión. Los números de coma flotante contienen decimales, lo que significa que no necesitamos usar ángulos de 1, 2, 3... Descubrirá que los números de punto flotante son la base de la programación OpenGL. La nueva variable llamada rtri se usa para rotar el triángulo y rquad se usa para rotar el cuadrilátero.
var
…
rtri: GLfloat; // Ángulo para triángulo (nuevo)
rquad: GLfloat; // Ángulo para cuadrilátero (nuevo)
…
Luego modifique glDraw() de la siguiente manera:
Procedimiento glDraw();
Comenzar
glClear(GL_COLOR_BUFFER_BIT O GL_DEPTH_BUFFER_BIT // Borra la pantalla y el búfer de profundidad);
glLoadIdentity(); //Restablecer la matriz de observación del modelo actual
//La siguiente línea de código es nueva. glRotatef(Angle,Xvector,Yvector,Zvector) es responsable de rotar el objeto alrededor de un eje determinado.
//Este comando tiene muchos usos. El ángulo suele ser una variable que representa el ángulo en el que se gira el objeto.
// Los tres parámetros Xvector, Yvector y Zvector determinan conjuntamente la dirección del eje de rotación.
//Por ejemplo, el vector descrito por (1,0,0) pasa por 1 unidad del eje de coordenadas X y se dirige hacia la derecha.
//El vector descrito por (-1,0,0) pasa por 1 unidad del eje de coordenadas X, pero en dirección izquierda.
//D. Michael Traub: Proporciona la explicación anterior de Xvector, Yvector y Zvector.
//Para entender mejor la rotación de X, Y y Z, déjame darte algunos ejemplos...
// Eje X: estás utilizando una sierra de mesa. El eje en el centro de la hoja se coloca de izquierda a derecha (al igual que el eje X en OpenGL).
//Los afilados dientes de la sierra giran violentamente alrededor del eje X, aparentemente girando hacia arriba o hacia abajo.
//Depende de la dirección en la que comienza a girar la hoja de sierra. Esta es la misma situación que cuando rotamos algo alrededor del eje X en OpenGL.
//(Nota del traductor: si pones tu cara hacia el monitor en este momento, definitivamente te cortarán ^-^.)
// Eje Y: digamos que estás en el centro de un tornado enorme, con el centro del tornado apuntando desde el suelo hacia el cielo (al igual que el eje Y en OpenGL).
//La basura y los escombros giran violentamente alrededor del eje Y de izquierda a derecha o de derecha a izquierda.
//Esta es la misma situación que cuando rotamos algo alrededor del eje Y en OpenGL.
//Eje Z: estás mirando un ventilador de frente. El centro del ventilador apunta directamente hacia usted (como el eje Z en OpenGL).
//Las aspas del ventilador giran violentamente en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj alrededor del eje Z. Esta es la misma situación que cuando rotamos algo alrededor del eje Z en OpenGL.
glTranslatef(-1.5, 0.0, -6.0); // Mover hacia la izquierda 1.5 unidades y entrar en la pantalla 6.0
//En la siguiente línea de código, si rtri es igual a 7, rotamos el triángulo 7 de izquierda a derecha alrededor del eje Y.
//También puedes cambiar el valor del parámetro para rotar el triángulo alrededor de los ejes X e Y simultáneamente.
glRotatef(rtri, 0.0, 1.0, 0.0); // Gira el triángulo alrededor del eje Y (nuevo)
//No hay cambios en el código siguiente. Se dibuja un triángulo degradado de color en el lado izquierdo de la pantalla y se gira de izquierda a derecha alrededor del eje Y.
glBegin(GL_TRIANGLES); // Dibujar triángulos
glColor3f(1.0, 0.0, 0.0); //Establece el color actual en rojo
glVertex3f(0.0, 1.0, 0.0); // Vértice superior
glColor3f(0.0, 1.0, 0.0); //Establece el color actual en verde
glVertex3f(-1.0, -1.0, 0.0 // Abajo a la izquierda);
glColor3f(0.0, 0.0, 1.0); //Establece el color actual en azul
glVertex3f(1.0, -1.0, 0.0); // Abajo a la derecha
glEnd(); // Fin del dibujo del triángulo
// Notarás en el código siguiente que hemos agregado otra llamada a glLoadIdentity().
// El propósito es restablecer la matriz de observación del modelo.
//Si no reiniciamos y llamamos a glTranslate directamente, se producirán resultados inesperados.
//Debido a que el eje de coordenadas ha sido girado, probablemente no esté en la dirección deseada.
// Entonces, lo que originalmente queríamos mover el objeto hacia la izquierda y hacia la derecha puede volverse hacia arriba y hacia abajo, dependiendo de cuánto gire el eje de coordenadas.
// Intente comentar glLoadIdentity() y vea qué resultados aparecerán.
// Después de restablecer la matriz de observación del modelo, los ejes X, Y y Z se restablecen y llamamos a glTranslate.
// Notarás que esta vez solo movimos 1,5 unidades hacia la derecha en lugar de 3,0 unidades como en la lección anterior.
//Porque cuando reiniciamos la escena, el foco volvió al centro de la escena (en 0.0).
//De esta manera sólo necesitas moverte 1,5 unidades hacia la derecha.
//Cuando nos movamos a la nueva posición, rotamos el quad alrededor del eje X. El cuadrado girará hacia arriba y hacia abajo.
glLoadIdentity(); //Restablecer matriz de observación del modelo
glTranslatef(1.5, 0.0, -6.0); // Muévete 1,5 unidades hacia la derecha y pasa a la pantalla 6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // Gira el cuadrilátero alrededor del eje X (nuevo)
glBegin(GL_QUADS); // Dibuja un cuadrado
glColor3f(0.6, 0.2, 2.0); //Establece el color actual en violeta
glVertex3f(-1.0, 1.0, 0.0); // Arriba a la izquierda
glVertex3f(1.0, 1.0, 0.0); // Arriba a la derecha
glVertex3f(1.0, -1.0, 0.0); // Abajo a la izquierda;
glVertex3f(-1.0, -1.0, 0.0); // Abajo a la derecha
glEnd(); // Fin del dibujo del cuadrado
//Las dos líneas siguientes son nuevas.
//Si imaginamos rtri y rquad como contenedores,
// Luego, al comienzo del programa creamos contenedores (rtri y rquad).
//Cuando se crea el contenedor, está vacío.
//La primera línea de código siguiente agrega 0.2 al contenedor.
// Entonces, cada vez que ejecutamos el código anterior, el valor en el contenedor rtri aumentará en 0,2 aquí.
//La siguiente línea reduce el valor en el contenedor rquad en 0,15.
// De manera similar, cada vez que ejecutamos el código anterior, el valor en el contenedor rquad aquí disminuirá en 0,15.
// La caída eventualmente hará que el objeto gire en la dirección opuesta a la dirección de crecimiento.
rtri := rtri + 0.2; // Aumenta la variable de rotación del triángulo (nuevo)
rquad := rquad - 0.15; // Reducir la variable de rotación del cuadrilátero (nuevo)
Fin;