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 模型。我正在二维空间 [Ortho] 中查看它们。我修改投影矩阵以从不同的角度查看模型。我认为这比重新绘制整个模型并转换所有顶点更容易。在我看来,移动相机比重新计算数千个顶点的位置更容易。我认为这是标准的。如果没有,我会全神贯注。

4

1 回答 1

1

从您的代码中,我无法准确判断您期望什么行为,但我怀疑您正在尝试不断读取鼠标输入并增强“相机”。

在 GL 版本中,您使用的模型和视图矩阵被合并到ModelView矩阵中。这(在我看来)使事情在开始时更难理解。

如果它们是分开的,您可以分别使用模型和视图矩阵独立地转换您的对象和相机。由于它们是组合在一起的,因此您需要在进行视图转换之前“保存” ModelView 矩阵的状态。

这是派上用场glPushMatrix的地方。glPopMatrix

想想一个典型的堆栈。通过新矩阵推入堆栈,您将继承下面的所有内容(矩阵的当前状态),但随后的转换将被隔离到这个新矩阵。一旦您进行了转换并使用了矩阵(例如渲染),您就可以将该矩阵从堆栈中弹出,这将使您返回到原始矩阵(包含您的模型转换)。每次程序循环时,您都会这样做。

我已经很长时间没有编写 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 回答