OpenGL在2个键上旋转相机

Posted

技术标签:

【中文标题】OpenGL在2个键上旋转相机【英文标题】:OpenGL rotate camera on 2 keys 【发布时间】:2016-03-28 02:11:26 【问题描述】:

基本上,当我按住“c”并使用箭头键时,我要做的是围绕中心对象旋转相机。

我的第一个问题与相机没有太大关系,但与键回调同时识别 2 个键有关。

如果我对 L/R 键有单独的 if 语句并且没有“c”,我的函数就可以工作,但是当我只希望在按住“c”时相机旋转时,我无法让它工作.我尝试在 if 语句中使用 switch(key) 和 if 语句。我尝试过的两种实现都在下面的代码中:

float R = 0.0;
float U = 0.0;

static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)

    if(key == GLFW_KEY_C && action == GLFW_PRESS) 

        switch(key) 
            case GLFW_KEY_RIGHT:
                R+=0.05;
                camera(R, U);
                break;
            case GLFW_KEY_LEFT:
                R-=0.05;
                camera(R, U);
                break;
            case GLFW_KEY_UP:
                break;
            case GLFW_KEY_DOWN:
                break;
            default:
                break;
        
    
    //OR --
    if(key == GLFW_KEY_C && action == GLFW_PRESS) 
        if(key == GLFW_KEY_RIGHT && action == GLFW_PRESS) 
            R+=0.05;
            camera(R, U);
           
    


我做错了什么?还有什么我可以尝试的吗?

我的第二个问题与相机有关。它使用我当前的代码围绕对象旋转半圈,但是一旦到达某个点,相机就会越来越远离对象,而不是旋转。 这是我的相机功能的代码:

GLfloat ox = 10.0;
GLfloat oy = 10.0;    
static void camera(float RL, float UD) 
        ox+=cos(glm::radians(RL));
        oy+=sin(glm::radians(RL));


        gViewMatrix = glm::lookAt(glm::vec3(ox, oy, 10.0f), // eye
            glm::vec3(0.0, 0.0, 0.0),   // center
            glm::vec3(0.0, 1.0, 0.0));

    

【问题讨论】:

【参考方案1】:

您的“C”检测代码将不起作用,因为您仅在键等于 C 和箭头时才匹配。不可能两者兼而有之。您必须保留另一个全局变量 isCPressed。按下 C 时将其设置为 true,释放 C 时将其设置为 false,然后当按下箭头时检查 if(isCPressed)。

至于相机代码,您的算法在查看 0,0,0 时绕点 0,0,10 运行。这似乎不是你想要的,你应该有类似 oxdist, oydist, 0 的眼睛位置在距离 'dist' 处绕 0,0,0 轨道运行 p>

【讨论】:

以上是关于OpenGL在2个键上旋转相机的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL相机的相对旋转

OpenGL相机旋转怪异

在OpenGL中沿对象后面的方向旋转相机

Java OpenGL - 如何使对象随相机旋转?

从相机旋转中隔离“指南针”openGL

在opengl中翻译相机有问题