我正在制作一个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。很明显,我的概念模型是错误的。
答案 0 :(得分:1)
想出来。 glOrtho
使用right
和bottom
而不是width
和height
。
更新了我的功能:
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();
}
}
编辑更新以修复屏幕到视图坐标问题。