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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小K小Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值