2

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

我在下面放了一个片段。

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();
}
4

2 回答 2

12

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

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

更新:

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

于 2012-10-03T09:37:27.240 回答
0

您不需要再次编写整个代码:

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

在您的glPushMatrix()..glPopMatrix()序列中,将一个变量(最好是GLfloat类型)角度glRotatef()与您的旋转轴一起放入 call 中。你可以对glRotatef()参数做同样的事情。

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

代码片段将是:

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);
于 2013-05-27T16:48:12.687 回答