在上一篇的基础上加入对键盘和鼠标的事件处理程序,以便用其来控制3D物体的旋转和移动。
1,首先在CCY457OpenGLView类中为WM_KEYDOWN, WM_LBUTTONDOWN, WM_LBUTTONUP 和 WM_MOUSEMOVE四个事件加入事件处理函数。
2,在CCY457OpenGLView.h中加入下列用于控制旋转和移动的变量:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->GLfloatm_xAngle;
GLfloatm_yAngle;
GLfloatm_xPos;
GLfloatm_yPos;
CPointm_MouseDownPoint;
GLfloatm_yAngle;
GLfloatm_xPos;
GLfloatm_yPos;
CPointm_MouseDownPoint;
并在构造函数中初始化:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CCY457OpenGLView::CCY457OpenGLView()
{
m_xPos=0.0f;
m_yPos=0.0f;
m_xAngle=0.0f;
m_yAngle=0.0f;
}
{
m_xPos=0.0f;
m_yPos=0.0f;
m_xAngle=0.0f;
m_yAngle=0.0f;
}
3,加入绘制代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCOpenGLView::RenderScene()
{
glLoadIdentity();
glTranslatef(m_xPos,m_yPos,-5.0f);
glRotatef(m_xAngle,1.0f,0.0f,0.0f);
glRotatef(m_yAngle,0.0f,1.0f,0.0f);
glutWireCube(1.0f);
}
{
glLoadIdentity();
glTranslatef(m_xPos,m_yPos,-5.0f);
glRotatef(m_xAngle,1.0f,0.0f,0.0f);
glRotatef(m_yAngle,0.0f,1.0f,0.0f);
glutWireCube(1.0f);
}
4,为四个事件处理函数加入控制代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCOpenGLView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_UP:m_yPos=m_yPos+0.1f;
break;
caseVK_DOWN:m_yPos=m_yPos-0.1f;
break;
caseVK_LEFT:m_xPos=m_xPos-0.1f;
break;
caseVK_RIGHT:m_xPos=m_xPos+0.1f;
break;
default:MessageBox("Pressthearrowkeysonly");
break;
}
InvalidateRect(NULL,FALSE);
CView::OnKeyDown(nChar,nRepCnt,nFlags);
}
voidCOpenGLView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=point;
SetCapture();
CView::OnLButtonDown(nFlags,point);
}
voidCOpenGLView::OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=CPoint(0,0);
ReleaseCapture();
CView::OnLButtonUp(nFlags,point);
}
voidCOpenGLView::OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
//Checkifwehavecapturedthemouse
if(GetCapture()==this)
{
//Incrementtheobjectrotationangles
m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;
m_yAngle+=(point.x-m_MouseDownPoint.x)/3.6;
//Redrawtheview
InvalidateRect(NULL,FALSE);
//Setthemousepoint
m_MouseDownPoint=point;
};
CView::OnMouseMove(nFlags,point);
}
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_UP:m_yPos=m_yPos+0.1f;
break;
caseVK_DOWN:m_yPos=m_yPos-0.1f;
break;
caseVK_LEFT:m_xPos=m_xPos-0.1f;
break;
caseVK_RIGHT:m_xPos=m_xPos+0.1f;
break;
default:MessageBox("Pressthearrowkeysonly");
break;
}
InvalidateRect(NULL,FALSE);
CView::OnKeyDown(nChar,nRepCnt,nFlags);
}
voidCOpenGLView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=point;
SetCapture();
CView::OnLButtonDown(nFlags,point);
}
voidCOpenGLView::OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=CPoint(0,0);
ReleaseCapture();
CView::OnLButtonUp(nFlags,point);
}
voidCOpenGLView::OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
//Checkifwehavecapturedthemouse
if(GetCapture()==this)
{
//Incrementtheobjectrotationangles
m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;
m_yAngle+=(point.x-m_MouseDownPoint.x)/3.6;
//Redrawtheview
InvalidateRect(NULL,FALSE);
//Setthemousepoint
m_MouseDownPoint=point;
};
CView::OnMouseMove(nFlags,point);
}
本文介绍如何通过键盘和鼠标事件实现OpenGL视图中3D物体的旋转和平移操作。具体包括了事件处理函数的编写、控制变量的定义及初始化、绘制场景的方法更新,以及响应键盘箭头键和鼠标左键移动的控制逻辑。
962

被折叠的 条评论
为什么被折叠?



