购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.9 平移

在进行平移操作前,将代码恢复到最早的状态。切记,在代码编写过程中,对于不用的代码,最好使用注释而不是删除。虽然这样可能增加代码的阅读难度,但便于回溯。

接下来进行平移操作。平移操作的逻辑是,按下鼠标可获得当前鼠标的指针位置;在移动鼠标的过程中,可不断地获得鼠标指针的位置;减去鼠标移动的差量,即获得移动数据;松开鼠标后,平移操作停止。

首先,需要定义鼠标操作的变量:

  Public PICT_OLD_X As Integer, PICT_OLD_Y As Integer
Public LEFT_MOUSE_DOWN As Boolean, MIDDLE_MOUSE_DOWN As Boolean
Public mQuadX As GLfloat, mQuadY As GLfloat

然后,在窗体布置中双击工作区WorkPic控件,进入代码编辑区,添加下列代码:

  Private Sub WorkPic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
    LEFT_MOUSE_DOWN = True
    OGL.PICT_OLD_X = X
    OGL.PICT_OLD_Y = Y
  End If
End Sub
Private Sub WorkPic_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If LEFT_MOUSE_DOWN = True Then
    mQuadX = (X - OGL.PICT_OLD_X)/ Me.WorkPic.ScaleWidth
    mQuadY = (OGL.PICT_OLD_Y - Y)/ Me.WorkPic.ScaleHeight
    Call OGL.Display(Me.WorkPic)
  End If
End Sub
Private Sub WorkPic_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
    LEFT_MOUSE_DOWN = False
  End If
End Sub

注意,mQuadY =(OGL.PICT_OLD_Y - Y)/ Me.WorkPic.ScaleHeight。在OpenGL的坐标系中,左下角为(0,0);而在窗体坐标系中,(0,0)是位于左上角。此外,之前将坐标范围定义为(0,0)到(1,1),相应地,鼠标在PictureBox中的位置需要进行转换,并进行归一化,以将窗体坐标与OpenGL坐标对应起来。

最后,在Display函数中,在设置绘图坐标系后添加以下代码:

  glMatrixMode mmProjection
glLoadIdentity
GLU.gluOrtho2D 0, 1, 0, 1
GL.glTranslatef mQuadX, mQuadY, mQuadZ

平移运行结果如图3-19所示。

图3-19 平移运行结果

以上代码实现了单次平移。但是,在下次平移的时候,mQuadX和mQuadY初始值为0,即再次回到初始位置。如何在下次单击的时候保留上次停留的位置?我们可以在鼠标MouseDown事件中添加以下代码:

  Private Sub WorkPic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
    LEFT_MOUSE_DOWN = True
    OGL.PICT_OLD_X = X - mQuadX * Me.WorkPic.ScaleWidth
    OGL.PICT_OLD_Y = Y + mQuadY * Me.WorkPic.ScaleHeight
  End If
End Sub

以上代码存在一个逻辑缺漏:在当前绘制三角形时,三角形的移动位置属于三角形,而不是其他图元,比如四边形、多边形。因此,在绘制其他图元的时候,需要对mQuadX和mQuadY进行一次初始化。在命令按钮下修改代码:

  Private Sub QuadsCmd_Click()
  mQuadX = 0
  mQuadY = 0
  OGL.ShapeType = 4
  Call OGL.Display(Me.WorkPic)
End Sub

以上是四边形的修改代码,其他图元以此类推。 Tx+2JztPiuaRcO4I02J6vQLtqyrcNOli7ujBbp95q8+Vr8FwCO+MvEmxC7wezMbS

点击中间区域
呼出菜单
上一章
目录
下一章
×