【发布时间】:2021-06-03 06:14:52
【问题描述】:
我正在尝试在 cpp 中绘制一个金字塔。我已经设法实现了输入处理程序和渲染功能,但似乎我的金字塔上的任何更改都被初始状态覆盖了。 (也就是说,尽管能够接受输入并移动对象,但对象总是“跳回”到它的初始位置和角度)
我的代码是这样的:
void listenToKeyboard(GLFWwindow* w) {
if (glfwGetKey(w, GLFW_KEY_F) == GLFW_PRESS) {
glTranslatef(0.0f, 0.1f, 0.0f); // move forward
posArr1[2] -= 0.1f;
}
void drawPyramid(GLfloat p[][3]) {
glBegin(GL_TRIANGLES);
// some drawing functions like glVertex3f
...codes...
glEnd();
}
void renderPyramidWithInput(GLFWwindow* w, GLfloat p[][3]) {
glPushMatrix();
listenToKeyboard(w);
drawPyramid(p);
glPopMatrix();
}
int main() {
// some initialization
...codes...
while (!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
renderPyramidWithInput(window, p);
glfwSwapBuffers(window);
glfwPollEvents();
}
// other useful functions
...codes...
}
(我需要使用glPushMatrix和glPopMatrix来拥有多个可控对象,所以在这里)
【问题讨论】:
-
OpenGL 不是场景图,OpenGL 不知道对象,OpenGL 一次只绘制一个点、线或三角形。 glTranslate / glRotate 等(旧固定函数管道的一部分)不操作对象,它们只是改变控制屏幕上最终位置的转换矩阵。 glPushMatrix / glPopMatrix 允许构建转换层次结构。任何应该持久的东西,你都需要自己存储。固定功能管道也已过时。
-
@datenwolf 是的,我明白这一点,但问题是我对层次结构或管道等这些概念知之甚少。我试着看一些khronos的文档,比如glRotate,但是它们的描述太复杂了,而我的知识太少了。无论如何,如果我应该谷歌这个问题可以开始吗?
-
谷歌搜索“场景图”。并尝试改变你的心智模式。自己回答:只给一支铅笔和一叠纸,如果您逐帧手动绘制动画,您将如何跟踪事物。因为归根结底,这就是 OpenGL 的全部内容:用于在数字画布上绘图的非常复杂的铅笔。
-
@datenwolf 谢谢你的帮助,我会检查一下:)
标签: c++ opengl glfw opengl-compat