以不同方式旋转立方体
rotating cubes differently
我有 25 个立方体,我想以不同的方式旋转每个立方体这是我在 x 轴和 y 轴上的代码
我试过使用 rand() 但它一直奇怪地旋转它们,而且所有的旋转方向都相同
这是在游戏循环中
for (unsigned int i = 0; i < 25; i++)
{
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, cubePositions[i]);
view = glm::translate(model, glm::vec3(0.0f, 0.0f, -10.0f));
float angle = 20.0f * i;
angle = glfwGetTime() * 20.0f;
model = glm::rotate(model, glm::radians(angle), 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, "view");
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");
glUniformMatrix4fv(projLoc, 1, GL_FALSE,
glm::value_ptr(projection));
glDrawArrays(GL_TRIANGLES, 0, 36);
}
由于没有实际问题,我尝试对发布的代码进行一些评论
这可以解释生成程序的意外行为。
angle
变量被初始化,然后立即分配一个新的
价值 ;只有这个新值是相关的,那么立方体应该全部旋转
以每秒 20 度的速度。 (这不是问题)
view
矩阵被重新分配 每个 对象的新值!这是
这不太可能是你想要的。
就像在绘制单帧时,将相机移动到
正在绘制的每个对象;如果你以同样的方式移动相机和物体,
然后所有内容都显示在渲染帧中的同一位置。
(我认为这是主要问题)
您应该为所有 view
矩阵(以及 projection
整个帧的矩阵)。
其他一些评论,没有直接关系:
- 您应该在循环之前一次性检索统一位置
(甚至在程序开始时)因为它们不会改变多久
因为你使用相同的着色器程序。
-
glUniformMatrix4fv()
要求 projection
和 view
应该
在循环之前永远发生一次;只有 model
矩阵从
一个对象到另一个对象。
可能看起来像这样
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);
}
我有 25 个立方体,我想以不同的方式旋转每个立方体这是我在 x 轴和 y 轴上的代码
我试过使用 rand() 但它一直奇怪地旋转它们,而且所有的旋转方向都相同
这是在游戏循环中
for (unsigned int i = 0; i < 25; i++)
{
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, cubePositions[i]);
view = glm::translate(model, glm::vec3(0.0f, 0.0f, -10.0f));
float angle = 20.0f * i;
angle = glfwGetTime() * 20.0f;
model = glm::rotate(model, glm::radians(angle), 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, "view");
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");
glUniformMatrix4fv(projLoc, 1, GL_FALSE,
glm::value_ptr(projection));
glDrawArrays(GL_TRIANGLES, 0, 36);
}
由于没有实际问题,我尝试对发布的代码进行一些评论 这可以解释生成程序的意外行为。
angle
变量被初始化,然后立即分配一个新的 价值 ;只有这个新值是相关的,那么立方体应该全部旋转 以每秒 20 度的速度。 (这不是问题)view
矩阵被重新分配 每个 对象的新值!这是 这不太可能是你想要的。
就像在绘制单帧时,将相机移动到 正在绘制的每个对象;如果你以同样的方式移动相机和物体, 然后所有内容都显示在渲染帧中的同一位置。 (我认为这是主要问题)
您应该为所有view
矩阵(以及projection
整个帧的矩阵)。
其他一些评论,没有直接关系:
- 您应该在循环之前一次性检索统一位置 (甚至在程序开始时)因为它们不会改变多久 因为你使用相同的着色器程序。
-
glUniformMatrix4fv()
要求projection
和view
应该 在循环之前永远发生一次;只有model
矩阵从 一个对象到另一个对象。
可能看起来像这样
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);
}