0

画像を回転させた後、モデルの移動と回転の動作を修正しようとしています。これはよくある問題のようです。これが以前に尋ねられたのを見たことがありますが、コードに適用する方法を理解できるような方法で回答されたのを見たことがありません。画像を回転する前に、移動と回転の動作をそのままにしておきたいだけです。最初の回転の後、平行移動と回転は永遠に歪んでいます。また、私は OpenGL に非常に精通しているので、ゆっくり話してください。

Private Sub GlControl1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles GlControl1.MouseMove
    If _MouseButtonLeft Then
        '
        ' get new position of mouse
        _XposEnd = e.X - _Xpos
        _YposEnd = _Ypos - e.Y
        '
        ' reset the mouse start position
        _Xpos = e.X
        _Ypos = e.Y
        '
        ' change projection
        GL.MatrixMode(MatrixMode.Projection)
        GL.Translate(_XposEnd * _MouseSpeed, _YposEnd * _MouseSpeed, 0)
        GlControl1.Invalidate()
        '
    End If
    '
    If _MouseButtonRight Then
        '
        ' get new position of mouse
        _XposEnd = e.X - _Xpos
        _YposEnd = _Ypos - e.Y
        '
        ' reset the mouse start position
        _Xpos = e.X
        _Ypos = e.Y
        '
        ' change projection
        GL.MatrixMode(MatrixMode.Projection)
        GL.Rotate(_XposEnd * _MouseSpeed, 1, 0, 0)
        GL.Rotate(_YposEnd * _MouseSpeed, 0, 1, 0)
        GlControl1.Invalidate()
        '
    End If
End Sub

編集1:

私の描画ループは次のとおりです。

    GL.Clear(ClearBufferMask.ColorBufferBit)
    GL.Clear(ClearBufferMask.DepthBufferBit)
    GL.MatrixMode(MatrixMode.Modelview)
    GL.LoadIdentity()
    drawStuff()
    GlControl1.SwapBuffers()

プロジェクション マトリックス: ちょっと話を戻します。3D 空間 [Vertex3] に数千の頂点を持つ CAD モデルを描画しています。2D 空間 [オルソ] で表示しています。射影行列を変更して、さまざまな視点からモデルを表示します。モデル全体を再描画してすべての頂点を変換するよりも簡単だと思いました。私の考えでは、何千もの頂点の位置を再計算するよりも、カメラを動かす方が簡単です。それがスタンダードだと思いました。そうでなければ、私はすべての耳です。

4

1 に答える 1

1

あなたのコードから、あなたが期待している動作を正確に伝えることはできませんが、マウス入力を継続的に読み込んで「カメラ」を拡張しようとしていると思われます。

モデルを使用している GL のバージョンでは、ビュー マトリックスがマトリックスに結合されModelViewます。これにより(私の意見では)、開始時に物事を理解するのがより難しくなります。

それらが分離されている場合、モデルとビューのマトリックスをそれぞれ使用して、オブジェクトとカメラを個別に変換できます。それらは組み合わされているため、ビューの変換を行う前に、ModelView マトリックスの状態を「保存」する必要があります。

ここglPushMatrixglPopMatrix重宝します。

典型的なスタックを考えてみてください。新しいマトリックスをスタックにプッシュすることにより、以下のすべて (マトリックスの現在の状態) を継承しますが、その後の変換はこの新しいマトリックスに分離されます。変換を行ってマトリックスを使用した後 (レンダリングなど)、そのマトリックスをスタックからポップして元のマトリックス (モデル変換を含む) に戻すことができます。プログラムがループするたびにこれを行います。

私は長い間 VB.NET または固定関数 (GL3 より前) のコードを書いていないので、ご容赦ください。

GL.MatrixMode(MatrixMode.ModelView)
GL.PushMatrix()
GL.Rotate(viewXRotation, 1, 0, 0)
GL.Rotate(viewYRotation, 0, 1, 0)
GL.Rotate(viewZRotation, 0, 0, 1)
... draw your scene ...
GL.PopMatrix()

マトリックスを使用しているのを見たのでProjection、両方のマトリックスとそれらがどのように相互作用するかに関して、ここに少し追加の情報があります.

Projection マトリックスは、ビュー座標 (ModelView マトリックスが適用されたときにローカル座標が変換されるもの) をクリップ座標 (正規化されたデバイス座標) に変換するために使用されます。

これはlearnopengl.comのイラストです: OpenGL の座標系

于 2016-04-14T01:46:42.613 に答える