C# 使用OpenTK在glControl1_Paint外部平移和旋转图像?

C# 使用OpenTK在glControl1_Paint外部平移和旋转图像?,c#,forms,opentk,C#,Forms,Opentk,我正在使用C Windows窗体应用程序和OpenTK在VS2010 Pro中制作CAD类型的软件。不花哨;我只是想能够阅读一些基本的形状并画出来。我不确定这是否会对答案产生影响,但我使用GL.Ortho在2D空间中绘制 为了熟悉图形,我直接从OpenTK文档中编写了几个OpenTK示例,并对其有了基本的了解。根据我目前所了解的情况,我无法移动/旋转基本体,除非它们是在此事件中创建的: private void glControl1_Paint(object sender, PaintE

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

为了熟悉图形,我直接从OpenTK文档中编写了几个OpenTK示例,并对其有了基本的了解。根据我目前所了解的情况,我无法移动/旋转基本体,除非它们是在此事件中创建的:

    private void glControl1_Paint(object sender, PaintEventArgs e)
    {
    }
我的程序启动并等待用户选择要读取的CAD文件。在我读取文件并将其分解为原语后,我将其绘制到glControl1表单。到目前为止,它的工作如预期。但是,我没有在glControl1_绘制事件中绘制它。因此,我无法通过键盘/鼠标输入来控制平移/旋转它

我已经阅读了提问者在glControl1_绘画活动中被指示绘画的其他问题的答案。我很想这样做,因为这会解决我的问题,但我不确定如何做到这一点,因为在启动应用程序时我没有原语,我等待用户提供数据

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

1 glControl1_绘制事件何时在程序中发生?我认为这是初始化glControl1窗口的一部分,并在启动时启动。我可以控制何时发生,以便在这里绘制基本体吗?如果是这样,我如何控制何时发生这种情况,以及如何将我的几何体传递到这个过程中


2是否有办法在glControl1_绘制事件之外平移/旋转我的基本体?

否您无法知道绘制事件何时触发。但您可以通过Invalidate函数手动触发它

流程应该是这样的

您应该在绘制事件中绘制所有图形。 如果发生影响图形的事件,应调用Invalidate 移动对象的键盘事件或旋转相机的鼠标事件等。所有这些事件都应调用Invalidate 如果你喜欢最大帧速率。如果没有其他windows消息要处理,则应重写应用程序主循环并使其调用无效。 这是我的编程循环

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);

...

我不认为帧率是个问题,因为我的图像是静态的。为了提高效率,我只想在缓冲区中绘制一次基本体,因为它们不会改变。唯一的变化将是相机。在我的示例中,我使用Invalidate处理摄影机更改,但我不知道它触发了绘制事件。谢谢你的解释。