1

我正在制作一个小的 WinForms 应用程序,您可以在其中打开照片、平移和放大。

在弄清楚平移它的逻辑时遇到了一些麻烦。当我中间单击并拖动时,它应该平移图像,但它正在调整大小(拉伸)并移动它。

我想我可以简单地通过调整投影矩阵来进行平移glOrtho。这是代码,也许有人可以指出我正确的方向:

private void glControl1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Middle)
    {
        _mousePos = e.Location;
    }
}

private void glControl1_MouseMove(object sender, MouseEventArgs e)
{
    if(MouseButtons.HasFlag(MouseButtons.Middle))
    {
        int dx = e.X - _mousePos.X;
        int dy = e.Y - _mousePos.Y;
        _viewRect.X += dx;
        _viewRect.Y += dy;
        UpdateView();
        _mousePos = e.Location;
    }
}

void UpdateView()
{
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Ortho(_viewRect.X, _viewRect.Width, _viewRect.Height, _viewRect.Y, -1, 1);
    glControl1.Invalidate();
    this.Text = string.Format("{0},{1} {2}x{3}", _viewRect.X, _viewRect.Y, _viewRect.Width, _viewRect.Height);
}

视口最初设置为 gl 控件的完整大小:

int w = glControl1.Width;
int h = glControl1.Height;

GL.Viewport(0, 0, w, h);

图像渲染如下:

GL.Begin(BeginMode.Quads);
{
    GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
    GL.TexCoord2(0, 1); GL.Vertex2(0, _texture.Height);
    GL.TexCoord2(1, 1); GL.Vertex2(_texture.Width, _texture.Height);
    GL.TexCoord2(1, 0); GL.Vertex2(_texture.Width, 0);
}

在屏幕截图中,标题栏显示 x 和 y 坐标 -146,-140。由于我在 0,0 处绘制图像,因此我希望 gl 控件的左上角像素在图像坐标中为 146,140。显然我的概念模型是错误的。

4

1 回答 1

1

弄清楚了。glOrtho使用rightbottomwidthheight

更新了我的功能:

private void glControl1_MouseMove(object sender, MouseEventArgs e)
{
    if(MouseButtons.HasFlag(MouseButtons.Middle))
    {
        int dx = e.X - _mousePos.X;
        int dy = e.Y - _mousePos.Y;
        _viewRect.X -= dx * (_viewRect.Width / glControl1.Width);
        _viewRect.Y -= dy * (_viewRect.Height / glControl1.Height);
        _mousePos = e.Location;
        UpdateView();
    }
}

编辑:更新以修复屏幕到视图坐标问题。

于 2012-06-09T21:51:09.497 回答