OpenGL MFC单文档 实现轨迹球
前言:我是一个怀揣着伟大梦想的普通男生!结果就是,一有时间就幻想着自己的伟大梦想,忘了自己下一步该迈出左脚还是右脚。这不,只顾做梦了,时光可不管我,独自一个人走远了。
建议:目标,计划,实施。我认为的三大步骤!好比今天学习MFC单文档下的轨迹球实现,首先拿起纸,Write:
目标:实现轨迹球
计划:1.学习MFC鼠标和键盘事件
          2.学习二维的鼠标点映射到三维的轨迹球映射关系
          3.结合
实施:不能只想不做,Begin
1.MFC单文档鼠标响应
通过MFC 类向导,添加鼠标的消息响应,如下图:
关于每个消息,我就不解释了,大家可以问问度娘。
1.首先在类的头文件中添加成员变量:

CPoint      m_mousePoint;        //记录鼠标信息
GLfloat     m_xAngle,m_yAngle;   //控制旋转
GLfloat     m_Scale;             //用于缩放
GLfloat     m_xPos;
GLfloat     m_yPos;

2.再在构造函数中初始化:

m_xAngle = 0.0f;
m_yAngle = 0.0f;
m_Scale = 1.f;
m_xPos = 0.0f;
m_yPos = 0.0f;
3.编辑消息响应
鼠标左键按下:

void CStepinGLView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_mousePoint = point;SetCapture();   //设置鼠标按下捕获CView::OnLButtonDown(nFlags, point);
}

鼠标左键释放:

void CStepinGLView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_mousePoint = point;ReleaseCapture();CView::OnLButtonUp(nFlags, point);
}

鼠标移动:

void CStepinGLView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (GetCapture() == this){m_xAngle+=(point.y-m_mousePoint.y)/3.6;m_yAngle+=(point.x-m_mousePoint.x)/3.6;InvalidateRect(NULL,FALSE);//Set the mouse pointm_mousePoint = point;}CView::OnMouseMove(nFlags, point);
}

鼠标中间滑轮:

BOOL CStepinGLView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_Scale += 0.1 *zDelta /120;InvalidateRect(NULL,FALSE);return CView::OnMouseWheel(nFlags, zDelta, pt);
}
4.点击编译,运行,是不是可以实现鼠标控制了?!
2.键盘响应
因为我们已近添加过键盘的消息响应,只需编辑即可:

