2016-04-11 4 views
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 

EDIT 1:

マイドローループは次のとおりです。

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

投影行列:バック秒まで私をしてみましょう。 3D空間[Vertex3]に何千もの頂点を持つCADモデルを描いています。私は2D空間[Ortho]でそれらを見ています。異なる視点からモデルを見るために投影行列を修正します。私は、モデル全体を再描画してすべての頂点を変換するよりも簡単だと思いました。私の心の中でカメラを動かすことは、何千もの頂点の位置を再計算するよりも簡単です。私はそれが標準であると考えました。そうでなければ、私はすべての耳です。

+0

ねえ、あなたはあなたのドロー・ループ内のどこglLoadIdentityを使うのですか?あなたがglRotateをスタックしたいので、あなたはしないと思います。これが問題であれば、熟考してください。また、Projection matrixを変更したいと思っているのは非常に奇妙です。 –

答えて

1

あなたのコードから私はあなたの予想どおりの動作を正確に伝えることはできませんが、私はあなたがマウス入力を継続して読み込み、「カメラ」を増やそうとしていると思われます。

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

もしそれらが分離されていれば、それぞれモデルとビューマトリックスを使ってオブジェクトとカメラを独立して変換できます。それらが結合されているので、ビュー変換を行う前にModelViewマトリックスの状態を「保存」する必要があります。

glPushMatrixglPopMatrixが便利です。

通常のstackと考えてください。 新しい行列をスタックにプッシュすると、下のものすべて(その行列の現在の状態)が継承されますが、その後の変換はこの新しい行列に分離されます。変換を行い、(例えばレンダリングするために)マトリックスを使用すると、のマトリックスが元のマトリックス(モデル変換を含む)に戻ってくることができます。プログラムがループするたびにこれを行います。

私は私と一緒にクマは非常に長い時間で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行列を使用して見ているのでここでは、マトリックスとそれらがどのように相互作用するかに関する少し余分な情報があります。

投影行列は、ビュー座標(ModelView行列が適用されたときにローカル座標がどのように変換されるか)をクリップ座標(正規化されたデバイス座標)に変換するために使用されます。ここで

learnopengl.comからの実例である: OpenGL's coordinate systems

関連する問題