1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.0
import QtQuick 2.4 as QQ2
QardboardRootEntity {
id: root
cameraPosition: cameraController.position
Entity {
id: cameraController
function posAtAngle(a) {
return Qt.vector3d(cameraRadius * Math.cos(a), 0.0, cameraRadius * Math.sin(a))
}
function rotAtAngle(a) {
return a * 180 / Math.PI + 90
}
property real circleRotation: 0
readonly property real cameraRadius: obstaclesRepeater.radius
readonly property vector3d circlePosition: cameraController.posAtAngle(cameraController.circleRotation)
property vector3d position: planeTransform.translation.plus(Qt.vector3d(0, 0, 35))
QQ2.NumberAnimation {
target: cameraController
property: "circleRotation"
from: 0; to: Math.PI * 2
duration: 10000
loops: QQ2.Animation.Infinite
running: true
}
}
// AirPlane
Entity {
components: [
Mesh {
source: "assets/obj/toyplane.obj"
},
Transform {
id: planeTransform
property real rollAngle: 0.0
translation: cameraController.posAtAngle(cameraController.circleRotation)
rotation: fromAxesAndAngles(Qt.vector3d(1.0, 0.0, 0.0), planeTransform.rollAngle,
Qt.vector3d(0.0, -1.0, 0.0), cameraController.rotAtAngle(cameraController.circleRotation))
},
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: 1500
}
QQ2.NumberAnimation {
target: planeTransform
property: "rollAngle"
from: 45; to: -30
duration: 3500
}
}
}
// Cylinder
Entity {
property GeometryRenderer 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]
}
// 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
}
]
}
}
}
|