OpenGL MFC单文档 实现轨迹球

原创 2017年07月26日 21:25:17
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 point
		m_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单文档环境配置(VS2010)

OpenGL MFC单文档环境配置 本机环境:WIN10    VS2010 环境配置:请查看上一篇博客 一、简介 Windows GDI是通过设备句柄(Device Context(...
  • MissXy_
  • MissXy_
  • 2017年07月21日 20:15
  • 291

MFC单文档结构,实现OpenGL的绘图,移动,旋转,缩放

MFC单文档结构,实现OpenGL的绘图,移动,旋转,缩放 基本知识: Windows应用程序是使用设备描述表(DeviceContext,简写为"DC")进行图形的绘制输出, ...
  • yulinxx
  • yulinxx
  • 2014年09月13日 23:05
  • 2644

MFC单文档窗口添加按钮控件

原文:http://blog.sina.com.cn/s/blog_6d0cbb0301018u1w.html 单文档的添加按钮不能像对话框直接拖按钮,需要手动添加。 在MFC...
  • qq_35040828
  • qq_35040828
  • 2016年06月20日 11:22
  • 1836

[MFC]文档视图体系结构、单文档界面

1. 文档视图结构:     1) 是MFC的一种模块化设计思想的产物,要求程序的数据和表现数据的视图分开来处理;     2) 数据以文档的形式表现,文档可以存储在磁盘中永久保存也可以被程序读出并进...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年09月20日 20:25
  • 1629

MFC单文档绘图(一)——窗体分割

1. VS2010新建MFC单文档项目 2.
  • terrycanny
  • terrycanny
  • 2014年09月01日 16:46
  • 2369

MFC的单文档视图结构(摘录)

文档        文档对象用于管理和维护数据,包括保存数据、取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示。    视图        视图对象...
  • qqqren
  • qqqren
  • 2016年11月25日 10:52
  • 349

MFC单文档打开文件

打开文件类之间关联 在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。...
  • komtao520
  • komtao520
  • 2015年10月21日 17:13
  • 866

创建一个单文档MFC应用程序的那些事儿

从大一注册博客到现在还没发表过一篇文章,趁着复习的机会整理一下所得,这次不要再半途而废了~ -----------------------------------------------------...
  • baixue0729
  • baixue0729
  • 2016年01月10日 18:34
  • 3950

MFC单文档框架分析及执行流程

首先来分析一下MFC单文档类的结构: 它包括ruxi
  • u011619422
  • u011619422
  • 2014年10月23日 20:03
  • 1514

VS2013/MFC编程入门之一(利用MFC向导生成单文档应用程序框架)

关于VS2013和MSDN如何安装,网上有很多教程,再次就不在赘述,相信大家都已经安装好了。本次MFC编程全程使用简体中文专业版VS2013 进行操作。这一讲给大家一个简单的例子,演示如何生成单文档应...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016年11月22日 22:11
  • 4309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL MFC单文档 实现轨迹球
举报原因:
原因补充:

(最多只允许输入30个字)