void CStepinGLView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{// TODO: 在此添加消息处理程序代码和/或调用默认值switch (nChar){case VK_UP:      m_yPos = m_yPos + 0.1f;break;case VK_DOWN:    m_yPos = m_yPos - 0.1f;break;case VK_LEFT:    m_xPos = m_xPos - 0.1f;break;case VK_RIGHT:  m_xPos = m_xPos + 0.1f;break;default:        MessageBox(L"请按 ↑ ↓ ← → 键!");break;}Invalidate(FALSE);   CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
3.附上我修改后程序:

void CStepinGLView::DrawScene(void)
{//移动物体到显示区glTranslatef(0.f,0.f,-7.0f);glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);//视角变换  glMatrixMode(GL_MODELVIEW);  glLoadIdentity(); gluLookAt(0.0,3.0,7.0, 0.0,0.0,0.0, 0.0,1.0,0.0);/*前三个参数是眼睛的位置,中间三个参数是物体所在的位置,后面三个参数表示向量,头顶朝上的方向*/  glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_NORMALIZE);glEnable(GL_COLOR_MATERIAL);glPushMatrix();LightM();glPopMatrix();glPushMatrix();glColor3f(0.5f, 0.25f, 0.0f);glTranslatef(m_xPos,m_yPos,0.0f);glRotatef(rtri,0.0f,0.1f,0.0f);          //旋转glRotatef(m_xAngle, 1.0f,0.0f,0.0f);glRotatef(m_yAngle, 0.0f,1.0f,0.0f);glScalef(m_Scale,m_Scale,m_Scale);      //缩放glutSolidTeapot(0.5f);glPopMatrix();glPushMatrix();glRotated(-65,1.0,0.0,0.0);DrawWater();glPopMatrix();glDisable(GL_LIGHTING);glDisable(GL_COLOR_MATERIAL);}
4.编译完成,运行程序:
后记:大家运行程序时,可能会出现界面不显示问题,那就好好看看你程序使用的是透视投影还是平行投影,最后再检查一下你的glTranslatef()函数,看看是否把图形移动到视区内。

OpenGL MFC单文档 实现轨迹球相关推荐

  1. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  2. OCC-7.6.0 + MFC单文档应用入门教程

    OCC-7.6.0 + MFC单文档应用 入门教程 磨刀不误砍柴工,如果你对MFC没任何基础,请先读这篇MFC的入门基础,它会降低你对这篇文章的恐惧感 开发环境说明 win7+ opencascade ...

  3. 用MFC单文档改写ARToolKit5.4的例子simpleLite

    RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下: 1.开发环境 Win10,VS2017,ARToolkit5.4 2.新建MFC单文档程序Test 在类向导中,为CTest ...

  4. MFC单文档的背景上绘制一个可以自动显示文字的长方形

    我在mfc单文档里设置了一个绘图区,并在上面(用pDC->Rectangle()函数)绘制了一个很小的长方形(注意:这个长方形很小,直接在上面写字无法看到),请问如何在绘制出长方形的时候让这个长 ...

  5. MFC单文档框架编程(二): SDI框架下的消息处理

    MFC单文档框架编程(一) ...................................................................................... ...

  6. 【数字图像处理】 二.MFC单文档分割窗口显示图片

    本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...

  7. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  8. 【整理】MFC单文档程序窗口大小的设置

    有时候根据实际需要,比如MFC单文档程序视图里内容少.空白一大半,需要调整MFC单文档程序窗口大小.限制单文档的最大最小尺寸. 1.  要控制一个框架的的最大最小尺寸,需要做两件事情,在CFrameW ...

  9. MFC单文档之给主窗口添加背景图片

    MFC单文档之给主窗口添加背景图片 1.导入图片 选择一个bmp格式的图片,将其导入到res文件夹中,然后工程资源目录下导入此图,注意格式一定要确定是百分百bmp格式的,不然报错,有的图片很坑是假bm ...

最新文章

  1. 3.10 直观理解反向传播-深度学习-Stanford吴恩达教授
  2. var lib mysql ib_MYSQL问题解决
  3. 物联网通信技术,那些你不知道的事
  4. 内核并发控制---RCU (来自网易)
  5. 计算机科学与技术专业大学排名2020,2020计算机科学与技术专业最好大学排名:160余所大学上榜...
  6. 原码,反码,补码的表示范围总结
  7. jQuery Mobile 中文手册 Ajax开发版(2)
  8. Docker系列(四)守护式容器
  9. aix系统vi修改命令_aix系统VI编辑器的操作
  10. vscode下载Visual Studio Code User System windows及 Mac安装文件下载
  11. Charles安装破解和基础配置
  12. 快捷键,总结一些实用高效的快捷键
  13. html设置网格颜色,AI网格大小颜色怎么设置-设置AI网格大小颜色的方法 - 河东软件园...
  14. centos检测不到磁盘_CentOS 7 安装时候检测不到空余硬盘的解决办法
  15. win10开机桌面图像获取
  16. python enumerate用法
  17. r语言t检验输出检验统计量_R语言的各种检验
  18. 开机两个小时后定时关机
  19. 1字节不是一定是8位。
  20. CTFSHOW-PHP特性

热门文章

  1. 飞腾服务器代理上网设置
  2. 数学专业的数学与计算机专业的数学的比较(转)
  3. 如何学IT?零基础入门自学Java编程系列:java简介跟计算机常识
  4. php中md5加密函数怎么用,用PHP写的MD5加密函数
  5. VB编程:UBound获取数组上限;LBound获取数组下限-25
  6. APP - 支付宝怎么延时转账?能否撤回转账?
  7. springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)
  8. 微信小程序获取用户收货地址与指纹验证接口(安卓和iphone)
  9. Navicat Premium 15导入excel表格
  10. 八股总结(二)计算机网络与网络编程