# T2.5 \[opt] Pyramid and interactive rotation with keyboard

We can also draw a pyramid

<figure><img src="https://3464970502-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3JUKGJZ67JX02QZdPhsy%2Fuploads%2F9qWmJhgtK9MuS92OmAoR%2F5b82ff67-5305-4ad0-9b49-e3d41c01dd22.png?alt=media&#x26;token=4ddf591a-d341-4d98-af1f-90cabac80b03" alt=""><figcaption></figcaption></figure>

## Pyramid data

```cpp
    // pyramid vertex data with RGB colour components
    GLfloat verts[] = {
        -1.0f, 1.0f,  0.0f, // v0
        0.0f, 1.0f,  0.0f,  // v0 colour green
        -1.0f, -1.0f, 0.0f, // v1
        0.0f, 0.0f, 0.0f,   // v1 colour black
        1.0f, -1.0f,  0.0f, // v2
        1.0f, 0.0f,  0.0f,  // v2 colour red
        1.0f, 1.0f,   0.0f, // v3
        1.0f, 1.0f,   0.0f, // v3 colour yellow

        0.0f, 0.0f, 1.0f, // v4
        0.0f, 0.0f, 1.0f,  // v4 colour blue
    };
    
    // indices of 6 triangles of a pyramid
    GLuint indices[] = { 
        0, 1, 2,  0, 2, 3, //base
        4, 0, 1,
        4, 1, 2,
        4, 2, 3,
        4, 3, 0
    };
```

you will get

<figure><img src="https://3464970502-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3JUKGJZ67JX02QZdPhsy%2Fuploads%2FjeezpKlkf0w7s849PyCl%2Fimage.png?alt=media&#x26;token=f40ff183-6ba7-40c1-a296-fe2e64017318" alt=""><figcaption></figcaption></figure>

## GLFW key\_callback

Write GLFW key call back in main.cpp to interactively change rotation angles

```cpp
float rot_x = 0;
float rot_y = 0;
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_LEFT ) {
        rot_y -= 5.0;
    } else if (key == GLFW_KEY_RIGHT /*&& action == GLFW_PRESS*/) {
        rot_y += 5.0;
    } if (key == GLFW_KEY_DOWN ) {
        rot_x += 5.0;
    } else if (key == GLFW_KEY_UP) {
        rot_x -= 5.0;
    }

    glm::mat4 mat_scale = glm::scale(glm::vec3(0.5f, 0.5f, 0.5f));
    glm::mat4 mat_rot_y = glm::rotate(glm::radians(rot_y), glm::vec3(0.0f, 1.0f, 0.0f));
    glm::mat4 mat_rot_x = glm::rotate(glm::radians(rot_x), glm::vec3(1.0f, 0.0f, 0.0f));

    glm::mat4 mat_modelview =  mat_rot_x * mat_rot_y * mat_scale;
    
    GLuint modelview_loc = glGetUniformLocation( shader.program, "modelview" );
    glUniformMatrix4fv(modelview_loc, 1, GL_FALSE, &mat_modelview[0][0]);
}
```

## Set key\_callback

In main(), add one line after glfw window creation

```cpp
    // create a GLFW window
    window = glfwCreateWindow(640, 640, "Hello OpenGL 2", NULL, NULL);
    glfwMakeContextCurrent(window);

    // register the key event callback function
    glfwSetKeyCallback(window, key_callback);
```

Now you can play rotating the pyramid with the arrow keys.

<figure><img src="https://3464970502-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3JUKGJZ67JX02QZdPhsy%2Fuploads%2FijIl0axd14F1ryav9ih8%2Fimage.png?alt=media&#x26;token=08f63f78-dd98-4ad7-82b6-3f6bf7dd5f5d" alt=""><figcaption></figcaption></figure>
