/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 as QQ2 import Qt3D.Core 2.0 import Qt3D.Render 2.0 import Qt3D.Input 2.0 import Qt3D.Logic 2.0 import Qt3D.Extras 2.0 import "planets.js" as Planets Entity { id: sceneRoot property bool ready: false property real cameraNear: 0 property real xLookAtOffset: 0 property real yLookAtOffset: 0 property real zLookAtOffset: 0 property real xCameraOffset: 0 property real yCameraOffset: 0 property real zCameraOffset: 0 property var planetData property var planets: [] property vector3d defaultUp: Qt.vector3d(0, 1, 0) property vector3d defaultCameraPosition: Qt.vector3d(Planets.solarDistance, Planets.solarDistance, Planets.solarDistance) property vector3d tiltAxis: Qt.vector3d(0, 0, 1) property vector3d rollAxis: Qt.vector3d(0, 1, 0) property real cameraDistance: 1 property vector3d oldCameraPosition property vector3d oldFocusedPlanetPosition property color ambientStrengthStarfield: "#000000" property color ambientStrengthSun: "#ffffff" property color ambientStrengthClouds: "#000000" property color ambientStrengthRing: "#111111" property color ambientStrengthPlanet: "#222222" property real shininessSpecularMap: 50.0 property real shininessClouds: 10.0 property real shininessBasic: 1.0 property real saturnRingInnerRadius property real saturnRingOuterRadius property real uranusRingInnerRadius property real uranusRingOuterRadius // Time variables property int year: 2000 property int month: 1 property int day: 1 // Time scale formula based on http://www.stjarnhimlen.se/comp/ppcomp.html property real startD: 367 * year - 7 * (year + (month + 9) / 12) / 4 + 275 * month / 9 + day - 730530 property real oldTimeD: startD property real currTimeD: startD property real deltaTimeD: 0 property real daysPerFrame property real daysPerFrameScale property real planetScale property bool focusedScaling: false property int focusedMinimumScale: 20 property real actualScale // Animate solar system with LogicComponent FrameAction { onTriggered: { frames++ animate(focusedPlanet) } } PlanetsLight { id: light ratio: width / height } Camera { id: camera projectionType: CameraLens.PerspectiveProjection fieldOfView: 45 aspectRatio: width / height nearPlane: 2500.0 farPlane: 20000.0 position: defaultCameraPosition upVector: defaultUp viewCenter: Qt.vector3d( xLookAtOffset, yLookAtOffset, zLookAtOffset ) } FirstPersonCameraController { camera: camera } components: [ PlanetFrameGraph { id: framegraph viewCamera: camera lightCamera: light.lightCamera }, InputSettings {} ] PlanetEffect { id: effectD light: light } PlanetEffect { id: effectDB light: light vertexES: "qrc:/shaders/es2/planetDB.vert" fragmentES: "qrc:/shaders/es2/planetDB.frag" vertexGL: "qrc:/shaders/gl3/planetDB.vert" fragmentGL: "qrc:/shaders/gl3/planetDB.frag" vertexRHI: "qrc:/shaders/rhi/planetDB.vert" fragmentRHI: "qrc:/shaders/rhi/planetDB.frag" } PlanetEffect { id: effectDSB light: light vertexES: "qrc:/shaders/es2/planetDB.vert" fragmentES: "qrc:/shaders/es2/planetDSB.frag" vertexGL: "qrc:/shaders/gl3/planetDB.vert" fragmentGL: "qrc:/shaders/gl3/planetDSB.frag" vertexRHI: "qrc:/shaders/rhi/planetDB.vert" fragmentRHI: "qrc:/shaders/rhi/planetDSB.frag" } PlanetEffect { id: cloudEffect light: light vertexES: "qrc:/shaders/es2/planetD.vert" fragmentES: "qrc:/shaders/es2/planetDS.frag" vertexGL: "qrc:/shaders/gl3/planetD.vert" fragmentGL: "qrc:/shaders/gl3/planetDS.frag" vertexRHI: "qrc:/shaders/rhi/planetD.vert" fragmentRHI: "qrc:/shaders/rhi/planetDS.frag" } SunEffect { id: sunEffect } ShadowEffect { id: shadowMapEffect shadowTexture: framegraph.shadowTexture light: light } //! [2] QQ2.Component.onCompleted: { planetData = Planets.loadPlanetData() // Push in the correct order planets.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.saturnOuterRadius saturnRingInnerRadius = planetData[Planets.SATURN].radius + 0.006630 uranusRingOuterRadius = planetData[Planets.URANUS].radius + Planets.uranusOuterRadius uranusRingInnerRadius = planetData[Planets.URANUS].radius + 0.002 ready = true changeScale(1200) changeSpeed(0.2) setLookAtOffset(Planets.SUN) } //! [2] //! [0] QQ2.NumberAnimation { id: lookAtOffsetAnimation target: sceneRoot properties: "xLookAtOffset, yLookAtOffset, zLookAtOffset" to: 0 // easing.type: Easing.InOutQuint duration: 1250 } QQ2.NumberAnimation { id: cameraOffsetAnimation target: sceneRoot properties: "xCameraOffset, yCameraOffset, zCameraOffset" to: 0 // easing.type: Easing.InOutQuint duration: 2500 } //! [0] QQ2.Behavior on cameraNear { QQ2.PropertyAnimation { // easing.type: Easing.InOutQuint duration: 2500 } } function changePlanetFocus(oldPlanet, focusedPlanet) { setOldPlanet(oldPlanet, focusedPlanet) setLookAtOffset(focusedPlanet) setCameraOffset(oldPlanet, focusedPlanet) lookAtOffsetAnimation.restart() cameraOffsetAnimation.restart() } function setOldPlanet(oldPlanet, focusedPlanet) { oldCameraPosition = camera.position var planet = 0 if (oldPlanet !== Planets.SOLAR_SYSTEM) planet = oldPlanet oldFocusedPlanetPosition = Qt.vector3d(planets[planet].x, planets[planet].y, planets[planet].z) checkScaling(focusedPlanet) } function setScale(value, focused) { // Save actual scale if (!focused) actualScale = value // Limit minimum scaling in focus mode to avoid jitter caused by rounding errors if (value <= focusedMinimumScale && (focusedScaling || focused)) planetScale = focusedMinimumScale else planetScale = actualScale return planetScale } function checkScaling(focusedPlanet) { if (focusedPlanet !== Planets.SOLAR_SYSTEM) { // Limit minimum scaling in focus mode to avoid jitter caused by rounding errors if (actualScale <= focusedMinimumScale) { planetScale = focusedMinimumScale changeScale(focusedMinimumSfocusedPlanetcale, true) } focusedScaling = true } else if (focusedScaling === true) { // Restore normal scaling focusedScaling = false changeScale(actualScale, false) } } function setLookAtOffset(focusedPlanet) { var offset = oldFocusedPlanetPosition var planet = 0 if (focusedPlanet !== Planets.SOLAR_SYSTEM) planet = focusedPlanet var focusedPlanetPosition = Qt.vector3d(planets[planet].x, planets[planet].y, planets[planet].z) offset = offset.minus(focusedPlanetPosition) xLookAtOffset = offset.x yLookAtOffset = offset.y zLookAtOffset = offset.z } function setCameraOffset(oldPlanet, focusedPlanet) { var offset = oldCameraPosition var planet = 0 if (focusedPlanet !== Planets.SOLAR_SYSTEM) planet = focusedPlanet var newCameraPosition = getNewCameraPosition(focusedPlanet, Planets.getOuterRadius(planet)) if (focusedPlanet !== Planets.SUN) offset = offset.minus(newCameraPosition) if (oldPlanet === Planets.SOLAR_SYSTEM && focusedPlanet === Planets.SUN) { xCameraOffset = Math.abs(offset.x) yCameraOffset = Math.abs(offset.y) zCameraOffset = Math.abs(offset.z) } else { // from a planet to another xCameraOffset = offset.x yCameraOffset = offset.y zCameraOffset = offset.z } } function getNewCameraPosition(focusedPlanet, radius) { var position if (focusedPlanet === Planets.SOLAR_SYSTEM) { position = defaultCameraPosition position = position.times(cameraDistance) } else if (focusedPlanet === Planets.SUN) { position = Qt.vector3d(radius * planetScale * 2, radius * planetScale * 2, radius * planetScale * 2) position = position.times(cameraDistance) } else { var vec1 = Qt.vector3d(planets[focusedPlanet].x, planets[focusedPlanet].y, planets[focusedPlanet].z) var vec2 = defaultUp vec1 = vec1.normalized() vec2 = vec2.crossProduct(vec1) vec2 = vec2.times(radius * planetScale * cameraDistance * 4) vec2 = vec2.plus(Qt.vector3d(planets[focusedPlanet].x, planets[focusedPlanet].y, planets[focusedPlanet].z)) vec1 = Qt.vector3d(0, radius * planetScale, 0) vec2 = vec2.plus(vec1) position = vec2 } return position } function advanceTime(focusedPlanet) { if (focusedPlanet === Planets.SOLAR_SYSTEM) daysPerFrame = daysPerFrameScale * 10 else daysPerFrame = daysPerFrameScale * planetData[focusedPlanet].period / 100.0 // Advance the time in days oldTimeD = currTimeD currTimeD = currTimeD + daysPerFrame deltaTimeD = currTimeD - oldTimeD } function positionPlanet(i) { var planet = planetData[i] var target = planets[i] if (i !== Planets.SUN) { // Calculate the planet orbital elements from the current time in days var N = (planet.N1 + planet.N2 * currTimeD) * Math.PI / 180 var iPlanet = (planet.i1 + planet.i2 * currTimeD) * Math.PI / 180 var w = (planet.w1 + planet.w2 * currTimeD) * Math.PI / 180 var a = planet.a1 + planet.a2 * currTimeD var e = planet.e1 + planet.e2 * currTimeD var M = (planet.M1 + planet.M2 * currTimeD) * Math.PI / 180 var E = M + e * Math.sin(M) * (1.0 + e * Math.cos(M)) var xv = a * (Math.cos(E) - e) var yv = a * (Math.sqrt(1.0 - e * e) * Math.sin(E)) var v = Math.atan2(yv, xv) // Calculate the distance (radius) // TODO: Math.hypot() is ES6 and QML JS is only ES5 currently. A patch to QtQml is // required to get Math.hypot() to work. //var r = Math.hypot(xv, yv) var r = Math.sqrt(Math.pow(xv, 2) + Math.pow(yv, 2)) // From http://www.davidcolarusso.com/astro/ // Modified to compensate for the right handed coordinate system of OpenGL var xh = r * (Math.cos(N) * Math.cos(v + w) - Math.sin(N) * Math.sin(v + w) * Math.cos(iPlanet)) var zh = -r * (Math.sin(N) * Math.cos(v + w) + Math.cos(N) * Math.sin(v + w) * Math.cos(iPlanet)) var yh = r * (Math.sin(w + v) * Math.sin(iPlanet)) // Apply the position offset from the center of orbit to the bodies var centerOfOrbit = planet.centerOfOrbit target.x = planets[centerOfOrbit].x + xh * Planets.auScale target.y = planets[centerOfOrbit].y + yh * Planets.auScale target.z = planets[centerOfOrbit].z + zh * Planets.auScale } // Calculate the rotation (roll) of the bodies. Tilt does not change. target.roll += (deltaTimeD / planet.period) * 360 // In degrees } function changeScale(scale, focused) { if (!ready) return var scaling = setScale(scale, focused) sun.r = planetData[Planets.SUN].radius * scaling / 10 mercury.r = planetData[Planets.MERCURY].radius * scaling venus.r = planetData[Planets.VENUS].radius * scaling earth.r = planetData[Planets.EARTH].radius * scaling earthClouds.r = planetData[Planets.EARTH].radius * scaling * 1.02 moon.r = planetData[Planets.MOON].radius * scaling mars.r = planetData[Planets.MARS].radius * scaling jupiter.r = planetData[Planets.JUPITER].radius * scaling saturn.r = planetData[Planets.SATURN].radius * scaling saturnRing.outerRadius = saturnRingOuterRadius * scaling saturnRing.innerRadius = saturnRingInnerRadius * scaling uranus.r = planetData[Planets.URANUS].radius * scaling uranusRing.outerRadius = uranusRingOuterRadius * scaling uranusRing.innerRadius = uranusRingInnerRadius * scaling neptune.r = planetData[Planets.NEPTUNE].radius * scaling } function changeSpeed(speed) { daysPerFrameScale = speed } function changeCameraDistance(distance) { cameraDistance = distance } //! [3] function animate(focusedPlanet) { if (!ready) return advanceTime(focusedPlanet) for (var i = 0; i <= Planets.NUM_SELECTABLE_PLANETS; i++) positionPlanet(i) updateCamera(focusedPlanet) } //! [3] function updateCamera(focusedPlanet) { // Get the appropriate near plane position for the camera and animate it with QML animations var outerRadius = Planets.getOuterRadius(focusedPlanet) cameraNear = outerRadius camera.nearPlane = cameraNear light.near = cameraNear // Calculate position var cameraPosition = getNewCameraPosition(focusedPlanet, outerRadius) var cameraOffset = Qt.vector3d(xCameraOffset, yCameraOffset, zCameraOffset) cameraPosition = cameraPosition.plus(cameraOffset) // Calculate look-at point var lookAtPlanet = Planets.SUN if (focusedPlanet !== Planets.SOLAR_SYSTEM) lookAtPlanet = focusedPlanet var cameraLookAt = Qt.vector3d(planets[lookAtPlanet].x, planets[lookAtPlanet].y, planets[lookAtPlanet].z) var lookAtOffset = Qt.vector3d(xLookAtOffset, yLookAtOffset, zLookAtOffset) cameraLookAt = cameraLookAt.plus(lookAtOffset) // Set position and look-at camera.viewCenter = cameraLookAt camera.position = Qt.vector3d(cameraPosition.x, cameraPosition.y, cameraPosition.z) camera.upVector = defaultUp } // // STARFIELD // Entity { id: starfieldEntity Mesh { id: starfield source: "qrc:/meshes/starfield.obj" } PlanetMaterial { id: materialStarfield effect: effectD ambientLight: ambientStrengthStarfield specularColor: Qt.rgba(0.0, 0.0, 0.0, 1.0) diffuseMap: "qrc:/images/solarsystemscope/galaxy_starfield.jpg" shininess: 1000000.0 } property Transform transformStarfield: Transform { scale: 8500 translation: Qt.vector3d(0, 0, 0) } components: [ starfield, materialStarfield, transformStarfield ] } // // SUN // Entity { id: sunEntity Planet { id: sun tilt: planetData[Planets.SUN].tilt } PlanetMaterial { id: materialSun effect: sunEffect ambientLight: ambientStrengthSun diffuseMap: "qrc:/images/solarsystemscope/sunmap.jpg" } property Transform transformSun: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(sun.x, sun.y, sun.z)) m.rotate(sun.tilt, tiltAxis) m.rotate(sun.roll, rollAxis) m.scale(sun.r) return m } } components: [ sun, materialSun, transformSun ] } // // PLANETS // // MERCURY Entity { id: mercuryEntity Planet { id: mercury tilt: planetData[Planets.MERCURY].tilt } PlanetMaterial { id: materialMercury effect: effectDB ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/mercurymap.jpg" normalMap: "qrc:/images/solarsystemscope/mercurynormal.jpg" shininess: shininessSpecularMap } property Transform transformMercury: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(mercury.x, mercury.y, mercury.z)) m.rotate(mercury.tilt, tiltAxis) m.rotate(mercury.roll, rollAxis) m.scale(mercury.r) return m } } components: [ mercury, materialMercury, transformMercury ] } // VENUS Entity { id: venusEntity Planet { id: venus tilt: planetData[Planets.VENUS].tilt } PlanetMaterial { id: materialVenus effect: effectDB ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/venusmap.jpg" normalMap: "qrc:/images/solarsystemscope/venusnormal.jpg" shininess: shininessSpecularMap } property Transform transformVenus: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(venus.x, venus.y, venus.z)) m.rotate(venus.tilt, tiltAxis) m.rotate(venus.roll, rollAxis) m.scale(venus.r) return m } } components: [ venus, materialVenus, transformVenus ] } // EARTH //! [1] Entity { id: earthEntity Planet { id: earth tilt: planetData[Planets.EARTH].tilt } PlanetMaterial { id: materialEarth effect: effectDSB ambientLight: ambientStrengthPlanet diffuseMap: "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 ] } //! [1] // EARTH CLOUDS Entity { id: earthCloudsEntity Planet { id: earthClouds tilt: planetData[Planets.EARTH].tilt } PlanetMaterial { id: materialEarthClouds effect: cloudEffect ambientLight: ambientStrengthClouds diffuseMap: "qrc:/images/solarsystemscope/earthcloudmapcolortrans.png" specularMap: "qrc:/images/solarsystemscope/earthcloudmapspec.jpg" shininess: shininessClouds opacity: 0.2 } property Transform transformEarthClouds: 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 / 1.2, rollAxis) m.scale(earthClouds.r) return m } } components: [ earthClouds, materialEarthClouds, transformEarthClouds ] } // MOON Entity { id: moonEntity Planet { id: moon tilt: planetData[Planets.MOON].tilt } PlanetMaterial { id: materialMoon effect: effectDB ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/moonmap2k.jpg" normalMap: "qrc:/images/solarsystemscope/moonnormal2k.jpg" shininess: shininessSpecularMap } property Transform transformMoon: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(moon.x, moon.y, moon.z)) m.rotate(moon.tilt, tiltAxis) m.rotate(moon.roll, rollAxis) m.scale(moon.r) return m } } components: [ moon, materialMoon, transformMoon ] } // MARS Entity { id: marsEntity Planet { id: mars tilt: planetData[Planets.MARS].tilt } PlanetMaterial { id: materialMars effect: effectDB ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/marsmap2k.jpg" normalMap: "qrc:/images/solarsystemscope/marsnormal2k.jpg" shininess: shininessSpecularMap } property Transform transformMars: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(mars.x, mars.y, mars.z)) m.rotate(mars.tilt, tiltAxis) m.rotate(mars.roll, rollAxis) m.scale(mars.r) return m } } components: [ mars, materialMars, transformMars ] } // JUPITER Entity { id: jupiterEntity Planet { id: jupiter tilt: planetData[Planets.JUPITER].tilt } PlanetMaterial { id: materialJupiter effect: effectD ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/jupitermap.jpg" shininess: shininessBasic } property Transform transformJupiter: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(jupiter.x, jupiter.y, jupiter.z)) m.rotate(jupiter.tilt, tiltAxis) m.rotate(jupiter.roll, rollAxis) m.scale(jupiter.r) return m } } components: [ jupiter, materialJupiter, transformJupiter ] } // SATURN Entity { id: saturnEntity Planet { id: saturn tilt: planetData[Planets.SATURN].tilt } PlanetMaterial { id: materialSaturn effect: shadowMapEffect ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/saturnmap.jpg" shininess: shininessBasic } property Transform transformSaturn: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(saturn.x, saturn.y, saturn.z)) m.rotate(saturn.tilt, tiltAxis) m.rotate(saturn.roll, rollAxis) m.scale(saturn.r) return m } } components: [ saturn, materialSaturn, transformSaturn ] } // SATURN RING Entity { id: saturnRingEntity Ring { id: saturnRing innerRadius: saturnRingInnerRadius outerRadius: saturnRingOuterRadius } PlanetMaterial { id: materialSaturnRing effect: shadowMapEffect ambientLight: ambientStrengthRing specularColor: Qt.rgba(0.01, 0.01, 0.01, 1.0) diffuseMap: "qrc:/images/solarsystemscope/saturnringcolortrans.png" shininess: shininessBasic opacity: 0.4 } property Transform transformSaturnRing: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(saturn.x, saturn.y, saturn.z)) m.rotate(saturn.tilt, tiltAxis) m.rotate(saturn.roll / 10, rollAxis) m.scale((saturnRing.innerRadius + saturnRing.outerRadius) / 1.75) return m } } components: [ saturnRing, materialSaturnRing, transformSaturnRing ] } // URANUS Entity { id: uranusEntity Planet { id: uranus tilt: planetData[Planets.URANUS].tilt } PlanetMaterial { id: materialUranus effect: shadowMapEffect ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/uranusmap.jpg" shininess: shininessBasic } property Transform transformUranus: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(uranus.x, uranus.y, uranus.z)) m.rotate(uranus.tilt, tiltAxis) m.rotate(uranus.roll, rollAxis) m.scale(uranus.r) return m } } components: [ uranus, materialUranus, transformUranus ] } // URANUS RING Entity { id: uranusRingEntity Ring { id: uranusRing innerRadius: uranusRingInnerRadius outerRadius: uranusRingOuterRadius } PlanetMaterial { id: materialUranusRing effect: shadowMapEffect ambientLight: ambientStrengthRing specularColor: Qt.rgba(0.01, 0.01, 0.01, 1.0) diffuseMap: "qrc:/images/nasa/uranusringcolortrans.png" shininess: shininessBasic opacity: 0.4 } property Transform transformUranusRing: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(uranus.x, uranus.y, uranus.z)) m.rotate(uranus.tilt, tiltAxis) m.rotate(uranus.roll / 10, rollAxis) m.scale((uranusRing.innerRadius + uranusRing.outerRadius) / 1.75) return m } } components: [ uranusRing, materialUranusRing, transformUranusRing ] } // NEPTUNE Entity { id: neptuneEntity Planet { id: neptune tilt: planetData[Planets.NEPTUNE].tilt } PlanetMaterial { id: materialNeptune effect: effectD ambientLight: ambientStrengthPlanet specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) diffuseMap: "qrc:/images/solarsystemscope/neptunemap.jpg" shininess: shininessBasic } property Transform transformNeptune: Transform { matrix: { var m = Qt.matrix4x4() m.translate(Qt.vector3d(neptune.x, neptune.y, neptune.z)) m.rotate(neptune.tilt, tiltAxis) m.rotate(neptune.roll, rollAxis) m.scale(neptune.r) return m } } components: [ neptune, materialNeptune, transformNeptune ] } }