当前位置:嗨网首页>书籍在线阅读

07-渲染一个对象的多个副本

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.6 渲染一个对象的多个副本

现在将我们学到的知识扩展到渲染多个对象。在我们解决在单个场景中渲染多种不同的模型的常见情况之前,让我们先考虑更简单的情形——同一模型多次出现。例如,假设我们希望扩展前面的示例,以便呈现“一大群”(24个)翻滚的立方体。我们可以将display()函数中构建MV矩阵并绘制立方体的代码(如下所示突出显示部分),移动到一个执行24次的循环中来完成此操作。我们利用循环变量来计算立方体的旋转和平移参数,以便每次绘制立方体时,都会构建不同的模型矩阵。(我们还将摄像机放置在正Z轴的下方,这样我们就可以看到所有的立方体。)图4.8显示了一帧由此产生的动画场景。

void display(GLFWwindow* window, double currentTime) {
   . . .
   for (i=0; i<24; i++)    { tf = currentTime + i;    // tf == "time factor(时间因子)",声明为浮点类型
     tMat = glm::translate(glm::mat4(1.0f), glm::vec3(sin(.35f*tf)*8.0f, cos(.52f*tf)*8.0f,
                                                                           sin(.70f*tf)*8.0f));
     rMat = glm::rotate(glm::mat4(1.0f), 1.75f*tf, glm::vec3(0.0f, 1.0f, 0.0f));
     rMat = glm::rotate(rMat, 1.75f*tf, glm::vec3(1.0f, 0.0f, 0.0f));
     rMat = glm::rotate(rMat, 1.75f*tf, glm::vec3(0.0f, 0.0f, 1.0f));
     mMat = tMat * rMat;
     mvMat = vMat * mMat;
     glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat));
     glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(pMat));
     glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
     glEnableVertexAttribArray(0);
     glEnable(GL_DEPTH_TEST);
     glDepthFunc(GL_LEQUAL);
     glDrawArrays(GL_TRIANGLES, 0, 36);
   } }

104.png

图4.8 多个翻滚的立方体