【问题标题】:OpenGL glTranslatef/glRotatef not working as I expectOpenGL glTranslatef/glRotatef 没有按我的预期工作
【发布时间】:2012-10-03 00:06:57
【问题描述】:

我正在尝试创建一个多边形并在释放鼠标按钮时平移/旋转它。 如果我再次使用glBeginglEnd 重新绘制整个多边形,我可以做到这一点,但我不确定我是否真的需要这个,因为我已经在屏幕上绘制了一次多边形并且只想使用相同的对象并对其应用旋转/平移。

我在下面放了一个sn-p。

if(state == GLUT_UP){

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glRotatef(90,0,0,1);
    //  glTranslatef(50,-50,0);
    /*
    glBegin(GL_POLYGON);
    glVertex2i (-40,40) ; //Specify li ne - se gme nt ge ometry .
    glVertex2i (-30 , -40) ;
    glVertex2i (0 , 20) ;
    glVertex2i (40 , 35) ;
    glEnd() ;
    */
    glClear(GL_COLOR_BUFFER_BIT);
    glPopMatrix();
    glutSwapBuffers();
    //  glutPostRedisplay();
}

【问题讨论】:

  • 您确实需要再次绘制它,除非您只想旋转最后创建的图像,但是您需要在四边形上绘制该图像并旋转它。我认为你应该阅读更多关于 GL 的基础知识,因为你似乎在那里有误解。
  • 谢谢。实际上我想使用上次创建的同一张图片。请您解释一下“在四边形上绘制该图片”是什么意思

标签: opengl


【解决方案1】:

请与我交谈:“我再也不会将 OpenGL 绘图调用放入事件处理程序!”

在事件处理程序中,您根据事件设置一些变量,然后发出重绘调用,并在渲染函数中根据变量的内容进行绘制。

更新:

OpenGL 也不会“记住”你绘制的内容。您发送绘图命令,OpenGL 执行它的操作,然后忘记它。剩下的唯一痕迹是在帧缓冲区上变成像素的片段。但帧缓冲区内容不受转换或任何 OpenGL 状态更改的影响。只有绘图会影响帧缓冲区。

【讨论】:

  • thanks.So 如果我想从先前旋转的状态旋转图像,我该如何使用 OpenGL 来做到这一点。
  • @code4fun:你重绘了整个东西,但应用了更改。这就是应该使用 OpenGL 的方式。现代 GPU 每秒可以处理数百万个三角形。对于现代 GPU 来说,为多边形重绘少量三角形并不费力。您必须了解的是,OpenGL 没有“对象”的概念。它所看到的只是绘制单个点、线或三角形的调用。它画了一个点、一条线或一个三角形,然后就忘记了。
【解决方案2】:

您不需要重新编写整个代码:

在您的显示函数中(您用作参数将回调注册到 glut 窗口的相同 void 函数为 glutDisplayFunc(display) )将您的代码 sn-p 放在上面。

在您的glPushMatrix()..glPopMatrix() 序列中,将一个变量(最好是GLfloat 类型)角度与您的旋转轴一起放入glRotatef() 调用中。您可以对 glRotatef() 参数执行相同的操作。

如果您想使用鼠标或键盘进行旋转或平移,请使用 glutMouseFunc()glutKeyboardFunc() 向 GLUT 注册回调。如果你想要一个动画,那么你可以用glutIdleFunc()注册一个函数。

代码 sn-p 将是:

void handler(...){
angle+=some_value;

//angle reset not so necessary but good,
 if you somehow are using that angle value somewhere else
  if(angle>360)
  angle=0;

glutPostRediplay();
}

键盘:

handler(unsigned char key, int x, int y);

鼠标:

handler(int button, int state, int x, int y);

空闲函数(用于连续动画)

handler(void);

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2015-11-17
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多