仅缩放场景中的一个对象OpenGL 3.0
Scaling only one object in a scene-OpenGL 3.0
我有一个有两个立方体的场景,我希望只能缩放一个立方体。基本上,我想做的是,当我按下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来检查多维数据集的位置,但没有成功。
一个是我不知道如何检测按下的键是小写还是大写
为此,您测试是否按下了修改键,在您的情况下是"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();
若你们自己乘矩阵,你们应该分别为场景中的每个对象保留不同的对象->世界矩阵。
我现在不会再为不推荐使用的函数而烦恼了。只要先得到你想要的,然后试着找出如何做得更好。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 我应该如何在这个房间中创建一个新对象 - opengl
- 用OpenGL制作另一个对象
- 如何将片段着色器应用于OpenGL中的一个对象
- 仅缩放场景中的一个对象OpenGL 3.0
- 当在另一个较小的对象Opengl后面时,“大对象”将消失
- OpenGL检测单击另一个对象内部的对象
- 在 C++/OpenGL 中围绕另一个对象旋转投影一个对象
- 创建一个围绕对象 OpenGL C++旋转的相机
- 如何允许用户在opengl中缩放一个对象而不缩放另一个对象
- 如何在OpenGL中只翻译场景中的一个对象?
- 在OpenGL中定位一个对象数组