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

Scaling only one object in a scene-OpenGL 3.0

本文关键字:一个对象 OpenGL 缩放      更新时间:2023-10-16

我有一个有两个立方体的场景,我希望只能缩放一个立方体。基本上,我想做的是,当我按下S大写键时,随着我继续按下大写S,多维数据集将继续变大。当我按下小写S时,只要按下小写S,我希望能够使多维数据集变小。

我遇到了两个问题:

  1. 我不知道如何检测按下的键是小写还是大写
  2. 当我按键时,我的整个场景(如两个立方体)都会放大和缩小

这是我的钥匙代码:

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来检查多维数据集的位置,但没有成功。

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

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

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

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

大多数库不识别大小写键。您应该通过检测同时按下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();

若你们自己乘矩阵,你们应该分别为场景中的每个对象保留不同的对象->世界矩阵。

我现在不会再为不推荐使用的函数而烦恼了。只要先得到你想要的,然后试着找出如何做得更好。