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