diff options
Diffstat (limited to 'tests/manual/qardboard/main.qml')
-rw-r--r-- | tests/manual/qardboard/main.qml | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/tests/manual/qardboard/main.qml b/tests/manual/qardboard/main.qml new file mode 100644 index 000000000..63d2582b1 --- /dev/null +++ b/tests/manual/qardboard/main.qml @@ -0,0 +1,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 + } + ] + } + } +} |