QT5 OpenGL (四, 绘制立体图形)

概要

前面几篇博客,已经从基本的绘图, 上色到旋转都已经讲完了, 但它们都只是限于平面图形,而对于立体图形并没有讲到。 本篇主要来讲opengl绘制立体图形。 我们在小学就知道, 线是由点构成, 点构成面, 面构成立体图形。 所以,立体图形的绘制,就是绘制多个有对应关系的平面。 而平面的绘制,就是由多个点的坐标组成。前面几篇博客已经讲过了。


效果图

这里写图片描述


主要代码

void OpenglWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef( -1.5,  0.0, -6.0 );
    glRotatef( m_rotateRectangle,  0.0,  1.0,  0.0 );

    glBegin( GL_QUADS );

    glColor3f(1, 0, 0);
    glVertex3f(-1,1,1);
    glVertex3f(-1,1,-1);
    glVertex3f(-1,-1,-1);
    glVertex3f(-1,-1,1);

    glColor3f(0, 0, 1);
    glVertex3f(-1,1,-1);
    glVertex3f(-1,-1,-1);
    glVertex3f(1,-1,-1);
    glVertex3f(1,1,-1);

    glColor3f(0, 1, 0);
    glVertex3f(1,1,-1);
    glVertex3f(1,-1,-1);
    glVertex3f(1,-1,1);
    glVertex3f(1,1,1);

    glColor3f(0, 0, 1);
    glVertex3f(1,-1,1);
    glVertex3f(1,1,1);
    glVertex3f(-1,1,1);
    glVertex3f(-1,-1,1);

    glColor3f(0, 1, 0);
    glVertex3f(-1,1,1);
    glVertex3f(1,1,1);
    glVertex3f(1,1,-1);
    glVertex3f(-1,1,-1);

    glColor3f(0, 0, 1);
    glVertex3f(-1,-1,1);
    glVertex3f(-1,-1,-1);
    glVertex3f(1,-1,-1);
    glVertex3f(1,-1,1);

    glEnd();

    glLoadIdentity();

    glTranslatef(  1.5,  0.0, -6.0 );
    glRotatef( m_rotateTriangle,  0.0,  1.0,  0.0 );

    glBegin( GL_TRIANGLES );

    glColor3f( 1.0, 0.0, 0.0 );
    glVertex3f(  0.0,  1.0,  0.0 );
    glColor3f( 0.0, 0.0, 1.0 );
    glVertex3f( -1.0, -1.0, -1.0 );
    glColor3f( 0.0, 1.0, 0.0 );
    glVertex3f( -1.0, -1.0,  1.0 );

    glColor3f( 1.0, 0.0, 0.0 );
    glVertex3f(  0.0,  1.0,  0.0 );
    glColor3f( 0.0, 0.0, 1.0 );
    glVertex3f(  1.0, -1.0,  1.0 );
    glColor3f( 0.0, 1.0, 0.0 );
    glVertex3f(  1.0, -1.0, -1.0 );

    glColor3f( 1.0, 0.0, 0.0 );
    glVertex3f(  0.0,  1.0,  0.0 );
    glColor3f( 0.0, 1.0, 0.0 );
    glVertex3f( -1.0, -1.0,  1.0 );
    glColor3f( 0.0, 0.0, 1.0 );
    glVertex3f(  1.0, -1.0,  1.0 );


    glColor3f( 1.0, 0.0, 0.0 );
    glVertex3f(  0.0,  1.0,  0.0 );
    glColor3f( 0.0, 1.0, 0.0 );
    glVertex3f(  1.0, -1.0, -1.0 );
    glColor3f( 0.0, 0.0, 1.0 );
    glVertex3f( -1.0, -1.0, -1.0 );

    glEnd();

    m_rotateRectangle += 20;
    m_rotateTriangle += 20;
}

代码解析

在本实例中, 主要绘制了三棱柱和立方体。 总结的方法主要有:

1.在绘制立体图形时,在我们的思维空间里, 应该把这种规则的立体图形的中心为原点。以横向为X轴, 左为负,右为正, 以纵向为Y 轴, 上为正,下为负, 以我们面对的目光直射方面为Z轴, 胸前方向为正, 背后方向为负。 这样就容易形成一个容易理解的立体空间。

2.当我们以规则立体图形的中心为坐标原点时, 每个立体图形的各个顶点的x,y,z坐标,此时都不为0

3.对于有些面为三角形的立体图形,在绘制三角形面时, 点的顺序,和面的顺序不限定方向。

4.对于面为四边形或多边形的立体图形, 在绘制四边形,或多边形时,应该以逆时针方向绘制, 至于每个面的起点,不受限制, 从那个面开始不受限制。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li235456789/article/details/51079928
文章标签: qt5
个人分类: QT-OpenLG QT学习之路
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