基于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);

重新编译并利用鼠标实现旋转的示意图:

猜你喜欢

转载自blog.csdn.net/qq_34911636/article/details/87344224