Qt Quick 3D - Principled 材质范例
// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick3D import QtQuick3D.Effects import QtQuick3D.Helpers import QtQuick.Controls import QtQuick.Layouts Window { id: window width: 1280 height: 720 visible: true title: "Principled Materials Example" //color: "black" color: "#848895" Image { anchors.fill: parent source: "maps/grid.png" fillMode: Image.Tile horizontalAlignment: Image.AlignLeft verticalAlignment: Image.AlignTop } SplitView { id: splitView anchors.fill: parent Page { id: toolPage SplitView.fillHeight: true SplitView.preferredWidth: 420 SplitView.minimumWidth: 300 header: TabBar { id: tabBar TabButton { text: "Basics" } TabButton { text: "Alpha" } TabButton { text: "Details" } TabButton { text: "Clearcoat" } TabButton { text: "Refraction" } TabButton { text: "Special" } } StackLayout { id: toolPageSwipeView anchors.fill: parent anchors.margins: 10 currentIndex: tabBar.currentIndex BasicsPane { id: basicsPane principledMaterial: basicMaterial specularGlossyMaterial: specularGlossyMaterial } AlphaPane { targetMaterial: viewport.specularGlossyMode ? specularGlossyMaterial : basicMaterial specularGlossyMode: viewport.specularGlossyMode } DetailsPane { targetMaterial: viewport.specularGlossyMode ? specularGlossyMaterial : basicMaterial view3D: viewport } ClearcoatPane { targetMaterial: viewport.specularGlossyMode ? specularGlossyMaterial : basicMaterial } RefractionPane { targetMaterial: viewport.specularGlossyMode ? specularGlossyMaterial : basicMaterial specularGlossyMode: viewport.specularGlossyMode } SpecialPane { targetMaterial: viewport.specularGlossyMode ? specularGlossyMaterial : basicMaterial linesModel: linesLogo pointsModel: pointsLogo specularGlossyMode: viewport.specularGlossyMode } } } View3D { id: viewport SplitView.fillHeight: true SplitView.fillWidth: true SplitView.minimumWidth: splitView.width * 0.5 environment: SceneEnvironment { property bool enableEffects: false antialiasingMode: SceneEnvironment.MSAA antialiasingQuality: SceneEnvironment.High lightProbe: Texture { source: "maps/OpenfootageNET_garage-1024.hdr" } effects: enableEffects ? [bloom, scurveTonemap] : [] backgroundMode: SceneEnvironment.SkyBox SCurveTonemap { id: scurveTonemap } HDRBloomTonemap { id: bloom } } Node { id: originNode PerspectiveCamera { id: cameraNode z: 600 clipNear: 1 clipFar: 10000 } } property bool specularGlossyMode: basicsPane.specularGlossyMode PrincipledMaterial { id: basicMaterial baseColor: "red" } SpecularGlossyMaterial { id: specularGlossyMaterial property alias baseColor: specularGlossyMaterial.albedoColor property real specularAmount: 1.0 property real specularTint: 1.0 specularColor: Qt.rgba(0.22, 0.22, 0.22, 1.0) albedoColor: "red" } Model { id: cube source: "#Cube" materials: viewport.specularGlossyMode ? [ specularGlossyMaterial ] : [ basicMaterial ] pickable: true } Model { id: sphereModel x: -200 scale: Qt.vector3d(1.5, 1.5, 1.5) source: "#Sphere" materials: viewport.specularGlossyMode ? [ specularGlossyMaterial ] : [ basicMaterial ] pickable: true } Model { id: monkeyMesh x: 250 source: "meshes/suzanne.mesh" materials: viewport.specularGlossyMode ? [ specularGlossyMaterial ] : [ basicMaterial ] pickable: true } Model { id: linesLogo y: 200 x: -100 source: "meshes/logo_lines.mesh" materials: viewport.specularGlossyMode ? [ specularGlossyMaterial ] : [ basicMaterial ] pickable: true visible: false } Model { id: pointsLogo y: 200 x: 100 source: "meshes/logo_points.mesh" materials: viewport.specularGlossyMode ? [ specularGlossyMaterial ] : [ basicMaterial ] pickable: true visible: false } ResourceLoader { meshSources: [ "meshes/logo_lines.mesh", "meshes/logo_points.mesh" ] } BackgroundCurtain { visible: curtainToggleButton.checked y: -150 } OrbitCameraController { origin: originNode camera: cameraNode } MouseArea { id: pickController anchors.fill: parent onClicked: function(mouse) { let pickResult = viewport.pick(mouse.x, mouse.y); if (pickResult.objectHit) { let pickedObject = pickResult.objectHit; // Move the camera orbit origin to be the clicked object originNode.position = pickedObject.position } } } Button { id: curtainToggleButton text: checked ? "Hide Curtain" : "Show Curtain" checkable: true checked: true anchors.top: parent.top anchors.right: parent.right } RowLayout { anchors.bottom: parent.bottom Label { text: "Drag Background to Orbit Camera, Touch/Click a Model to Center Camera" color: "#dddddd" } } } } }