使用OpenTK翻译并旋转glControl1_Paint外的图像?

时间:2013-04-08 15:19:30

标签: c# forms opentk

我正在使用C#Windows窗体应用程序和OpenTK在VS2010 Pro中制作CAD类型的软件。没有什么花哨;我只是希望能够阅读一些基本形状并绘制它们。我不确定这是否会对答案产生影响,但我使用GL.Ortho()绘制2D空间;

为了熟悉图形,我直接从OpenTK文档中完成了一些OpenTK示例,并对它有了基本的了解。从我到目前为止学到的东西,我不能移动/旋转我的原语,除非它们是在这个事件中创建的:

    private void glControl1_Paint(object sender, PaintEventArgs e)
    {
    }

我的程序启动并等待用户选择要读入的CAD文件。在我读取文件并将其分解为基元后,我将其绘制到glControl1表单。到目前为止,它按预期工作。但是,我没有在“glControl1_Paint”事件中绘制它。因此,我无法通过键盘/鼠标输入来转换/旋转它。

我已经阅读了其他问题的答案,其中提问者被指示在“glControl1_Paint”事件中画画。我很乐意,因为它可以解决我的问题,但我不知道该怎么做,因为我在启动应用程序时没有原语,我等待用户提供数据。

我想我有几个问题想知道答案:

1)程序中何时发生“glControl1_Paint”事件?我假设它是初始化glControl1窗口并在启动时触发的一部分。我可以控制何时发生这种情况,以便我可以在这里绘制我的原语?如果是这样,我如何控制何时发生这种情况以及如何将几何图形传递给它?

2)有没有办法在“glControl1_Paint”事件之外翻译/旋转我的原语?

1 个答案:

答案 0 :(得分:0)

不,你不知道什么时候会触发绘画事件。但您可以通过Invalidate()函数手动触发它。

流程应该是这样的。

  1. 你应该在你的绘画活动中做所有的绘画。
  2. 如果发生影响绘图的事情,您应该调用Invalidate() 移动旋转相机等的对象或鼠标事件的键盘事件应该调用Invalidate()
  3. 如果您喜欢最大帧速率。如果没有其他要处理的Windows消息,你应该覆盖应用程序主循环并使其调用Invalidate()。
  4. 这是我的编程循环

    static void Main()
    {
    ...
    
    MainForm mainFrom = new MainForm();
    mainFrom.FormClosed += QuitLoop;
    mainFrom.Show();
    do
    {
         Application.DoEvents();
         mainFrom.glControl1.Invalidate(true); //actually may program is a lot more complex than this
         if (mainFrom.IsRunning)
              System.Threading.Thread.Sleep(0);
         else
              System.Threading.Thread.Sleep(1);
    } while (!mQuit);
    
    ...