Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > c936229ef0138f42857f36beadbeda30 > files > 532

qt3d5-doc-5.12.2-2.mga7.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>SolarSystem.qml Example File | Qt 3D 5.12.2</title>
  <link rel="stylesheet" type="text/css" href="style/offline-simple.css" />
  <script type="text/javascript">
    document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css");
    // loading style sheet breaks anchors that were jumped to before
    // so force jumping to anchor again
    setTimeout(function() {
        var anchor = location.hash;
        // need to jump to different anchor first (e.g. none)
        location.hash = "#";
        setTimeout(function() {
            location.hash = anchor;
        }, 0);
    }, 0);
  </script>
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="main">
    <div class="main-rounded">
      <div class="navigationbar">
        <table><tr>
<td >Qt 5.12</td><td ><a href="qt3d-index.html">Qt 3D</a></td><td ><a href="qt3d-planets-qml-example.html">Qt 3D: Planets QML Example</a></td><td >SolarSystem.qml Example File</td></tr></table><table class="buildversion"><tr>
<td id="buildversion" width="100%" align="right"><a href="qt3d-index.html">Qt 5.12.2 Reference Documentation</a></td>
        </tr></table>
      </div>
    </div>
<div class="content">
<div class="line">
<div class="content mainContent">
<div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div>
<h1 class="title">SolarSystem.qml Example File</h1>
<span class="subtitle">planets-qml/SolarSystem.qml</span>
<!-- $$$planets-qml/SolarSystem.qml-description -->
<div class="descr"> <a name="details"></a>
<pre class="qml">

  /****************************************************************************
  **
  ** 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: 2500000.0
          farPlane: 20000000.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"
      }

      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"
      }

      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"
      }

      SunEffect {
          id: sunEffect
      }

      ShadowEffect {
          id: shadowMapEffect
          shadowTexture: framegraph.shadowTexture
          light: light
      }

      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 + 6.630
          uranusRingOuterRadius = planetData[Planets.URANUS].radius + Planets.uranusOuterRadius
          uranusRingInnerRadius = planetData[Planets.URANUS].radius + 2
          ready = true
          changeScale(1200)
          changeSpeed(0.2)
          setLookAtOffset(Planets.SUN)
      }

      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
      }

      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(focusedMinimumScale, 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 / 100
          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
      }

      function animate(focusedPlanet) {
          if (!ready)
              return

          advanceTime(focusedPlanet)
          for (var i = 0; i <= Planets.NUM_SELECTABLE_PLANETS; i++)
              positionPlanet(i)

          updateCamera(focusedPlanet)
      }

      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: 8500000
              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

      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 ]
      }

      // 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 ]
      }
  }

</pre>
</div>
<!-- @@@planets-qml/SolarSystem.qml -->
        </div>
       </div>
   </div>
   </div>
</div>
<div class="footer">
   <p>
   <acronym title="Copyright">&copy;</acronym> 2019 The Qt Company Ltd.
   Documentation contributions included herein are the copyrights of
   their respective owners.<br/>    The documentation provided herein is licensed under the terms of the    <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation    License version 1.3</a> as published by the Free Software Foundation.<br/>    Qt and respective logos are trademarks of The Qt Company Ltd.     in Finland and/or other countries worldwide. All other trademarks are property
   of their respective owners. </p>
</div>
</body>
</html>