仅缩放场景中的一个对象-OpenGL 3.0

时间:2016-05-18 04:47:36

标签: c++ opengl opengl-3

我有一个有两个立方体的场景,我希望能够只缩放一个立方体。基本上,我想要做的是当我按下S大写键时,立方体将继续变大,只要我继续按下大写字母S,当我按下小写字母s时,我希望能够使立方体变小只要小写s被按下。

我遇到了两个问题:

  1. 我不知道如何检测按下的按键是小写还是大写。
  2. 当我按下按键时,我的整个场景(就像在两个立方体中一样)放大并缩小。
  3. 以下是我的密钥代码:

    void keyPressed(GLFWwindow *_window, int key, int scancode, int action, int mods) {
    
    // Control the state of keys pressed
    if (action == GLFW_PRESS)
        keys[key] = true;
    else if (action == GLFW_RELEASE)
        keys[key] = false;
    
    switch (key) {
        case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(_window, GL_TRUE); break;
    
        // Change between points, lines and fill
        case GLFW_KEY_P: glPolygonMode(GL_FRONT_AND_BACK, getMode('P')); break; 
        case GLFW_KEY_W: glPolygonMode(GL_FRONT_AND_BACK, getMode('W')); break; 
        case GLFW_KEY_T: glPolygonMode(GL_FRONT_AND_BACK, getMode('T')); break;
    
        case GLFW_KEY_S: scale_matrix = scale(scale_matrix, vec3(2.0f, 2.0f, 2.0f));
    
                         //model_matrix = scale(model_matrix, vec3(2.0f, 2.0f, 2.0f));
                         break;
    
        case GLFW_KEY_R: scale_matrix = scale(scale_matrix, vec3(0.5f, 0.5f, 0.5f));
                         //model_matrix = scale(model_matrix, vec3(0.0f, 0.0f, -1.0f));
                         break; 
    
    
        //Reset camera
        case GLFW_KEY_D: cameraPosition = vec3(0.0, 0.0, 1.0);
                         view_matrix = lookAt(
                            cameraPosition,
                            vec3(0.0f, 0.0f, -100.0f),
                            vec3(0.0, 1.0, 0.0)); 
                         break;
        default: break;
    }
    return;}
    

    由于我不确定如何检测大写和小写,我将R指定为缩小场景的关键。这是我的立方体位置的代码:

    glm::vec3 cubePositions[] = {
    glm::vec3(0.0f,  0.0f,  -1.0f), 
    glm::vec3(2.0f, 10.0f, -10.0f), 
    };
    

    我到目前为止所尝试的是对case使用if语句:GLFW_KEY_S来检查多维数据集的位置,但这不起作用。

2 个答案:

答案 0 :(得分:0)

大多数库不识别大写和小写键。您应该通过检测同时按下Shift键来自行完成...

用于缩放。只需在渲染一个立方体之前将矩阵乘以比例矩阵,然后返回到先前的状态。如果你使用OGL矩阵系统,你应该像这样做。

如果使用固定功能管道:

glLoadIdentity();
glMultMatrix( view_matrix );
// 1st cube
glPushMatrix();
glMultMatrix(scale_matrix);
drawCube();
glPopMatrix;

// 2nd cube
glPushMatrix();
drawCube();
glPopMatrix;

如果使用着色器:

mat4 modelview;

modelview = view_matrix;
glUniformMatrix4fv(location_modelview,  1, GL_FLASE, modelview);
drawCube();

modelview = view_matrix * scale_matrix
glUniformMatrix4fv(location_modelview, 1, GL_FLASE, modelview);
drawCube();

如果要将矩阵乘以yourslef,则应分别为场景中的每个对象保留不同的object-gt; world矩阵。

我现在不打扰已弃用的功能。只需先得到你想要的东西,然后试着找出如何做得更好。

答案 1 :(得分:0)

  

一个是我不知道如何检测按下的按键是小写还是大写

为此您测试是否按下修饰键,在您的情况下," shift"修饰键。

  

第二个是我的整个场景(就像在两个立方体中一样)

OpenGL是一个绘图API,而不是场景图。因此,诀窍是仅在绘制应缩放的模型时应用该缩放矩阵,并在其余部分省略它。