Qt 3D 实体的多个实例

问题描述 投票:0回答:1

我正在尝试在 Qt 3D 中创建多个球体。以下是我开发的代码。

Entity{
    Repeater {

        model: 10
        SphereMesh {
            id: sphereMesh1
            radius: 1
        }

        Transform {
            id: sphereTransform1
            property real userAngle: 0.0
            matrix: {
                var m = Qt.matrix4x4();
                m.rotate(userAngle, Qt.vector3d(0, 1, 0));
                m.translate(Qt.vector3d(index, 0, 0));
                return m;
            }
        }

        PhongMaterial {
            id: material1
        }

        Entity {
            id: sphereEntity1
            components: [ sphereMesh1, material1, sphereTransform1 ]
        }
     }
  }

我在上面写了一个中继器来创建 10 个球体,但屏幕变成空白。有什么提示吗?

qt qml qt3d
1个回答
1
投票

使用NodeInstantiator

Entity {
    id: root

    Camera {
        id: mainCamera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: 16/9
        nearPlane : 0.1
        farPlane : 1000.0
        position: Qt.vector3d( 0.0, 0.0, -40.0 )
        upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
        viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
    }

    OrbitCameraController {
        id: mainCameraController
        camera: mainCamera
    }

    components: [
        RenderSettings {

            Viewport {
                normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0)
                RenderSurfaceSelector {
                    CameraSelector {
                        id: cameraSelector
                        camera: mainCamera
                        FrustumCulling {
                            ClearBuffers {
                                buffers: ClearBuffers.AllBuffers
                                clearColor: "#333333"
                                NoDraw {}
                            }
                            LayerFilter {
                                filterMode: LayerFilter.DiscardAnyMatchingLayers
                                layers: [topLayer]
                            }
                            LayerFilter {
                                filterMode: LayerFilter.AcceptAnyMatchingLayers
                                layers: [topLayer]
                                ClearBuffers {
                                    buffers: ClearBuffers.DepthBuffer
                                }
                            }
                        }
                    }
                }
            }
        },
        InputSettings {}
    ]

    Layer {
        id: topLayer
        recursive: true
    }

    ListModel {
        id: entityModel

        ListElement { x: 0; y: 0; z: 0 }
    }

    NodeInstantiator {
        id: instance

        model: entityModel

        delegate:Entity{

            SphereMesh {
                id: sphereMesh1
                radius:1
            }

            Transform {
                id: sphereTransform1

                translation: Qt.vector3d(x,y,z)

            }

            PhongMaterial {
                id: material1
                ambient: "red"
            }

            Entity {
                id: sphereEntity1
                components: [ sphereMesh1, material1, sphereTransform1 ]
            }
        }

        Component.onCompleted:
        {
            for(var i=0;i<10;i++)
            {
                entityModel.append({"x" : i*3, "y" : 0.0, "z" : Math.random()} )

            }

        }
    }
}

Output screenshot

© www.soinside.com 2019 - 2024. All rights reserved.