我有一个有两个立方体的场景,我希望能够只缩放一个立方体。基本上,我想要做的是当我按下S大写键时,立方体将继续变大,只要我继续按下大写字母S,当我按下小写字母s时,我希望能够使立方体变小只要小写s被按下。
我遇到了两个问题:
以下是我的密钥代码:
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来检查多维数据集的位置,但这不起作用。
答案 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,而不是场景图。因此,诀窍是仅在绘制应缩放的模型时应用该缩放矩阵,并在其余部分省略它。