2012-06-09 61 views
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。顯然我的概念模型是錯誤的。

+0

不使用「PictureBox」並更改其座標以移動圖像的具體原因? – GETah

+0

@GETah:是的。我計劃通過這個GLControl做更多的事情;將要在其上繪製其他東西,並且我希望有良好的平滑GPU加速轉換。 – mpen

+0

好的。你有沒有想過WPF呢? – GETah

回答

1

想通了。使用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(); 
    } 
} 

編輯:更新修復畫面'來查看 - 協調問題。

+1

+1中簡化了,以便將解決方案發回 – GETah

+0

仍然存在一個問題,在放大(或縮小)之後,它不會像您期望的那樣平移。如果將光標移動10個像素,則會在視圖座標中平移10個像素,而不是屏幕座標。 – mpen