昨天在《OpenGL中的光照和键盘控制》中的代码的基础上加入了用鼠标来控制旋转,不过自己觉得思路是不正确的,纯属瞎弄。。。
为了识别出用户想要旋转的方向和角度,增加了下面的变量:
enum
RotateDirection
{ // 鼠标控制的旋转方向
EAST,
WEST,
NORTH,
SOUTH
};
RotateDirection direction;
CPoint m_pStart; // 起点
CPoint m_pEnd; // 终点
bool isMoseDown; // 是否左键还按下
{ // 鼠标控制的旋转方向
EAST,
WEST,
NORTH,
SOUTH
};
RotateDirection direction;
CPoint m_pStart; // 起点
CPoint m_pEnd; // 终点
bool isMoseDown; // 是否左键还按下
然后就是鼠标的事件处理代码了:
void
COpenGLDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this -> isMoseDown = TRUE;
this -> m_pStart = point;
this -> m_pEnd = point;
CView::OnLButtonDown(nFlags, point);
}
{
// TODO: Add your message handler code here and/or call default
this -> isMoseDown = TRUE;
this -> m_pStart = point;
this -> m_pEnd = point;
CView::OnLButtonDown(nFlags, point);
}
void
COpenGLDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this -> isMoseDown = FALSE;
if ( this -> direction == EAST)
yspeed += 0.5f ;
else if ( this -> direction == WEST)
yspeed -= 0.5f ;
else if ( this -> direction == SOUTH)
xspeed += 0.5f ;
else if ( this -> direction == NORTH)
xspeed -= 0.5f ;
CView::OnLButtonUp(nFlags, point);
}
void COpenGLDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ( this -> isMoseDown == false )
{
return ;
}
if (point.x > this -> m_pEnd.x)
this -> direction = EAST;
else if (point.x < this -> m_pEnd.x)
this -> direction = WEST;
else if (point.y > this -> m_pEnd.y)
this -> direction = SOUTH;
else if (point.y < this -> m_pEnd.y)
this -> direction = NORTH;
this -> m_pEnd = point;
CView::OnMouseMove(nFlags, point);
}
{
// TODO: Add your message handler code here and/or call default
this -> isMoseDown = FALSE;
if ( this -> direction == EAST)
yspeed += 0.5f ;
else if ( this -> direction == WEST)
yspeed -= 0.5f ;
else if ( this -> direction == SOUTH)
xspeed += 0.5f ;
else if ( this -> direction == NORTH)
xspeed -= 0.5f ;
CView::OnLButtonUp(nFlags, point);
}
void COpenGLDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ( this -> isMoseDown == false )
{
return ;
}
if (point.x > this -> m_pEnd.x)
this -> direction = EAST;
else if (point.x < this -> m_pEnd.x)
this -> direction = WEST;
else if (point.y > this -> m_pEnd.y)
this -> direction = SOUTH;
else if (point.y < this -> m_pEnd.y)
this -> direction = NORTH;
this -> m_pEnd = point;
CView::OnMouseMove(nFlags, point);
}
试了下效果,控制上不是很舒适方便,我觉得自己才旋转的方向判断上应该是不对的,到底如何判断旋转方向呢?