写真を開いて、パンしたり、ズームインしたりできる小さな 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 になると予想されます。明らかに、私の概念モデルは間違っています。