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 になると予想されます。明らかに、私の概念モデルは間違っています。

4

1 に答える 1

1

理解した。およびではなくをglOrtho使用します。rightbottomwidthheight

私の機能を更新しました:

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();
    }
}

編集:スクリーンからビューへの座標の問題を修正するための更新。

于 2012-06-09T21:51:09.497 に答える