Qt组件推荐:

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面

Qt 3D:行星 QML 示例

下载Qt6最新试用版

演示结合 Qt 3D 渲染和 Qt Quick 2 元素。

本文演示了如何实现将 Qt 3D 渲染与 Qt Quick 2D 元素结合使用的应用程序。该示例显示了太阳系的八颗行星与太阳。

行星纹理贴图由 James Hastings-Trew 版权所有 (c) http://planetpixelemporium.com/planets.html经许可使用。

行星在给定时间根据它们的轨道围绕太阳旋转。轮换从 2000 Jan 0.0 UT 开始。行星位置是根据此处找到的公式计算的:http : //www.stjarnhimlen.se/comp/ppcomp.html和http://www.davidcolarusso.com/astro/。

运行示例

要从Qt Creator运行示例,请打开welcome模式并从Examples选择示例。有关更多信息,请访问构建和运行示例。

Qt 快速二维实现

planets-qml/PlanetsMain.qml示例中的 Qt Quick Implementation使用Scene3D类型呈现 3D 内容。

Scene3D {anchors.fill: parentaspects: ["render", "logic", "input"]SolarSystem { id: solarsystem }
}

行星相关信息存储在一个ListModel. 行星的选择按钮和信息表是基于模型创建的。2D 元素、选择按钮和滑块在planets-qml/PlanetsMain.qml.

选择按钮会更改 的focusedPlanet属性mainview。随着属性的变化,行星信息会更新,并且相机会动画到新的位置。

onFocusedPlanetChanged: {if (focusedPlanet == 100) {info.opacity = 0updatePlanetInfo()} else {updatePlanetInfo()info.opacity = 1}solarsystem.changePlanetFocus(oldPlanet, focusedPlanet)oldPlanet = focusedPlanet
}

相机位置和相机观察点根据 中动画的值更新planets-qml/SolarSystem.qml,由changePlanetFocus()函数触发。

QQ2.NumberAnimation {id: lookAtOffsetAnimationtarget: sceneRootproperties: "xLookAtOffset, yLookAtOffset, zLookAtOffset"to: 0easing.type: Easing.InOutQuintduration: 1250
}QQ2.NumberAnimation {id: cameraOffsetAnimationtarget: sceneRootproperties: "xCameraOffset, yCameraOffset, zCameraOffset"to: 0easing.type: Easing.InOutQuintduration: 2500
}

滑块用于调整旋转速度、行星大小和观看距离。当滑块值发生变化时,planets-qml/SolarSystem.qml会调用一个 JavaScript 函数来调整给定的属性。例如,更改观看距离滑块的值会调用该changeCameraDistance()方法。

onValueChanged: solarsystem.changeCameraDistance(value)

Qt 3D 实现

实现的主要部分,包括行星的运动和旋转数学,在planets-qml/SolarSystem.qml.

首先,添加 a Camera、 aLight和 a Configuration,然后是Effects 代表行星Materials,最后是行星本身。例如,地球的构造如下:

Entity {id: earthEntityPlanet {id: earthtilt: planetData[Planets.EARTH].tilt}PlanetMaterial {id: materialEartheffect: effectDSBambientLight: ambientStrengthPlanetdiffuseMap: "qrc:/images/solarsystemscope/earthmap2k.jpg"specularMap: "qrc:/images/solarsystemscope/earthspec2k.jpg"normalMap: "qrc:/images/solarsystemscope/earthnormal2k.jpg"shininess: shininessSpecularMap}property Transform transformEarth: Transform {matrix: {var m = Qt.matrix4x4()m.translate(Qt.vector3d(earth.x, earth.y, earth.z))m.rotate(earth.tilt, tiltAxis)m.rotate(earth.roll, rollAxis)m.scale(earth.r)return m}}components: [ earth, materialEarth, transformEarth ]
}

移动和旋转计算等所需的行星数据是planets-qml/planets.js通过loadPlanetData()在组件完成时调用的JavaScript 来构建的。其他初始化,例如将行星插入数组以便于处理,计算土星环和天王星环的环半径,以及设置默认比例、速度和相机偏移,也已完成:

QQ2.Component.onCompleted: {planetData = Planets.loadPlanetData()// Push in the correct orderplanets.push(sun)planets.push(mercury)planets.push(venus)planets.push(earth)planets.push(mars)planets.push(jupiter)planets.push(saturn)planets.push(uranus)planets.push(neptune)planets.push(moon)// TODO: Once support for creating meshes from arrays is implemented take these into use//saturnRing.makeRing()//uranusRing.makeRing()saturnRingOuterRadius = planetData[Planets.SATURN].radius + Planets.saturnOuterRadiussaturnRingInnerRadius = planetData[Planets.SATURN].radius + 0.006630uranusRingOuterRadius = planetData[Planets.URANUS].radius + Planets.uranusOuterRadiusuranusRingInnerRadius = planetData[Planets.URANUS].radius + 0.002ready = truechangeScale(1200)changeSpeed(0.2)setLookAtOffset(Planets.SUN)
}

场景通过调用该animate()函数进行动画处理。这也是时间提前的地方,计算所有行星的新位置。行星positionPlanet()根据它们的轴向倾斜和它们的恒星自转周期在函数中旋转。最后,在updateCamera()函数中计算新的相机位置。

