blob: 89e5c3664fc1ad94daf371a678b9a696faf1eabb [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB).
** 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.4 as QQ2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.0
Entity {
id: root
components: RenderSettings {
StereoFrameGraph {
id: stereoFrameGraph
leftCamera: stereoCamera.leftCamera
rightCamera: stereoCamera.rightCamera
}
}
// Camera
StereoCamera {
id: stereoCamera
property real circleRotation: 0
readonly property real cameraRadius: obstaclesRepeater.radius - 50
readonly property vector3d circlePosition: Qt.vector3d(cameraRadius * Math.cos(circleRotation), 0.0, cameraRadius * Math.sin(circleRotation))
readonly property vector3d tan: circlePosition.crossProduct(Qt.vector3d(0, 1, 0).normalized())
viewCenter: planeTransform.translation
position: circlePosition.plus(Qt.vector3d(0, 45 * Math.sin(circleRotation * 2), 0)).plus(tan.times(-2))
QQ2.NumberAnimation {
target: stereoCamera
property: "circleRotation"
from: 0; to: Math.PI * 2
duration: 10000
loops: QQ2.Animation.Infinite
running: true
}
}
// Skybox
SkyboxEntity {
baseName: "qrc:/assets/cubemaps/miramar/miramar"
extension: ".webp"
}
// Cylinder
Entity {
property CylinderMesh cylinder: CylinderMesh {
radius: 1
length: 3
rings: 100
slices: 20
}
property Transform transform: Transform {
id: cylinderTransform
property real theta: 0.0
property real phi: 0.0
rotation: fromEulerAngles(theta, phi, 0)
}
property Material phong: PhongMaterial {}
QQ2.ParallelAnimation {
loops: QQ2.Animation.Infinite
running: true
QQ2.SequentialAnimation {
QQ2.NumberAnimation {
target: cylinderTransform
property: "scale"
from: 5; to: 45
duration: 2000
easing.type: QQ2.Easing.OutInQuad
}
QQ2.NumberAnimation {
target: cylinderTransform
property: "scale"
from: 45; to: 5
duration: 2000
easing.type: QQ2.Easing.InOutQuart
}
}
QQ2.NumberAnimation {
target: cylinderTransform
property: "phi"
from: 0; to: 360
duration: 4000
}
QQ2.NumberAnimation {
target: cylinderTransform
property: "theta"
from: 0; to: 720
duration: 4000
}
}
components: [cylinder, transform, phong]
}
// AirPlane
Entity {
components: [
Mesh {
source: "assets/obj/toyplane.obj"
},
Transform {
id: planeTransform
property real rollAngle: 0.0
translation: Qt.vector3d(Math.sin(stereoCamera.circleRotation * -2) * obstaclesRepeater.radius,
0.0,
Math.cos(stereoCamera.circleRotation * -2) * obstaclesRepeater.radius)
rotation: fromAxesAndAngles(Qt.vector3d(1.0, 0.0, 0.0), planeTransform.rollAngle,
Qt.vector3d(0.0, 1.0, 0.0), stereoCamera.circleRotation * -2 * 180 / Math.PI + 180)
},
PhongMaterial {
shininess: 20.0
diffuse: "#ba1a02" // Inferno Orange
}
]
QQ2.SequentialAnimation {
running: true
loops: QQ2.Animation.Infinite
QQ2.NumberAnimation {
target: planeTransform
property: "rollAngle"
from: 30; to: 45
duration: 750
}
QQ2.NumberAnimation {
target: planeTransform
property: "rollAngle"
from: 45; to: 25
duration: 500
}
QQ2.NumberAnimation {
target: planeTransform
property: "rollAngle"
from: 25; to: 390
duration: 800
}
}
}
// Torus obsctacles
NodeInstantiator {
id: obstaclesRepeater
model: 4
readonly property real radius: 130.0;
readonly property real det: 1.0 / model
delegate: Entity {
components: [
TorusMesh {
radius: 35
minorRadius: 5
rings: 100
slices: 20
},
Transform {
id: transform
readonly property real angle: Math.PI * 2.0 * index * obstaclesRepeater.det
translation: Qt.vector3d(obstaclesRepeater.radius * Math.cos(transform.angle),
0.0,
obstaclesRepeater.radius * Math.sin(transform.angle))
rotation: fromAxisAndAngle(Qt.vector3d(0.0, 1.0, 0.0), transform.angle * 180 / Math.PI)
},
PhongMaterial {
diffuse: Qt.rgba(Math.abs(Math.cos(transform.angle)), 204 / 255, 75 / 255, 1)
specular: "white"
shininess: 20.0
}
]
}
}
}