3.3.3. Rotación. | Graficacion OpenGL C++

 La rotación es una transformación tridimensional que se utiliza para girar un objeto en una dirección específica en el espacio tridimensional. En OpenGL, se utiliza la función `glRotatef()` para realizar una rotación.


El siguiente ejemplo muestra cómo realizar una rotación en OpenGL para girar un objeto en el eje Z:


```c++

// Definir la matriz de transformación

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glRotatef(45.0f, 0.0f, 0.0f, 1.0f);


// Dibujar el objeto

glBegin(GL_TRIANGLES);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(0.0f, 1.0f, 0.0f);

glEnd();

```


En este ejemplo, primero se define la matriz de transformación utilizando las funciones `glMatrixMode()` y `glLoadIdentity()`. A continuación, se utiliza la función `glRotatef()` para realizar una rotación de 45 grados en el eje Z.


Finalmente, se dibuja un objeto en la ventana de OpenGL utilizando la función `glBegin()` y `glEnd()`, que dibuja un triángulo en la posición transformada.


El resultado de este código sería un triángulo girado 45 grados en la ventana de OpenGL.


Al igual que con la traslación y el escalado, la función `glRotatef()` también se acumula, lo que significa que cada vez que se llama, se aplica una nueva rotación a la matriz de transformación actual. Para evitar que las transformaciones se acumulen, se puede guardar la matriz de transformación actual utilizando la función `glPushMatrix()` antes de llamar a `glRotatef()`, y restaurarla más tarde utilizando `glPopMatrix()`.


```c++

// Definir la matriz de transformación

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glPushMatrix();  // Guardar la matriz de transformación actual

glRotatef(45.0f, 0.0f, 0.0f, 1.0f);


// Dibujar el primer objeto

glBegin(GL_TRIANGLES);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(0.0f, 1.0f, 0.0f);

glEnd();


glPopMatrix();  // Restaurar la matriz de transformación anterior

glTranslatef(0.0f, 2.0f, 0.0f);


// Dibujar el segundo objeto

glBegin(GL_QUADS);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 0.0f);

glVertex3f(-1.0f, 1.0f, 0.0f);

glEnd();

```


En este ejemplo, se utiliza la función `glPushMatrix()` antes de llamar a `glRotatef()`, y se utiliza la función `glPopMatrix()` para restaurar la matriz de transformación anterior antes de dibujar el segundo objeto. De esta manera, se asegura que cada objeto se dibuje en su propia posición, sin acumular las transformaciones del objeto anterior.


Es importante tener en cuenta que la función `glRotatef()` utiliza ángulos en grados, y que los ejes de rotación están definidos en el espacio tridimensional. Por ejemplo, para rotar en el eje X se utilizaría el vector (1, 0, 0), para el eje Y se utilizaría el vector (0, 1, 0) y para el eje Z se utilizaría el vector (0, 0, 1).


```c++

// Definir la matriz de transformación

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glRotatef(30.0f, 1.0f, 0.0f, 0.0f);  // Rotación en el eje X

glRotatef(45.0f, 0.0f, 1.0f, 0.0f);  // Rotación en el eje Y

glRotatef(60.0f, 0.0f, 0.0f, 1.0f);  // Rotación en el eje Z


// Dibujar el objeto

glBegin(GL_TRIANGLES);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(0.0f, 1.0f, 0.0f);

glEnd();

```


En este ejemplo, se realiza una rotación de 30 grados en el eje X, seguida de una rotación de 45 grados en el eje Y y una rotación de 60 grados en el eje Z. El objeto resultante se dibujaría en la ventana de OpenGL con estas transformaciones aplicadas.


En resumen, la rotación es una transformación tridimensional que se utiliza para girar un objeto en una dirección específica en el espacio tridimensional. En OpenGL, se utiliza la función `glRotatef()` para realizar una rotación, y se pueden especificar los ejes de rotación utilizando vectores tridimensionales. Para evitar la acumulación de transformaciones, se recomienda utilizar las funciones `glPushMatrix()` y `glPopMatrix()` para guardar y restaurar la matriz de transformación actual.

Comentarios