写在前面:最近在学习三维Opengl相关技术,做了一个太阳系三维场景的简单动画,先看一下效果图:

演示视屏:https://www.bilibili.com/video/BV1HK4y1D7pM

界面采用Qt进行搭建,主要的渲染绘制过程如下:

1.球体的绘制函数:

glPushMatrix();if (m_enableOrbit){glDisable(GL_LIGHTING);glColor3d(0.5, 0.5, 0.5);glBegin(GL_LINE_LOOP);int n = 50;for (int i = 0; i < n; ++i)glVertex3f(rotateRadius*cos(2 * 3.1415926 / n * i), 0.0f, rotateRadius*sin(2 * 3.1415926 / n * i));glEnd();glEnable(GL_LIGHTING);}glRotatef(revolution * speed, 0, 1, 0);glTranslatef(0, 0, rotateRadius);glRotatef(rotation * speed * 5.0, 0, 1, 0);glRotatef(90, 1, 0, 0);glScalef(scale, scale, scale);glColor3f(1.0, 1.0, 1.0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, tex_id);gluSphere(sphere, 1, 40, 40);glBindTexture(GL_TEXTURE_2D, 0);glDisable(GL_TEXTURE_2D);glPopMatrix();

2.环境的渲染:

clock_t current_t = GetTick();float delta_t = (current_t - m_time) * 0.001 * m_pMainOpenGLWidgetPrivate->m_speed;if (m_pMainOpenGLWidgetPrivate->m_enableRevolution)revolution += delta_t;m_rotation += delta_t;m_time = current_t;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-m_pMainOpenGLWidgetPrivate->m_translateZ * aspect, m_pMainOpenGLWidgetPrivate->m_translateZ * aspect, -m_pMainOpenGLWidgetPrivate->m_translateZ, m_pMainOpenGLWidgetPrivate->m_translateZ, -100, 100);glMatrixMode(GL_MODELVIEW);glLoadIdentity();m_pMainOpenGLWidgetPrivate->drawBackground();glTranslated(m_pMainOpenGLWidgetPrivate->m_translateX, m_pMainOpenGLWidgetPrivate->m_translateY, m_pMainOpenGLWidgetPrivate->m_translateZ - 40);glRotated(m_rotateX + 25, 1.0, 0.0, 0.0);glRotated(m_rotateZ, 0.0, 0.0, 1.0);//lightfloat sunlight_pos[4] = { 0.0, 0.0, 0.0, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, sunlight_pos);float artfical_light_pos[4] = { 1.0, 1.0, 1.0, 0.0 };glLightfv(GL_LIGHT1, GL_POSITION, artfical_light_pos);float while_color[4] = { 1.0f * m_pMainOpenGLWidgetPrivate->m_lightBrightness, 1.0f * m_pMainOpenGLWidgetPrivate->m_lightBrightness, 1.0f * m_pMainOpenGLWidgetPrivate->m_lightBrightness, 1.0 };float black_color[4] = { 0.0, 0.0, 0.0, 1.0 };glLightfv(GL_LIGHT0, GL_DIFFUSE, while_color);glLightfv(GL_LIGHT0, GL_SPECULAR, while_color);glLightfv(GL_LIGHT0, GL_AMBIENT, black_color);glLightfv(GL_LIGHT1, GL_DIFFUSE, while_color);glLightfv(GL_LIGHT1, GL_SPECULAR, while_color);glLightfv(GL_LIGHT1, GL_AMBIENT, black_color);m_pMainOpenGLWidgetPrivate->m_enableSunLight? glEnable(GL_LIGHT0): glDisable(GL_LIGHT0);glEnable(GL_LIGHT1);float base_color[4] = { 1.0f, 1.0f, 1.0f, 1 };glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, base_color);float specular_color[4] = { 1.0f, 1.0f, 1.0f, 1 };glMaterialfv(GL_FRONT, GL_SPECULAR, specular_color);glMaterialf(GL_FRONT, GL_SHININESS, 50);glMatrixMode(GL_MODELVIEW);glPushMatrix();glScalef(3.0, 3.0, 3.0);glColor3f(1.0, 1.0, 1.0);glRotatef(m_rotation, 0, 1, 0);glRotatef(90, 1, 0, 0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, m_pMainOpenGLWidgetPrivate->m_textures_ids[0]);gluSphere(m_sphere, 1, 40, 40);glBindTexture(GL_TEXTURE_2D, 0);glDisable(GL_TEXTURE_2D);glPopMatrix();float color[4] = { 0.5f, 0.5f, 0.5f, 1 };glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);float specular_color2[4] = { 0.8f, 0.8f, 0.8, 1 };glMaterialfv(GL_FRONT, GL_SPECULAR, specular_color2);glMaterialf(GL_FRONT, GL_SHININESS, 30);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[1], 0.2, 6, 3,revolution,m_rotation,m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[2], 0.6, 9, 2, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[3], 0.7, 11, 1, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[4], 0.5, 16, 0.8, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[5], 1.5, 19, 0.7, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[6], 1.2, 21, 0.5, revolution, m_rotation, m_sphere);float saturnScale = 1.2; float rotateRadius = 21; float saturnm_speed = 0.5;glEnable(GL_ALPHA_TEST);glAlphaFunc(GL_GREATER, 0.5f);glPushMatrix();glRotatef(revolution * saturnm_speed, 0, 1, 0);glTranslatef(0, 0, rotateRadius);glRotatef(m_rotation * saturnm_speed * 5.0, 0, 1, 0);saturnScale *= 2;glScalef(saturnScale, saturnScale, saturnScale);glColor3f(1.0, 1.0, 1.0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, m_pMainOpenGLWidgetPrivate->m_textures_ids[10]);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0, 0.0, -1.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0, 0.0, 1.0);glTexCoord2f(1.0, 1.0);glVertex3f(1.0, 0.0, 1.0);glTexCoord2f(1.0, 0.0);glVertex3f(1.0, 0.0, -1.0);glEnd();glBindTexture(GL_TEXTURE_2D, 0);glDisable(GL_TEXTURE_2D);glPopMatrix();glDisable(GL_ALPHA_TEST);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[7], 1.1, 24, 0.4, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawPlanet(m_pMainOpenGLWidgetPrivate->m_textures_ids[8], 0.9, 28, 1, revolution, m_rotation, m_sphere);m_pMainOpenGLWidgetPrivate->drawSatellites(revolution,m_rotation,m_sphere);glPushMatrix();glScaled(5.0, 5.0, 5.0);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, m_pMainOpenGLWidgetPrivate->m_textures_ids[12]);glPushMatrix();glTranslated(1.0, 0.0, 0.0);glBegin(GL_POLYGON);glNormal3f(0.0, 1.0, 0.0);glTexCoord2d(0.0, 0.0);glVertex3f(0.0, 0.0, -1.0);glTexCoord2d(1.0, 0.0);glVertex3f(1.0, 0.0, -1.0);glTexCoord2d(1.0, 1.0);glVertex3f(1.0, 0.0, 1.0);glTexCoord2d(0.0, 1.0);glVertex3f(0.0, 0.0, 1.0);glEnd();glPopMatrix();glPushMatrix();glRotated(180, 0.0, 1.0, 0.0);glTranslated(1.0, 0.0, 0.0);glBegin(GL_POLYGON);glNormal3f(0.0, 1.0, 0.0);glTexCoord2d(0.0, 0.0);glVertex3f(0.0, 0.0, -1.0);glTexCoord2d(1.0, 0.0);glVertex3f(1.0, 0.0, -1.0);glTexCoord2d(1.0, 1.0);glVertex3f(1.0, 0.0, 1.0);glTexCoord2d(0.0, 1.0);glVertex3f(0.0, 0.0, 1.0);glEnd();glPopMatrix();glBindTexture(GL_TEXTURE_2D, 0);glDisable(GL_TEXTURE_2D);gluSphere(m_sphere, 1, 40, 40);glPopMatrix();

