glm 旋转不根据模型的新方向

Posted

技术标签:

【中文标题】glm 旋转不根据模型的新方向【英文标题】:glm rotation does not according to model's new orientation 【发布时间】:2017-09-17 19:58:56 【问题描述】:

我想实现相机围绕一个对象旋转,但是当我在不同方向旋转相机然后应用更多旋转时,模型相对于它的初始方向而不是新方向旋转我不知道我是否遗漏了什么与否,我该如何解决这个问题?

我的 MVP 初始化

ubo.model = attr.transformation[0];
ubo.view = glm::lookAt(glm::vec3(0.0f, 10.0f, 20.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
ubo.proj = glm::perspective(glm::radians(50.0f), extend.width / (float)extend.height, 0.1f, 100.0f);
ubo.proj[1][1] *= -1;

我的更新代码

while (accumulatedTime >= timeFPS)
                   
    SDL_PollEvent(&event);

    if (event.type == SDL_QUIT)
    
        exit = true;
    
    if (event.type == SDL_MOUSEMOTION && leftMouseButtonPressed == false)
    
        prev.x = event.button.x;
        prev.y = event.button.y;
    
    if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT)
    
        leftMouseButtonPressed = true;
    
    if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_LEFT)
    
        leftMouseButtonPressed = false;         
    
    if (event.type == SDL_MOUSEMOTION && leftMouseButtonPressed == true)
    

        New.x = event.button.x;
        New.y = event.button.y;

        delta = New - prev;

        if(delta.x != 0)
            ubo.view = glm::rotate(ubo.view, timeDelta * delta.x/20, glm::vec3(0.0f, 1.0f, 0.0f));
        if (delta.y != 0)
            ubo.view = glm::rotate(ubo.view, timeDelta * delta.y/20, glm::vec3(1.0f, 0.0f, 0.0f));

        prev = New;

    

    accumulatedTime -= timeFPS;
    v.updateUniformBuffer(ubo);


v.drawFrame();


我的顶点缓冲区

#version 450
#extension GL_ARB_separate_shader_objects : enable

  ....

void main()

    gl_Position = ubo.proj * ubo.view * ubo.model * vec4 (inPosition, 1.0);
    fragTexCoord = inTexCoord;
    Normal = ubo.proj * ubo.view * ubo.model * vec4 (inNormals, 1.0);

【问题讨论】:

在您的示例中,相机环顾四周,我的目标是在对象周围移动相机(就像建模程序一样)我想通过旋转对象本身来模拟相机运动来实现这一点这个目的我改变了你的矩阵方程的顺序,但它仍然围绕对象的初始方向旋转 【参考方案1】:

事实证明我遗漏了矢量旋转的一些重要部分,我的结论如下:-

    我们需要有四个向量cameraPoscameraDirectioncameraUpcameraRight(后两个向量是相对于相机方向的上和右向量) 每次旋转相机位置时,我们都需要跟踪 cameraUpcameraRight 向量(我们也需要旋转它们;这是我不见了) 根据新转换的 cameraPoscameraUpcameraRight 向量计算最终的相机方向

你可以在Here找到一个很好的教程

【讨论】:

以上是关于glm 旋转不根据模型的新方向的主要内容,如果未能解决你的问题,请参考以下文章

使用 glm 根据光标位置旋转模型视图矩阵

GLM 从 vec3 制作旋转矩阵

如何使用 GLM 在 OpenGL 中正确计算旋转

如何旋转模型以跟随路径

使用 `glm::rotate` 和四元数向上旋转 3D 方向向量

GLSL 中的正常旋转