欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[OpenGL]多视角漫游

程序员文章站 2022-03-05 14:54:03
...

我们绘制完一个模型之后,尴尬的是每次运行只能看到模型的一面,这样显然是极为不方便的,那我们如何能够像游戏中那样对一个模型进行多视角观察呢。现在我给大家描述一下原理

想象一下,如果我们把我们的眼睛放在一个球面上,把物体放在球心上,那么我们无论把我们的眼睛放在球面的哪个位置我们都是可以观察到模型的,而且根据位置的不同我们观察到模型也不同。

下面具体说明实现方法:

    1.构建一个球面

     显然,我们确定球面上的某一点,我们只需要定义两个角度(水平方向和竖直方向的角度),一个半径即可。如下图:

[OpenGL]多视角漫游

    根据这三个值我们可以确定眼睛的位置。

    计算公式如下:   

 

 float eyex=dist*cos(vertical/180.0*PI)*sin(horizontal/180.0*PI);
 float eyey=dist*sin(vertical/180.0*PI);
 float eyez=dist*cos(vertical/180.0*PI)*cos(horizontal/180.0*PI);

    然后我们设置眼睛的位置(假定模型位置为(0,0,0))

 

 gluLookAt(eyex, eyey,eyez, 0.0, 0.0, 0.0, 0, 1, 0);

 

    2.控制观察位置

 

    两个角度控制观察方向,半径控制眼睛到模型的距离。

    我们可以添加鼠标事件,每当鼠标向左或向右滑动时我们增大或减小水平方向的角度,向上滑动和向下滑动同理。

    我们可以添加滑轮事件,增大或减少半径。

    具体实现如下:

    鼠标的点击事件


void Widget::mousePressEvent(QMouseEvent *e)
{
    m_last = e->pos();
}

    鼠标的移动事件:


void mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons() & Qt::LeftButton)
    {
        QPoint m_now = e->pos();
        float disx = m_now.x() - m_last.x();//两个鼠标x坐标的差
        float disy = m_now.y() - m_last.y();  //m_last是之前点击事件取得的鼠标位置
        //更改观察方向
        horizontal -= disx/25;  
        vertical += disy/25;
        m_last = m_now; 
        updateGL();
    }

}

     鼠标的滑轮事件:


void wheelEvent(QWheelEvent *e){
    if(e->delta() >0)
        dist-=10;
    else
        dist+=10;

    updateGL();
}
    

    实现了上面的几个简单的函数之后我们就能*的观察我们绘制的模型了。

    

相关标签: opengl 视角控制