基于Visual C++ 2015 实现OpenGL鼠标控制坐标系旋转、缩放、移动
本例子实现是基于上一篇文章“基于Viusal C++ 2015 MFC单文档程序中搭建OpenGL框架”
在C*****View.cpp添加一下代码:
void CLiDARView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int X_Point = point.x - OldPoint.x; //X_Point坐标的位移
int Y_Point = point.y - OldPoint.y; //Y_Point坐标的位移
OldPoint = point; //OldPoint记录上一次坐标的位置
/*按住鼠标左键并在X方向上移动鼠标实现在三维中视角原地旋转的观察三维模型,按住左键在Y方向上移动鼠标实现上下俯视 或仰视的观察三维模型*/
if (nFlags&MK_LBUTTON)
{ //m_OpenGL->RotateRate调整旋转速率的参数(下面的计算把移动的长度累计成角度)
m_OpenGL->Rotate_XZ = m_OpenGL->Rotate_XZ + (m_OpenGL->RotateRate) * X_Point; /*计算鼠标点击按住键并向X 方向移动的角度*/
m_OpenGL->Rotate_Y = m_OpenGL->Rotate_Y + (m_OpenGL->RotateRate) * Y_Point; /*计算鼠标点击按住键并向Y方 向移动的角度*/
if (m_OpenGL->Rotate_XZ > 360.0f || m_OpenGL->Rotate_XZ < -360.0f) //旋转的角度限制在负360度与正360度之间
{
m_OpenGL->Rotate_XZ = 0; //当大于或等于360度就把旋转的角度重新设置为0度
}
if (m_OpenGL->Rotate_Y > 60.0f) //当鼠标在Y轴方向上移动鼠标实现上下俯视或仰视的观察三维模型
{
m_OpenGL->Rotate_Y = 60.f; //限制上下的角度为60,此参数可以自行设置
}
else if (m_OpenGL->Rotate_Y < -60.0f)
{
m_OpenGL->Rotate_Y = -60.f;
}
//其中m_OpenGL->View_Position[]为gluLookAt函数的视点的位置,Target_Position[]视角目标点的位置
m_OpenGL->Radian_XZ = float(((m_OpenGL->Rotate_XZ) * PI) / 180.0); //把角度转化成弧度
m_OpenGL->Target_Position[0] = m_OpenGL->View_Position[0] + 100*sin(m_OpenGL->Radian_XZ);/*当旋转时重新计算 目标点位置*/
m_OpenGL->Target_Position[2] = m_OpenGL->View_Position[2] + 100*cos(m_OpenGL->Radian_XZ);/*当旋转时重新计 算目标点位置*/
m_OpenGL->Target_Position[1] = m_OpenGL->View_Position[1] + m_OpenGL->Rotate_Y;//当旋转时重新计算目标点位置
}
//当按住鼠标的滚轮并在Y方向上移动鼠标实现三维Z轴方向上的移动
if (nFlags&MK_MBUTTON)
{
/*为了使当视点m_OpenGL->View_Position[]的位置发生变化时,视角目标点的位置Target_Position[]也同时发生相应的变化
需要以下的计算使得两个参数同时改变,这样子在移动时从视角的位置看清了更真实*/
m_OpenGL->Target_Position[2] = m_OpenGL->Target_Position[2] - m_OpenGL->View_Position[2];/*减去原来的视角目标 点位置*/
m_OpenGL->View_Position[2] = m_OpenGL->View_Position[2] + (m_OpenGL->RotateRate) * Y_Point;
m_OpenGL->Target_Position[2] = m_OpenGL->Target_Position[2] + m_OpenGL->View_Position[2];/*重新加上新的视角点 位置*/
}
/*按住鼠标的右键并左右方向移动鼠标实现X轴方向上的移动,按住右键并上下方向移动鼠标实现Y轴方向的移动,原理跟上面 按住滚轮一样*/
if (nFlags&MK_RBUTTON)
{
m_OpenGL->Target_Position[1] = m_OpenGL->Target_Position[1] - m_OpenGL->View_Position[1];
m_OpenGL->Target_Position[0] = m_OpenGL->Target_Position[0] - m_OpenGL->View_Position[0];
m_OpenGL->View_Position[0] = m_OpenGL->View_Position[0] + (m_OpenGL->RotateRate) * X_Point;
m_OpenGL->View_Position[1] = m_OpenGL->View_Position[1] + (m_OpenGL->RotateRate) * Y_Point;
m_OpenGL->Target_Position[1] = m_OpenGL->Target_Position[1] + m_OpenGL->View_Position[1];
m_OpenGL->Target_Position[0] = m_OpenGL->Target_Position[0] + m_OpenGL->View_Position[0];
}
CView::OnMouseMove(nFlags, point);
}
gluLookAt函数的参数设置:
gluLookAt(View_Position[0], View_Position[1], View_Position[2], Target_Position[0], Target_Position[1], Target_Position[2], 0.0, 1.0, 0.0);
重新编译并利用鼠标实现旋转的示意图: