Qt Quick 3D - 挑选示例

演示模型的选择。

此示例演示了选择功能。存在3种不同的动画模型可以进行选择。当模型被选中时,动画将停止,模型颜色改变以清楚地显示哪个模型被选中。选择结果的详细信息显示在应用程序窗口的顶部。

使模型可挑选

为了使模型可挑选,需要将pickable属性设置为true。我们还为模型添加了objectName,以便能够显示选中模型的名称。

Model {
    id: cubeModel
    objectName: "Cube"
    source: "#Cube"
    pickable: true
    property bool isPicked: false

添加了isPicked属性,用于切换动画和颜色。

materials: DefaultMaterial {
    diffuseColor: cubeModel.isPicked ? "#41cd52" : "#09102b"
    ...
SequentialAnimation on eulerRotation {
    running: !cubeModel.isPicked

获取挑选结果

要执行实际的选择,我们需要添加一个MouseArea来覆盖整个View3D

MouseArea {
    anchors.fill: view

在鼠标区域的onClicked处理器中,我们使用pick方法来获取实际的选择结果。

var result = view.pick(mouse.x, mouse.y);

如果结果有一个目标对象,我们将通过结果的详细信息,并将它们显示在应用程序视图顶部的文本字段中。

if (result.objectHit) {
    var pickedObject = result.objectHit;
    // Toggle the isPicked property for the model
    pickedObject.isPicked = !pickedObject.isPicked;
    // Get picked model name
    pickName.text = pickedObject.objectName;
    // Get other pick specifics
    uvPosition.text = "("
            + result.uvPosition.x.toFixed(2) + ", "
            + result.uvPosition.y.toFixed(2) + ")";
    distance.text = result.distance.toFixed(2);
    scenePosition.text = "("
            + result.scenePosition.x.toFixed(2) + ", "
            + result.scenePosition.y.toFixed(2) + ", "
            + result.scenePosition.z.toFixed(2) + ")";
    localPosition.text = "("
            + result.position.x.toFixed(2) + ", "
            + result.position.y.toFixed(2) + ", "
            + result.position.z.toFixed(2) + ")";
    worldNormal.text = "("
            + result.sceneNormal.x.toFixed(2) + ", "
            + result.sceneNormal.y.toFixed(2) + ", "
            + result.sceneNormal.z.toFixed(2) + ")";
    localNormal.text = "("
            + result.normal.x.toFixed(2) + ", "
            + result.normal.y.toFixed(2) + ", "
            + result.normal.z.toFixed(2) + ")";

文件

图像

© 2024 The Qt Company Ltd. 本文档贡献的版权为各自所有者的版权。本文档提供的文档根据由自由软件基金会发布并遵守的 GNU 自由文档许可证版本 1.3 许可。Qt 和相关标志是 The Qt Company Ltd 在芬兰或其他国家/地区的商标。所有其他商标均为其各自所有者的财产。