所有的鼠标事件操作使用了Qt的信号槽进行处理:

void MainWindow::initConnect(void)
{connect(ui.orbitCheckBox, &QCheckBox::stateChanged, this, &MainWindow::on_orbitCheckBoxstateChanged);connect(ui.lightCheckBox, &QCheckBox::stateChanged, this, &MainWindow::on_lightCheckBoxChanged);connect(ui.startPushButton, &QPushButton::clicked, this, &MainWindow::on_startPushButtonClicked);connect(ui.spinBox, SIGNAL(valueChanged(int)), this, SLOT(on_spinBoxValueChanged(int)));connect(ui.horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderValueChanged(int)));connect(ui.verticalSlider, SIGNAL(valueChanged(int)), this, SLOT(on_verticalSliderValueChanged(int)));connect(ui.horizontalSliderLightness, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderLightnessValueChanged(int)));connect(ui.horizontalSliderZoom, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderZoomValueChanged(int)));
}void MainWindow::disConnect(void)
{disconnect(ui.orbitCheckBox, &QCheckBox::stateChanged, this, &MainWindow::on_orbitCheckBoxstateChanged);disconnect(ui.lightCheckBox, &QCheckBox::stateChanged, this, &MainWindow::on_lightCheckBoxChanged);disconnect(ui.startPushButton, &QPushButton::clicked, this, &MainWindow::on_startPushButtonClicked);disconnect(ui.spinBox, SIGNAL(valueChanged(int)), this, SLOT(on_spinBoxValueChanged(int)));disconnect(ui.horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderValueChanged(int)));disconnect(ui.verticalSlider, SIGNAL(valueChanged(int)), this, SLOT(on_verticalSliderValueChanged(int)));disconnect(ui.horizontalSliderLightness, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderLightnessValueChanged(int)));disconnect(ui.horizontalSliderZoom, SIGNAL(valueChanged(int)), this, SLOT(on_horizontalSliderZoomValueChanged(int)));
}

可执行工程下载:https://download.csdn.net/download/weixin_39951988/15490556

工程源码下载:https://download.csdn.net/download/weixin_39951988/15490585

