1.方法:

建立三维坐标系,然后按照每个立方体的面着色,再绘制这个面上面的点,面的绘制要遵循逆时针的原则。

2.OPenGL.pro

QT       += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = OPenGL12
TEMPLATE = app
SOURCES += main.cpp\openglwidget.cppHEADERS  += \openglwidget.hLIBS += -lopengl32

3.OpenglWidget

OpenglWidget.h

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include <QtOpenGL>class OpenglWidget : public QGLWidget
{
public:OpenglWidget(QWidget *parent=0);
protected:void initializeGL();void initWidget();void paintGL();void resizeGL(int width, int height);
private:GLfloat angle;GLfloat angle1;
};
#endif // OPENGLWIDGET_H

OpenglWidget.cpp

#include "openglwidget.h"OpenglWidget::OpenglWidget(QWidget *parent):QGLWidget(parent)
{initWidget();initializeGL();
}
void OpenglWidget::initializeGL()
{//设置着色模式,平滑的glShadeModel(GL_SMOOTH);//清除掉之前的所有颜色glClearColor(0.0,0.0,0.0,0.0);//深度缓存,设置初始值为1.0,小于1.0的部分是可见的glClearDepth(1.0);//启动OPenGL的相关功能,由参数决定,这里指//(启用了之后,OpenGL在绘制的时候就会检查,当前像素前面是否有别的像素,如果别的像素挡道了它,那它就不会绘制,也就是说,OpenGL就只绘制最前面的一层)glEnable(GL_DEPTH_TEST);//制定深度缓存比较值//这里参数指的是如果输入的深度值小于或者等于参考值则通过glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);}void OpenglWidget::initWidget()
{//从屏幕上(400,400)为起始点,显示一个640*400的界面setGeometry(400,200,640,480);setWindowTitle("My OPenGL");
}void OpenglWidget::paintGL()
{//清除颜色缓冲和深度缓冲glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将当前点移置屏幕中心,相当于复位的操作glLoadIdentity();//平移函数,参数指的是分别从X轴,Y轴,Z轴平移glTranslatef(-1.5,0.0,-6.0);glRotated(angle,0.0,1.0,0.0);//创建图元,是绘制什么图形的接口,参数是绘制多边形的意思glBegin(GL_QUADS);//设置顶点值(f代表浮点),三维空间坐标glColor3f( 1.0, 0.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( angle1,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();angle+=70;angle1+=10;}void OpenglWidget::resizeGL(int width, int height)
{if(0==height)height=1;//告诉绘制到窗体的哪个位置glViewport(0,0,width,height);// 设置矩阵模式,参数是设置为投影矩阵glMatrixMode(GL_PROJECTION);//复位操作glLoadIdentity();GLdouble aspectRatio=(GLfloat)width/(GLfloat)height;GLdouble rFov=45.0*3.14159265/180.0;GLdouble zNear=0.1;GLdouble zFar=100.0;//调用glFrustum,生成矩阵与当前矩阵相乘,生成透视效果glFrustum(-zNear*tan(rFov/2.0)*aspectRatio,zNear*tan(rFov/2.0)*aspectRatio,-zNear*tan(rFov/2.0),zNear*tan(rFov/2.0),zNear,zFar);//切回模型视图矩阵glMatrixMode(GL_MODELVIEW);//复位glLoadIdentity();
}

4.main

#include"openglwidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);
//    Widget w;
//    w.show();OpenglWidget window;window.show();return a.exec();
}

5.程序运行效果

OpenGL(五)立体图形相关推荐

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

    概要 效果图 主要代码 代码解析 概要 前面几篇博客,已经从基本的绘图, 上色到旋转都已经讲完了, 但它们都只是限于平面图形,而对于立体图形并没有讲到. 本篇主要来讲opengl绘制立体图形. 我们在 ...

  2. Android开发 之 OpenGL ES系列(5--3D立体图形)

    OpenGL ES系列(5--3D立体图形) 转自:http://www.guidebee.info/wordpress/archives/1554 前面的例子尽管使用了OpenGL ES 3D图形库 ...

  3. 使用OpenGL,在窗口中绘制两个立体图形,位置分别为窗口的左侧和右侧,添加光照,两个图形分别绕x轴和y轴旋转。

    总体思路: 第一步,使用viewpoint函数来建立两个分割的窗口 第二步,在两个视口分别绘制带光照效果的立体图形 第三步,使用进栈出栈函数和Rotatef函数实现两图像各自的旋转 关于glPushM ...

  4. 立体图形3D动画和绘制

    做了一个关于立体图形3D动画和绘制图形的例子,效果如下: 这个是参照苹果官方文档和例子来写的,其中茶壶是根据点.颜色渲染.网格结构和灯光效果来绘制出来的. 再说实现步骤前我们需要了解一下概念: GLK ...

  5. 【愚公系列】2022年09月 微信小程序-WebGL立体图形的绘制

    文章目录 前言 一.webgl的使用 1.立体图形的绘制 二.相关包源码 三.总结 前言 WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaS ...

  6. 如何应用迅捷CAD编辑器,来绘制一份立体图形。

    在CAD设计,为了效果的显著性,经常会用到关于CAD立体图形的绘制,立体图形要知道,是运用三维看图才能显示出来的,现在的CAD绘图软件也都有了关于CAD立体三维图形绘制的功能,那具体是怎么运用的呢?接 ...

  7. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  8. java 圆类 圆锥类_以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone

    学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone 代码示例: import java.util.Scanner; class Point4{ private dou ...

  9. 利用PCL库做简单的三维立体图形

    利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...

最新文章

  1. (每日一题)P3768 简单的数学题(确信)(莫反 + 欧拉反演 + 杜教筛 )
  2. 搭建kafaka_kafka单机环境搭建及其基本使用
  3. flutter调用api_如何在Flutter(REST API)中进行API调用
  4. python123阶乘累加_使用多线程计算阶乘累加 1!+2!+3!+...+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果。...
  5. 无限弹窗(python)
  6. Java开源框架集(全)
  7. [软件更新]CuteFTP 8.3.3.0054
  8. 谁说文艺青年开花店必亏,我用3年时间挣了20万
  9. Ps 初学者教程:如何对多张照片进行美化处理?
  10. 南京理工大学计算机研究生复试面试
  11. 软件评测师题库--操作系统基础知识
  12. [转]电烙铁的使用小技巧
  13. 第5节 批处理编写及其示例
  14. 超实用!Python机器学习书籍推荐——《Python神经网络编程》(一定要看到最后)
  15. 计算机桌面有个方框,电脑屏幕的白色方框怎么清除
  16. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件
  17. 一句话理解Vue核心内容
  18. python高级用法之命名元组namedtuple
  19. 计算机视觉会议和期刊分类
  20. 互联网废品回收+废品回收小程序开发这些实际功能要有

热门文章

  1. IPv6基础知识总结
  2. 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程
  3. 解决电脑可以上网却连不上局域网服务器问题
  4. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签
  5. vivo手机计算机记录怎么找回,如何从Vivo手机恢复已删除的照片,您将在阅读后知道...
  6. h5+css3简单实现网页端五子棋游戏1.0版
  7. Python类传参报错-TypeError:takes 2 positional arguments but 3 were given
  8. 自定义mvc框架复习(crud)
  9. 会计准则中借方与贷方如何理解分析
  10. win7(32bit)下完整的搭建apache(2.2.x)+openssl(0.9.6-1.0.1升级)过程