我正在做一個小的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。顯然我的概念模型是錯誤的。
不使用「PictureBox」並更改其座標以移動圖像的具體原因? – GETah
@GETah:是的。我計劃通過這個GLControl做更多的事情;將要在其上繪製其他東西,並且我希望有良好的平滑GPU加速轉換。 – mpen
好的。你有沒有想過WPF呢? – GETah