同时旋转多个立方体的问题
Problems rotating multiple cubes at the same time
我正在绘制一个由 3 个立方体组成的金字塔(两个立方体并排一个在顶部),然后我尝试在 X、Y 或 Z 轴上旋转这个金字塔并按比例放大和缩小。
问题是三个立方体不能正确缩放(不同大小),旋转也会产生非常奇怪的结果。
我已经使用 glm vec3 数组为我的多维数据集定义了一个数组:
const glm::vec3 cube[] = {
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3( -1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f)
};
我生成并 link 缓冲区和 OpenGL 工作所必需的东西,然后我绘制由三个立方体组成的金字塔。我几乎可以肯定这是全部出错的代码部分:
glm::mat4 P = glm::perspective(glm::radians(60.0f + zoom), float(width()) / height(), 0.01f, 1000.0f);
glm::mat4 V = glm::mat4(1);
V = glm::translate(V, glm::vec3(-3 + moveX, -1 + moveY, -6 + moveZ));
V = glm::rotate(V, glm::radians(rotateCamradX), glm::vec3(1.0, 0.0, 0.0));
V = glm::rotate(V, glm::radians(rotateCamradY), glm::vec3(0.0, 1.0, 0.0));
V = glm::rotate(V, glm::radians(rotateCamradZ), glm::vec3(0.0, 0.0, 1.0));
glm::mat4 M = glm::mat4(1);
M = glm::translate(M, glm::vec3(-1, 0, 0));
M = glm::rotate(M, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M = glm::rotate(M, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M = glm::rotate(M, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M = glm::scale(M, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 M1 = glm::mat4(1);
M1 = glm::translate(M, glm::vec3(2, 0, 0));
M1 = glm::rotate(M1, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M1 = glm::rotate(M1, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M1 = glm::rotate(M1, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M1 = glm::scale(M1, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 M2 = glm::mat4(1);
M2 = glm::translate(M, glm::vec3(1, 2, 0));
M2 = glm::rotate(M2, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M2 = glm::rotate(M2, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M2 = glm::rotate(M2, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M2 = glm::scale(M2, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 PVM = P * V * M;
glm::mat4 PVM1 = P * V * M1;
glm::mat4 PVM2 = P * V * M2;
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM));
gl->glUniform3f(id_shader_program_Color_uniform, 0.3f ,0.1f, 0.2f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM1));
gl->glUniform3f(id_shader_program_Color_uniform, 0.8f ,0.2f, 0.7f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM2));
gl->glUniform3f(id_shader_program_Color_uniform, 0.1f ,0.2f, 0.1f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
V矩阵中的变量用于相机移动,有效,然后在M中,M1和M2是缩放变量和旋转变量。所有变量都是 float 类型,我使用 UI 应用程序中的按钮进行更改。
尝试翻转转换的顺序。而不是 [平移、旋转、缩放] 做 [缩放、旋转、平移]。
附带说明一下,使用 glm::lookAt
计算 V 矩阵通常比使用多个步骤更容易。
我正在绘制一个由 3 个立方体组成的金字塔(两个立方体并排一个在顶部),然后我尝试在 X、Y 或 Z 轴上旋转这个金字塔并按比例放大和缩小。
问题是三个立方体不能正确缩放(不同大小),旋转也会产生非常奇怪的结果。
我已经使用 glm vec3 数组为我的多维数据集定义了一个数组:
const glm::vec3 cube[] = {
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3( -1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f,-1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(1.0f,-1.0f,-1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f,-1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f, 1.0f, 1.0f),
glm::vec3(-1.0f, 1.0f, 1.0f),
glm::vec3(1.0f,-1.0f, 1.0f)
};
我生成并 link 缓冲区和 OpenGL 工作所必需的东西,然后我绘制由三个立方体组成的金字塔。我几乎可以肯定这是全部出错的代码部分:
glm::mat4 P = glm::perspective(glm::radians(60.0f + zoom), float(width()) / height(), 0.01f, 1000.0f);
glm::mat4 V = glm::mat4(1);
V = glm::translate(V, glm::vec3(-3 + moveX, -1 + moveY, -6 + moveZ));
V = glm::rotate(V, glm::radians(rotateCamradX), glm::vec3(1.0, 0.0, 0.0));
V = glm::rotate(V, glm::radians(rotateCamradY), glm::vec3(0.0, 1.0, 0.0));
V = glm::rotate(V, glm::radians(rotateCamradZ), glm::vec3(0.0, 0.0, 1.0));
glm::mat4 M = glm::mat4(1);
M = glm::translate(M, glm::vec3(-1, 0, 0));
M = glm::rotate(M, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M = glm::rotate(M, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M = glm::rotate(M, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M = glm::scale(M, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 M1 = glm::mat4(1);
M1 = glm::translate(M, glm::vec3(2, 0, 0));
M1 = glm::rotate(M1, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M1 = glm::rotate(M1, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M1 = glm::rotate(M1, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M1 = glm::scale(M1, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 M2 = glm::mat4(1);
M2 = glm::translate(M, glm::vec3(1, 2, 0));
M2 = glm::rotate(M2, glm::radians(rotateradX), glm::vec3(1.0, 0.0, 0.0));
M2 = glm::rotate(M2, glm::radians(rotateradY), glm::vec3(0.0, 1.0, 0.0));
M2 = glm::rotate(M2, glm::radians(rotateradZ), glm::vec3(0.0, 0.0, 1.0));
M2 = glm::scale(M2, glm::vec3(scaleVar, scaleVar, scaleVar));
glm::mat4 PVM = P * V * M;
glm::mat4 PVM1 = P * V * M1;
glm::mat4 PVM2 = P * V * M2;
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM));
gl->glUniform3f(id_shader_program_Color_uniform, 0.3f ,0.1f, 0.2f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM1));
gl->glUniform3f(id_shader_program_Color_uniform, 0.8f ,0.2f, 0.7f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
gl->glUniformMatrix4fv(id_shader_program_PVM_uniform, 1, GL_FALSE, glm::value_ptr(PVM2));
gl->glUniform3f(id_shader_program_Color_uniform, 0.1f ,0.2f, 0.1f);
gl->glDrawArrays(GL_TRIANGLES, 0, 3*12);
V矩阵中的变量用于相机移动,有效,然后在M中,M1和M2是缩放变量和旋转变量。所有变量都是 float 类型,我使用 UI 应用程序中的按钮进行更改。
尝试翻转转换的顺序。而不是 [平移、旋转、缩放] 做 [缩放、旋转、平移]。
附带说明一下,使用 glm::lookAt
计算 V 矩阵通常比使用多个步骤更容易。