首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时旋转多个立方体的问题

同时旋转多个立方体的问题
EN

Stack Overflow用户
提问于 2019-11-13 15:58:57
回答 1查看 120关注 0票数 0

我正在画一个由三个立方体组成的金字塔(两面对侧,另一边在顶部),然后我试着在X,Y或Z轴上旋转这个金字塔,并把它上下缩放。

问题是这三个立方体没有正确地缩放(不同的尺寸),同时旋转也会产生非常奇怪的结果。

我使用glm vec3数组为我的立方体定义了一个数组:

代码语言:javascript
复制
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)
};

我生成并链接缓冲区和必要的东西,使OpenGL工作,然后我画金字塔,这是由三个立方体。我几乎可以肯定,这是代码中所有错误的部分:

代码语言:javascript
复制
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则是缩放变量和旋转变量。所有变量都是浮动类型,我在UI应用程序中使用按钮进行更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-13 19:27:50

尝试翻转您的转换顺序。代替平移,旋转,缩放,缩放,旋转,平移。

顺便提一下,使用glm::lookAt计算V矩阵通常更容易,然后使用多个步骤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58840956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档