【三十,坐标系统-05更多的立方体】

概述

我们这次在上一个绘制单个立方体的功能上进行拓展:绘制更多个立方体,区别在于它们的世界坐标和旋转角度不同。如何做呢?需要我们把36个顶点再拷贝几份吗?不需要这样做,我们需要做的是在渲染时为每一个立方体定义一个不同的世界坐标,在渲染生成旋转矩阵时随机一个角度值即可。

世界坐标的定义

定义10个不同的世界坐标

glm::vec3 cubePositions[] = {
      glm::vec3( 0.0f,  0.0f,  0.0f),
      glm::vec3( 2.0f,  5.0f, -15.0f),
      glm::vec3(-1.5f, -2.2f, -2.5f),
      glm::vec3(-3.8f, -2.0f, -12.3f),
      glm::vec3( 2.4f, -0.4f, -3.5f),
      glm::vec3(-1.7f,  3.0f, -7.5f),
      glm::vec3( 1.3f, -2.0f, -2.5f),
      glm::vec3( 1.5f,  2.0f, -2.5f),
      glm::vec3( 1.5f,  0.2f, -1.5f),
      glm::vec3(-1.3f,  1.0f, -1.5f)
    };

渲染类的实现

在上一节渲染类draw3D_cube的基础上进行修改开发draw3D_moreCube渲染类:

  1. 将视图矩阵、投影矩阵的设定移动到init函数里;
  2. 将上述的位置定义加入到draw函数中;
  3. 修改渲染方法为一个循环,在每一次循环中进行模型矩阵的计算设定,然后绘制:
    // 模型矩阵
    for(int i=0; i<10; i++) {
        glm::mat4 model(1.0);
        model = glm::translate(model, cubePositions[i]);
        model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(1.0f, 0.3f, 0.5f));
        GLuint locModel = glGetUniformLocation(m_pShader->ID, "model");
        glUniformMatrix4fv(locModel, 1, GL_FALSE, glm::value_ptr(model));
        glDrawArrays(GL_TRIANGLES, 0, 36);
    }

运行起来,我们将看到一组旋转的立方体:


很多个立方体

总结

在坐标系统中学习了:
五种空间:

  1. 局部空间;
  2. 世界空间;
  3. 视图空间;
  4. 裁剪空间;
  5. 屏幕空间;

三个矩阵:

  1. 模型矩阵
  2. 视图矩阵;
  3. 投影矩阵;

顶点转换到裁剪空间的计算
vP = Pm * Vm * Mm * locVertex;
需要从右向左读:顶点坐标经过和模型矩阵、视图矩阵和投影矩阵进行乘法运算后得到裁剪空间的坐标。

Z缓冲
Z-buffer是由GLFW自动生成,存储所有的深度信息到Z-buffe中,每个片段有一个深度值(做为它的z值),一个片段在输出颜色前会和Z缓冲进行比较,若当前片段处于后方则丢弃。


代码-渲染很多个立方体

你可能感兴趣的:(【三十,坐标系统-05更多的立方体】)