如何平移图像? (无法正确设置投影矩阵)

时间:2012-06-09 19:22:30

标签: c# math opengl

我正在制作一个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。很明显,我的概念模型是错误的。

1 个答案:

答案 0 :(得分:1)

想出来。 glOrtho使用rightbottom而不是widthheight

更新了我的功能:

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

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