我正在尝试在旋转图像后纠正模型的平移和旋转行为。这似乎是一个常见问题。我以前曾经见过这个问题,但是我没有看到它以这样的方式回答我理解如何将它应用到我的代码中。我只是希望在旋转图像之前,平移和旋转行为保持不变。在第一次旋转之后,平移和旋转永远是倾斜的。另外,我对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空间中绘制具有数千个顶点的CAD模型[Vertex3]。我正在2D空间[Ortho]中查看它们。我修改投影矩阵以从不同的角度查看模型。我认为这比重绘整个模型和转换所有顶点更容易。在我看来,移动相机比重新计算数千个顶点的位置更容易。我认为这是标准的。如果没有,我全都耳朵。
答案 0 :(得分:1)
从您的代码中我无法确切地知道您期望的行为,但我怀疑您正在尝试连续读取鼠标输入并增加“相机”。
使用GL版本,您正在使用模型,视图矩阵将合并到ModelView
矩阵中。这(在我看来)在开始时会让事情变得更难理解。
如果它们是分开的,您可以分别使用模型和视图矩阵独立地变换对象和相机。由于它们的组合,您需要在进行视图转换之前“保存”ModelView矩阵的状态。
这是glPushMatrix
和glPopMatrix
派上用场的地方。
想一下典型的stack。通过将一个新矩阵推送到堆栈上,您继承了下面的所有内容(矩阵的当前状态),但后续转换将被隔离到这个新矩阵。一旦你完成了变换并使用了矩阵(例如渲染),你就可以弹出该矩阵从堆栈中返回,这将返回到原始矩阵(包含模型转换)。每次程序循环时都会这样做。
我在很长一段时间内没有编写VB.NET或固定功能(pre-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的插图: