| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** 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. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example planets-qml |
| \title Qt 3D: Planets QML Example |
| \ingroup qt3d-examples-qml |
| \brief Demonstrates combining Qt 3D rendering and Qt Quick 2 elements. |
| |
| \image planets-qml-example.jpg |
| |
| \e Planets demonstrates how to implement an application that combines the use of |
| Qt 3D rendering with Qt Quick 2D elements. The example shows the eight planets of our Solar |
| System with the Sun. |
| |
| Planet texture maps are Copyright (c) by James Hastings-Trew |
| \l{http://planetpixelemporium.com/planets.html}{http://planetpixelemporium.com/planets.html} |
| used with permission. |
| |
| The planets are rotating around the Sun based on their orbit at a given time. The rotation |
| starts at 2000 Jan 0.0 UT. The planet positions are calculated based on the formulas found here: |
| \l {http://www.stjarnhimlen.se/comp/ppcomp.html}{http://www.stjarnhimlen.se/comp/ppcomp.html} |
| and \l {http://www.davidcolarusso.com/astro/}{http://www.davidcolarusso.com/astro/}. |
| |
| \include examples-run.qdocinc |
| |
| \section1 Qt Quick 2D Implementation |
| |
| The Qt Quick Implementation in \c {planets-qml/PlanetsMain.qml} of the |
| example renders the 3D content using the \c Scene3D type. |
| |
| \snippet planets-qml/PlanetsMain.qml 0 |
| |
| The planet related information is stored into a \c{ListModel}. The selection buttons for the |
| planets and the information sheet are created based on the model. The 2D elements, selection |
| buttons and sliders, are implemented in \c {planets-qml/PlanetsMain.qml}. |
| |
| The selection buttons change the \c{focusedPlanet} property of the \c{mainview}. As the property |
| changes, the planet information is updated, and the camera is animated to the new position. |
| |
| \snippet planets-qml/PlanetsMain.qml 1 |
| |
| The camera position and the camera look at point are updated based on values that are animated |
| in \c {planets-qml/SolarSystem.qml}, triggered from the |
| \c{changePlanetFocus()} function. |
| |
| \snippet planets-qml/SolarSystem.qml 0 |
| |
| The sliders are used to adjust the rotation speed, the planet size, and the viewing distance. |
| When a slider value changes, a JavaScript function in \c {planets-qml/SolarSystem.qml} |
| is called to adjust the given property. For example, changing the value of |
| the \e{Viewing Distance} slider calls the \c{changeCameraDistance()} method. |
| |
| \snippet planets-qml/PlanetsMain.qml 2 |
| |
| \section1 Qt 3D Implementation |
| |
| The main part of the implementation, including the movement and rotation maths for the planets, |
| is done in \c {planets-qml/SolarSystem.qml}. |
| |
| First, a \c Camera, a \c{Light}, and a \c Configuration are added, followed by \c{Effect}s for |
| the planet \c{Material}s, and finally the planets themselves. For example, Earth is constructed |
| as follows: |
| |
| \snippet planets-qml/SolarSystem.qml 1 |
| |
| Planet data, which is needed for the movement and rotation calculations, among other things, is |
| constructed with JavaScript in \c {planets-qml/planets.js} by calling |
| \c{loadPlanetData()} as the component completes. Other initializations, such as inserting the |
| planets into an array for easier handling, calculating the ring radii for Saturn and Uranus |
| rings, and setting the default scale, speed, and camera offset, are done as well: |
| |
| \snippet planets-qml/SolarSystem.qml 2 |
| |
| The scene is animated by calling the \c{animate()} function. That is also the place where the |
| time is advanced, and the new positions for all of the planets are calculated. The planets are |
| rotated in the \c{positionPlanet()} function based on their axial tilt and their sidereal |
| rotation period. Finally, the new camera position is calculated in the \c{updateCamera()} |
| function. |
| |
| \snippet planets-qml/SolarSystem.qml 3 |
| */ |