C++ 以不同的方式旋转立方体

C++ 以不同的方式旋转立方体,c++,opengl,glm-math,C++,Opengl,Glm Math,我有25个立方体,我想以不同的方式旋转每个立方体。这是我在x轴和y轴上的代码 我尝试使用rand(),但它一直在奇怪地旋转它们,而且它们都朝着相同的方向旋转 这是在游戏循环中 for(无符号整数i=0;i

我有25个立方体,我想以不同的方式旋转每个立方体。这是我在x轴和y轴上的代码

我尝试使用rand(),但它一直在奇怪地旋转它们,而且它们都朝着相同的方向旋转

这是在游戏循环中

for(无符号整数i=0;i<25;i++)
{
glm::mat4模型=glm::mat4(1.0f);
model=glm::translate(model,cubePositions[i]);
view=glm::translate(模型,glm::vec3(0.0f,0.0f,-10.0f));
浮动角度=20.0f*i;
角度=glfwGetTime()*20.0f;
模型=glm::旋转(模型,glm::弧度(角度),glm::vec3(1.0f,0.0f,0.5f));
GLint modelLoc=glGetUniformLocation(ourShader.Program,“model”);
glUniformMatrix4fv(modelLoc,1,GL_FALSE,glm::value_ptr(model));
GLint viewLoc=glGetUniformLocation(ourShader.Program,“视图”);
glUniformMatrix4fv(视图位置,1,GL_假,glm::value_ptr(视图));
GLint projLoc=glGetUniformLocation(ourShader.Program,“投影”);
glUniformMatrix4fv(项目1,GL_假,
glm::值_ptr(投影));
gldrawArray(GL_三角形,0,36);
}

由于没有实际问题,我尝试对发布的代码发表一些评论 这可以解释结果程序的意外行为

  • 角度
    变量被初始化,然后立即分配一个新的 价值只有这个新值是相关的,那么立方体应该全部旋转 以每秒20度的速度。(这不是问题)
  • 视图
    矩阵将为每个对象重新分配一个新值!它是 这不太可能是您想要的。
    这就像在绘制单个帧时,将相机移动到屏幕前面一样 正在绘制的每个对象;如果以相同的方式移动摄影机和对象, 然后,所有内容都显示在渲染帧中的同一位置。 (我认为这是主要问题)
    您应该为所有
    视图
    矩阵(以及
    投影
    矩阵)用于整个框架
  • 其他一些不直接相关的评论:

    • 在循环之前,应该一次性检索统一位置 (甚至在课程开始时)因为他们不会改变多久 当您使用相同的着色器程序时
    • glUniformMatrix4fv()
      调用
      投影
      视图
      应该 在循环之前发生一次;只有
      模型
      矩阵从 一个物体对另一个物体
    可能是这样的

      GLint modelLoc = glGetUniformLocation(ourShader.Program, "model");
      GLint viewLoc = glGetUniformLocation(ourShader.Program, "view");
      GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");
    
      glm::mat4 projection = ... already known ...
      glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
    
      glm::mat4 view = glm::mat4(1.0f);
      // adjust to the layout of your scene
      view = glm::translate(view, glm::vec3(0.0f, 0.0f, -10.0f));
      glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
    
      for(unsigned int i = 0; i < 25; i++)
      {
        glm::mat4 model = glm::mat4(1.0f);
        model = glm::translate(model, cubePositions[i]);
    
        // the same rotation rate but a different offset for each object
        float angle = 20.0f * i;
        angle += std::fmod(glfwGetTime() * 20.0f, 360.0f);
        // choose x or y rotation axis
        auto axis=(i%2) ? glm::vec3(1.0f, 0.0f, 0.0f) : glm::vec3(0.0f, 1.0f, 0.0f);
        model = glm::rotate(model, glm::radians(angle), axis);
    
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
    
        glDrawArrays(GL_TRIANGLES, 0, 36);
      }
    
    GLint modelLoc=glGetUniformLocation(ourShader.Program,“model”); GLint viewLoc=glGetUniformLocation(ourShader.Program,“视图”); GLint projLoc=glGetUniformLocation(ourShader.Program,“投影”); glm::mat4投影=。。。已经知道。。。 glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(投影)); glm::mat4视图=glm::mat4(1.0f); //调整到场景的布局 view=glm::translate(视图,glm::vec3(0.0f,0.0f,-10.0f)); glUniformMatrix4fv(视图位置,1,GL_假,glm::value_ptr(视图)); for(无符号整数i=0;i<25;i++) { glm::mat4模型=glm::mat4(1.0f); model=glm::translate(model,cubePositions[i]); //每个对象的旋转速率相同,但偏移不同 浮动角度=20.0f*i; 角度+=std::fmod(glfwGetTime()*20.0f,360.0f); //选择x或y旋转轴 自动轴=(i%2)?glm::vec3(1.0f,0.0f,0.0f):glm::vec3(0.0f,1.0f,0.0f); 模型=glm::旋转(模型,glm::弧度(角度),轴); glUniformMatrix4fv(modelLoc,1,GL_FALSE,glm::value_ptr(model)); gldrawArray(GL_三角形,0,36); }
    “我想以不同的方式旋转每个立方体”-因此需要每个立方体的旋转轴和角度。我建议使用25个轴和角度的阵列。欢迎使用StackOverflow。为了帮助你,我们需要一个明确的问题。因此,请澄清并准确说明你想要什么,你已经尝试过了(以及失败的地方).你能详细解释一下吗?视图矩阵应该在原点,并显示所有立方体旋转,但我想解决的问题是,我希望每个立方体在x轴和y轴上的旋转方式不同,但我不确定如何进行旋转我认为这与旋转角度有关,但我不知道如何为每个立方体进行更改cube@l-我刚刚添加了根据对象索引选择旋转轴。