opengGL实战——太阳系三维场景动画搭建相关推荐

  1. 【3D商城】三维场景搭建与开发流程

    [3D商城]三维场景搭建与开发流程 创建一个场景组件 安装 threejs 创建Base3d.js 初始化场景 初始化相机 初始化渲染器 添加环境的纹理 创建一个场景组件 在views中创建一个场景组 ...

  2. Blender三维建筑场景动画制作学习教程

    一起在Blender中创建一个三维低多边形场景动画 你会学到什么 这门课程是为那些喜欢在工作流程中成长的艺术家设计的 初学者 想学会让自己的资产活起来的艺术家. 希望扩展其技能集的游戏开发人员. MP ...

  3. 自动驾驶系统进阶与项目实战(四)自动驾驶高精度地图构建中的三维场景识别和闭环检测

    自动驾驶系统进阶与项目实战(四)自动驾驶高精度地图构建中的三维场景识别和闭环检测 闭环检测(loop-closure detection)是SLAM中非常关键的一部分,当然也是自动驾驶高精度地图(HD ...

  4. 在ArcGIS中快速搭建三维场景教程(从数据获取到软件制作)

    Enterprise本地Web效果 一. 背景及目标 (1)背景:最近看到许多通过下载的GIS数据结合rhino等设计软件生成三维模型的教程,个人感觉其实这些设计软件用来快速生成三维模型,特别是对接的 ...

  5. OPENGL三维场景搭建、漫游、交互

    OPENGL三维场景搭建.漫游.交互 标签(空格分隔): OPENGL 这是博主的一次实验,实验截止日期还没有到.等deadline过后,博主附上源码. 源码地址:更新:OPENGL三维场景搭建.漫游 ...

  6. 三维场景中常用的路径动画

    三维场景中常用的路径动画 前言 在三维场景中,除了用逼近真实的模型代表现实中的设备.标识物外,通常还会使用一些动画来表示模型在现实中一些行为和作用.常见的动画比如路径动画.旋转动画.发光动画.流动动画 ...

  7. 三维场景中创建镜面反射效果(three.js实战9)

    创建镜面效果 1. demo效果 2. 实现要点 2.1 创建三维模型 2.2 创建镜面 2.3 场景动画更新 3. demo代码 1. demo效果 2. 实现要点 2.1 创建三维模型 demo中 ...

  8. Mix3D:大规模三维场景的数据增强(3DV2021)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨图灵智库 来源丨 泡泡机器人SLAM 标题: Mix3D: Out-of-Context Dat ...

  9. geojson地图_ThingJS的三维城市地图搭建逻辑解析

    一个城市越智慧,综合竞争力越强,面向用户的可视化更是必不可少,ThingJS的三维城市地图搭建工具应运而生. Citybuilder是ThingJS旗下三维地图城市搭建工具,使用Citybuilder ...

  10. 北京奥林匹克公园三维场景网络发布应用

    针对大数据量场景的实时显示要求,前面章节研究了自动生成三维模型简化版本,优化场景中模型数据布局与改进渲染算法等内容,本章将以前面章节研究结果为依托,结合北京奥林匹克公园建设规划的具体情况,提出建立虚拟 ...

最新文章

  1. 【微信小程序之画布】三:手指触摸绘画椭圆
  2. R语言使用colnames函数改变dataframe列名称实战
  3. XamarinEssentials教程首选项Preferences判断项目是否存在
  4. Microsoft .NET:Microsoft .NET之.net4.5.1简介、安装、使用方法之详细攻略
  5. 分布式系统——网络监视系统zabbix3.4.2,以及向zabbix中添加被监视主机(一)
  6. 弹性文件服务解密 -- 块存储、文件存储、对象存储的区别
  7. Gradle Issue: OutOfMemoryError: PermGen space
  8. python matplotlib 播放图片变化过程
  9. DataFrame的行列操作
  10. html评分图标,Bootstrap图标实现移动端的星星评分功能
  11. python从外部传入参数_Python学习杂记_8_从程序外部传参的办法sys.argv
  12. 试卷分析计算机基础,计算机基础试卷分析.doc
  13. 342. 道路与航线
  14. ReactiveCocoa之一
  15. CSS实现文本溢出隐藏
  16. 零基础!!最全计算机三级网络技术备考指南!!
  17. SQL Sever 2000/2005/2008下载地址集合
  18. LoRa PHY CSS解调
  19. sourceforge镜像站
  20. 【复盘指南-计算机网络】你真的搞懂传输层了吗

热门文章

  1. 破解Root密码_wuli大世界_新浪博客
  2. There are unfinished transactions remaining解决办法
  3. 触摸屏在环卫车辆上装控制系统的应用
  4. python抓取淘宝评论_python3抓取淘宝评论内容
  5. 计算机毕业设计Java优乐帮育儿系统(系统+程序+mysql数据库+Lw文档)
  6. camera tuning名词缩写
  7. Ubuntu下pycharm设定任务栏图标后打开出现问号图标
  8. 论文写作学习个人总结
  9. 支付宝内部功能调用APP的said说明
  10. Unipus-writing exercise Expository_Text_09