opengl - 如何持续更新 glut 窗口?

标签 opengl loops c++-cli glut

我有一个真正的机器人,它在 open gl 中订购我的虚拟机器人。我想在线显示我的主机器人(真实机器人)在从属机器人(open gl 中的虚拟机器人)中的每一个 Action ,所以我需要不断更新我的 glut 窗口,实际上只要真实机器人也移动我的虚拟机器人,所有这些运动应该是在线的。

我总是使用 get data 函数从 master 获取数据,但我不知道应该如何更新窗口。

这是我的代码:

******************************************** /

  void OnIdle(void){  
    initSocket();

  printf("\n  Defining Step Time Parameters and Initial Conditions for solving Dynamic equations\n");

  xi=0;
  xf=0.1;
  printf("\n    end value x         : %f ",xf); 
  i=0;  yi[i]=0; 
  i++;yi[i]=-1.570796;
  i++;yi[i]=-1.570796;
  i++;yi[i]=0;
  i++;yi[i]=0;
  i++;yi[i]=0;
  ndata=2; fi=1;

  double counter=0.1;

  Eqdifp(v1,v2,v3,v4,v5,v6,xi,xf,yi,ndata,p,fi);


  for(int i=0;i<50;i++)
    //while(1)
  {

      getData();

      printf("\n");
      for(int i=0;i<6; i++)
      {

          printf("%d = %.3f\n", i,drecvbuf[i]);
      }
      printf("\n");

   yi[0]=v1[ndata];
   yi[1]=v2[ndata];
   yi[2]=v3[ndata];
   yi[3]=v4[ndata];
   yi[4]=v5[ndata];
   yi[5]=v6[ndata];
    printf("my nadata %f\n",v1[ndata]);
    counter=counter+0.1;

    Eqdifp(v1,v2,v3,v4,v5,v6,xi,xf,yi,ndata,p,fi);
    glutPostRedisplay();
 }
  }
/////////////////////////////////////////////////////
  int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(900,500);
    int u=glutCreateWindow("3DOF robot");
    myinit();
    createMenu();
    glutIdleFunc (OnIdle);
    glutDisplayFunc(Display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(KeyDown);

    glutMainLoop(); 

    System::Timers::Timer^ aTimer = gcnew System::Timers::Timer( 100 );

      // Hook up the Elapsed event for the timer.
    aTimer->Elapsed += gcnew System::Timers::ElapsedEventHandler( OnTimedEvent );

      // Set the Interval to 2 seconds (2000 milliseconds).
    aTimer->Enabled = true;
    return 0;

  }

最佳答案

我认为,您可以在更新后调用 glutPostRedisplay,它会在窗口返回消息队列后立即重新绘制窗口(当然,使用 GLUT 的显示函数)。

但是,如果您在无限循环中不断轮询机器人数据,这将不起作用,因为这会不断阻塞程序。您应该做的是使用计时器在短时间内安排机器人更新,以便在这些更新之间程序可以返回主事件循环并重新绘制窗口。或者你可以调用一些函数,它告诉框架访问事件循环。您的代码示例并没有真正解释您目前的操作方式(或者我只是不熟悉您调用的函数)。

关于opengl - 如何持续更新 glut 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800512/

相关文章:

bash 根据真实文件创建虚拟文件和文件夹

msbuild - 如何在 C++/CLI 项目中使用代码契约?

在不同命名空间中具有相同名称的 C++ 友元类

java - 如何将 3D 树叶的颜色与其下方的纹理融合?

c++ - 隐藏光标

c++ - SDL_SaveBMP 倒置保存图片

c++ - 无法在 openGL 和 GLUT 中为我想要的确切对象制作动画

loops - 如何在范围循环中添加到 map 中

android - 在特定时间循环播放声音

header - c++/cli接口(interface)头文件