function animate(focusedPlanet) {if (!ready)returnadvanceTime(focusedPlanet)for (var i = 0; i <= Planets.NUM_SELECTABLE_PLANETS; i++)positionPlanet(i)updateCamera(focusedPlanet)
}

====================================================

Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入

如何利用Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?相关推荐

  1. Qt 3D 音频播放器 Example

    Qt 3D渲染和Qt Quick 2 实现将Qt 3D渲染与Qt Quick 2D元素结合使用的应用程序.该示例使用媒体播放器播放音乐,并将音乐的进度作为可视化进度条. 运行实例: 要从Qt Crea ...

  2. Qt 3D开发案例:音频可视化器示例(附源码)

    Qt自带集成开发环境(IDE),名为Qt Creator.它可以在Linux.OS X和Windows上运行,并提供智能代码完成.语法高亮.集成帮助系统.调试器和剖析器集成,还集成了所有主要的版本控制 ...

  3. 测试Qt Quick在各个平台上的3D渲染性能

    测试Qt Quick在各个平台上的3D渲染性能 Qt是一个跨平台的GUI框架,它的QtQuick更是支持结合OpenGL原生的代码进行渲染.我想将我以前写的程序整合到QtQuick上来,看看渲染效果是 ...

  4. Qt Quick 3D介绍:Qt Quick的高级3D API

    目录 我们的目标是什么?为什么提出另一个3D解决方案? 统一图形技术 直观易用的API Qt Quick的统一工具 一流的素材优化管道 跨平台性能和兼容性 Qt Quick 3D到底是什么? 您能用Q ...

  5. Qt 3D使用攻略(3)-3D相关的C++类介绍

    目录 1.命名空间 2.Qt 3D Core Module(核心模块) 3.Qt 3D Input Module(输入模块) 4.Qt 3D Logic Module(逻辑模块) 5.Qt 3D Re ...

  6. Qt 3D教程(四)结合Qt Quick来实现动画的效果

    Qt 3D教程(四)结合Qt Quick来实现动画的效果 上篇教程已经给大家带来较为实用的效果了,这回我们尝试载入两个模型,并且让PhongMaterial成为它们的共享材质,此外,我们通过借助Qt ...

  7. Qt 6的Qt 3D会是什么样?

    翻译自What about Qt 3D in Qt 6? 原文作者:Sean Harmer 在Qt 6中,我们希望可以在很多方面对Qt 3D进行改进,本文将着重介绍几个主要方向:渲染器工作缓存和现代图 ...

  8. Qt 3D Overview

    Qt3D建立的目标是能够让开发者快速地创建3D场景,通过各式各样的渲染技术来达到3D交互的场景.Qt3D除了和Qt一样跨平台之外,还能够选择OpenGL的具体实现,定制GLSL,从而能够根据不同性能的 ...

  9. Qt 3D的未来展望

    原文作者:Sean Harmer 翻译:Richard Lin 如您所知,Qt推出了名为Qt Quick 3D的全新模块,它基于QML API为Qt Quick增加了3D绘图能力(预计在Qt 6提供C ...

最新文章

  1. 自定义Sharepoint的登陆页面(2)
  2. java中什么是反转_Java中如何将字符串反转
  3. pytorch 查看gpu cuda版本
  4. 自建邮件服务器更给力?
  5. 苹果面试8大难题及答案
  6. easyui-textbox锁定按钮不锁定_不放水了!湖人G5改穿曼巴球衣,热火输定了,詹姆斯提前锁定FMVP!...
  7. mysql增量备份实例_MySQL增量备份与恢复实例
  8. 用JS实现一个随机点名系统(五)
  9. hdu1181(变形课)
  10. 基于JDBC的数据库连接池高效管理策略
  11. SC;FC;LC;光纤接口介绍
  12. 2022新和平精英画质助手iApp源码+附成品/可用的
  13. 使用爱剪辑等软件制作视频的全套入门教程
  14. 重庆北大青鸟【学员心声】任何一次的考试,都是一次珍贵的蜕变机会
  15. Java5种算术运算符,Java算术运算符
  16. 哪些英语用法是普通中国学生最生疏的?
  17. 戴尔t620服务器怎么进bios设置u盘启动(戴尔进入u盘启动设置)
  18. Windows操作系统免费下载地址(itellyou)
  19. 【python】把Excel中的数据在页面中可视化
  20. 模拟器和平精英连接服务器没有响应,和平精英模拟器卡顿解决方法一览

热门文章

  1. 【前端安全系列】【万字详解】如何防止XSS攻击?
  2. [转载] 华中科技大学学生违纪处分条例
  3. 全局择优搜索、A*算法、宽度优先算法解决八数码问题
  4. 发现网站被劫持该怎么办?网站域名劫持如何有效预防
  5. Docker测试环境笔记
  6. win7系统下联想thinkpad x220笔记本电脑关闭触摸板
  7. 一比二购增加您指定商品降价时,给您发送邮件通知的功能
  8. HUAWEIWATCH GT3有哪些功能?华为新款手表测评
  9. Mac安装photoshopcs6
  10. Cygwin+NS2的安装过程及问题解决