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()函数,看看是否把图形移动到视区内。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MissXy_/article/details/76165788

OpenGL轨迹球代码

转自:http://blog.sina.com.cn/s/blog_8d8425f30100ywap.html 从网上下载的经典OpenGL轨迹球代码,自己增加了缩放操作,共三个文件: sam从网...
  • chy19911123
  • chy19911123
  • 2015-04-29 15:33:18
  • 1820

OpenGL中的轨迹球问题

OpenGL鼠标轨迹球(Trackball)原理 什么是鼠标轨迹球 类似AutoCAD里的“动态观察”,三维模型都是要投影到二维的屏幕上才能显示给用户,而用户如果想观察一下三维模型的立体形状使用...
  • rhx_qiuzhi
  • rhx_qiuzhi
  • 2016-12-21 16:00:58
  • 941

MFC游戏程序 - 碰撞的小球

windows程序设计做的练习。高中的时候就是靠物理吃饭的,学了windows编程很期待能用一用。这个程序就是模拟了许多刚体小球在平面上运动,当两球撞在一起时按照动量守恒定理改变两球的运动速度。地面和...
  • tiaotiaoyly
  • tiaotiaoyly
  • 2008-05-27 16:07:00
  • 4040

使用轨迹球来实现视图的旋转

OpenGL鼠标轨迹球(Trackball)原理 什么是鼠标轨迹球 类似AutoCAD里的“动态观察”,三维模型都是要投影到二维的屏幕上才能显示给用户,而用户如果想观察一下三维模型的立体形状使用...
  • wang15061955806
  • wang15061955806
  • 2016-03-16 22:51:46
  • 1497

MFC+OpenGL单文档实现图形旋转

OpenGL画图函数: void display() { glPushMatrix(); glRotatef(spin, 0.0, 0.0, -1.0); /*绕着z轴旋转 每次旋转spin...
  • Tan_HandSome
  • Tan_HandSome
  • 2015-08-01 20:01:39
  • 838

OpenGL MFC单文档 实现轨迹球

OpenGL MFC单文档 实现轨迹球 前言:我是一个怀揣着伟大梦想的普通男生!结果就是,一有时间就幻想着自己的伟大梦想,忘了自己下一步该迈出左脚还是右脚。这不,只顾做梦了,时光可不...
  • MissXy_
  • MissXy_
  • 2017-07-26 21:25:17
  • 269

<em>opengl 轨迹球</em>

opengl <em>opengl 轨迹球</em> 鼠标球模拟 二维鼠标转为三维坐标空间,并得到三维坐标的三个坐标数据
  • 2018年04月18日 00:00

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

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

OpenGL基于MFC单文档应用程序框架

  • 2008年11月15日 22:15
  • 16KB
  • 下载

使用<em>OpenGL</em>实现三维坐标的鼠标拣选

<em>opengl 轨迹球</em> 立即下载 上传者: 挪威没有森林 时间: 2011-11-13 综合评分...VC++6.0 <em>MFC</em> 鼠标位置的显示及启动界面 立即下载 上传者: qynihao 时间: 2010...
  • 2018年04月18日 00:00
收藏助手
不良信息举报
您举报文章:OpenGL MFC单文档 实现轨迹球
举报原因:
原因补充:

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