opengl实现鼠标缩放与拖到

  1.鼠标中键按下滚动缩放的实现
添加一个OnMouseWheel消息句柄:
BOOL CRenderView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)  
{
// TODO: Add your message handler code here and/or call default
if(nFlags&MK_MBUTTON)  
{  
  if(zDelta>0)  
{
  m_xScaling+=0.1f;
m_yScaling+=0.1f;
m_zScaling+=0.1f;
  
}
  else  
{  
  m_xScaling-=0.1f;
m_yScaling-=0.1f;
m_zScaling-=0.1f;
}
  InvalidateRect(NULL,FALSE);
}  
return CView::OnMouseWheel(nFlags, zDelta, pt);
}

然后在OnPaint()里面加上glScalef(m_xScaling,m_yScaling,m_zScaling);
void CRenderView::OnPaint()  
{
CPaintDC dc(this); // device context for painting
wglMakeCurrent(m_hDC,m_hRC);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
//平移、旋转、缩放变换
  //glTranslated(m_xTranslation,m_yTranslation,0.0f);平移
  //glRotatef(m_xRotation,1.0f,0.0f,0.0f); 旋转
  //glRotatef(m_yRotation,0.0f,1.0f,0.0f);
  glScalef(m_xScaling,m_yScaling,m_zScaling); 缩放
RenderScene(); //绘图

glPopMatrix();

SwapBuffers(m_hDC); //将后台视频缓存拷贝到前台

wglMakeCurrent(m_hDC,NULL);
}

/
2.鼠标右键按下平移的实现:
添加OnRButtonDown消息响应
void CRenderView::OnRButtonDown(UINT nFlags, CPoint point)  
{
// TODO: Add your message handler code here and/or call default
m_RightButtonDown=TRUE;
Pos1=point;
CView::OnRButtonDown(nFlags, point);
}
添加OnRButtonUp消息响应
void CRenderView::OnRButtonUp(UINT nFlags, CPoint point)  
{
// TODO: Add your message handler code here and/or call default
m_RightButtonDown=FALSE;
CView::OnRButtonUp(nFlags, point);
}
添加OnMouseMove消息响应:
void CRenderView::OnMouseMove(UINT nFlags, CPoint point)  
{
// TODO: Add your message handler code here and/or call default
  if(m_RightButtonDown)
  {
m_xTranslation=(float)(point.x - Pos1.x)*2.0f;
  m_yTranslation=-(float)(point.y - Pos1.y)*2.0f;
InvalidateRect(NULL,FALSE);
  }
  CView::OnMouseMove(nFlags, point);
}

然后在Onpaint()里面添加:glTranslated(m_xTranslation,m_yTranslation,0.0f);即可

本文出自 “蹒跚” 博客,请务必保留此出处http://shanzhizi.blog.51cto.com/5066308/939092

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用QOpenGLWidget和QMatrix4x4类来实现旋转、缩放和移动操作。具体实现可以参考以下代码: ```python from PyQt5.QtWidgets import QApplication, QOpenGLWidget from PyQt5.QtGui import QMatrix4x4, QVector3D from PyQt5.QtCore import Qt class MyOpenGLWidget(QOpenGLWidget): def __init__(self, parent=None): super().__init__(parent) self.rotation = QVector3D(0.0, 0.0, 0.0) self.scale = 1.0 self.translation = QVector3D(0.0, 0.0, 0.0) def initializeGL(self): # 初始化OpenGL环境 ... def paintGL(self): # 绘制OpenGL场景 ... def resizeGL(self, width, height): # 处理窗口大小变化 ... def mousePressEvent(self, event): # 处理鼠标按下事件 ... def mouseMoveEvent(self, event): # 处理鼠标移动事件 ... def wheelEvent(self, event): # 处理鼠标滚轮事件 ... def keyPressEvent(self, event): # 处理键盘按下事件 ... def updateMatrix(self): # 更新变换矩阵 matrix = QMatrix4x4() matrix.translate(self.translation) matrix.rotate(self.rotation.x(), QVector3D(1.0, 0.0, 0.0)) matrix.rotate(self.rotation.y(), QVector3D(0.0, 1.0, 0.0)) matrix.rotate(self.rotation.z(), QVector3D(0.0, 0.0, 1.0)) matrix.scale(self.scale) self.setMatrix(matrix) def setRotation(self, x, y, z): self.rotation = QVector3D(x, y, z) self.updateMatrix() def setScale(self, scale): self.scale = scale self.updateMatrix() def setTranslation(self, x, y, z): self.translation = QVector3D(x, y, z) self.updateMatrix() ``` 其中,updateMatrix()方法用于更新变换矩阵,setRotation()、setScale()和setTranslation()方法用于设置旋转、缩放和移动参数。在鼠标和键盘事件处理方法中,可以根据用户的操作来调用这些方法,从而实现旋转、缩放和移动操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值