Qt Quick 3D - 变形示例
// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick3D import QtQuick.Controls import QtQuick.Layouts Window { id: window visible: true width: 800 height: 800 title: qsTr("Morphing Example") View3D { id: view anchors.fill: parent environment: SceneEnvironment { clearColor: "gray" backgroundMode: SceneEnvironment.Color } PerspectiveCamera { id: camera position.z: 3.0 position.y: 0.75 eulerRotation.x: -12 clipNear: 1.0 clipFar: 60.0 } DirectionalLight { eulerRotation.x: -30 eulerRotation.y: -70 ambientColor: Qt.rgba(0.3, 0.3, 0.3, 1.0) } MorphTarget { id: morphtarget0 weight: mouthSlider.value attributes: MorphTarget.Position | MorphTarget.Normal } MorphTarget { id: morphtarget1 weight: earSlider.value attributes: MorphTarget.Position | MorphTarget.Normal } MorphTarget { id: morphtarget2 weight: cubeSlider.value attributes: MorphTarget.Position | MorphTarget.Normal } Model { source: "suzanne.mesh" morphTargets: [ morphtarget0, morphtarget1, morphtarget2 ] materials: PrincipledMaterial { baseColor: "#41cd52" roughness: 0.1 } SequentialAnimation on eulerRotation.y { NumberAnimation { from: -45; to: 45; duration: 10000 } NumberAnimation { from: 45; to: -45; duration: 10000 } loops: Animation.Infinite } } } Pane { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top RowLayout { width: parent.width spacing: 10 Label { text: "Mouth:"; } RealSlider { id: mouthSlider from: 0.0 to: 1.0 } Label { text: "Ears and eyebrows:" } RealSlider { id: earSlider from: 0.0 to: 1.0 } Label { text: "Cubify:" } RealSlider { id: cubeSlider from: 0.0 to: 1.0 } } } }