Qt Quick 3D - Custom Instanced Rendering
// Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick3D import InstancingExample Window { id: window width: 1280 height: 720 visible: true View3D { id: view anchors.fill: parent environment: SceneEnvironment { clearColor: "#8fafff" backgroundMode: SceneEnvironment.Color } Node { id: cameraNode PerspectiveCamera { property vector3d basePos: Qt.vector3d(0, 0, 750) property vector3d halfZoomPos: Qt.vector3d(0, -300, 400) property vector3d zoomPos: Qt.vector3d(0, -300, 100) property vector3d otherZoomPos: Qt.vector3d(-200, -300, 400) id: camera position: basePos eulerRotation.x: -20 } } property int zoomDuration: 4000 property int rotationDuration: 7000 SequentialAnimation { running: true PauseAnimation { duration: 1000 } NumberAnimation { from: 0; to: 90 target: cameraNode; property: "eulerRotation.y" duration: view.rotationDuration } PauseAnimation { duration: 500 } Vector3dAnimation { from: camera.basePos; to: camera.halfZoomPos target: camera; property: "position" duration: view.zoomDuration } Vector3dAnimation { from: camera.halfZoomPos; to: camera.zoomPos target: camera; property: "position" duration: view.zoomDuration } PauseAnimation { duration: 1000 } Vector3dAnimation { from: camera.zoomPos; to: camera.basePos target: camera; property: "position" duration: view.zoomDuration } PauseAnimation { duration: 500 } NumberAnimation { from: 90; to: 180 target: cameraNode; property: "eulerRotation.y" duration: view.rotationDuration } PauseAnimation { duration: 500 } Vector3dAnimation { from: camera.basePos; to: camera.halfZoomPos target: camera; property: "position" duration: view.zoomDuration } Vector3dAnimation { from: camera.halfZoomPos; to: camera.zoomPos target: camera; property: "position" duration: view.zoomDuration } PauseAnimation { duration: 1000 } Vector3dAnimation { from: camera.zoomPos; to: camera.basePos target: camera; property: "position" duration: view.zoomDuration } PauseAnimation { duration: 500 } NumberAnimation { from: 180; to: 360 target: cameraNode; property: "eulerRotation.y" duration: view.rotationDuration } PauseAnimation { duration: 500 } Vector3dAnimation { from: camera.basePos; to: camera.otherZoomPos target: camera; property: "position" duration: view.zoomDuration } PauseAnimation { duration: 1000 } Vector3dAnimation { from: camera.otherZoomPos; to: camera.basePos target: camera; property: "position" duration: view.zoomDuration } loops: Animation.Infinite } DirectionalLight { eulerRotation.x: 250 eulerRotation.y: -30 brightness: 1.0 ambientColor: "#7f7f7f" } CustomMaterial { id: cubeMaterial property real uTime: frametimer.elapsedTime FrameAnimation { id: frametimer running: true } vertexShader: "cubeMaterial.vert" fragmentShader: "cubeMaterial.frag" } Model { id: instancedCube property real cubeSize: 15 scale: Qt.vector3d(cubeSize/100, cubeSize/100, cubeSize/100) source: "#Cube" instancing: CppInstanceTable { gridSize: 65 gridSpacing: instancedCube.cubeSize randomSeed: 1522562186 } materials: [ cubeMaterial ] } } }