【问题标题】:Remove Entity from Scene in RealityKit从 RealityKit 中的场景中删除实体
【发布时间】:2021-01-25 11:38:57
【问题描述】:

我想从我的场景中移除一个实体。

我在 UpdateUIView 函数中创建了我的实体,如下所示:

// create anchor and model-Entity
let anchor = AnchorEntity(plane: .horizontal)
    
let cube = MeshResource.generateBox(size: 0.1, cornerRadius: 0.03)
let material = SimpleMaterial(color: .gray, roughness: 0.2, isMetallic: true)
let cubeEntity = ModelEntity(mesh: cube, materials: [material])
    
anchor.addChild(cubeEntity)
uiView.scene.addAnchor(anchor)

现在我想通过按用户界面中的按钮来删除它。通过按下按钮,我将 var 从 false 更改为 true。 然后我在UpdateUIView函数里面写:

if remove == true {
    uiView.scene.removeAnchor(anchor)
}

当我按下按钮时,它会将布尔值更改为 true,但实体不会消失。

关于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: swift swiftui augmented-reality realitykit


    【解决方案1】:

    updateUIView(...)

    使用下面的代码得到想要的结果:

    import SwiftUI
    import RealityKit
    
    struct ARViewContainer: UIViewRepresentable {
        
        @Binding var showed: Bool
        let anchor = AnchorEntity(world: [0, 0,-1])
        
        func makeUIView(context: Context) -> ARView {      
            let arView = ARView(frame: .zero)
            let cube = MeshResource.generateBox(size: 0.8, cornerRadius: 0.02)
            let material = SimpleMaterial(color: .red, isMetallic: true)
            let cubeEntity = ModelEntity(mesh: cube, materials: [material])
            anchor.addChild(cubeEntity)
            arView.scene.addAnchor(anchor)
            return arView
        }        
        func updateUIView(_ uiView: ARView, context: Context) {
            if showed == true {
                uiView.scene.removeAnchor(anchor)
            }
        }
    }
    
    struct ContentView : View {
        
        @State private var show = false
    
        var body: some View {
            VStack {
                ARViewContainer(showed: $show)
                VStack {
                    Button(action: { self.show.toggle() }) {
                        Text("Remove Model")
                    }
                }
            }
        }
    }    
    

    协调员

    updateUIView(...) 实例方法中更新您的内容不是强制性的。相反,您可以使用 Coordinator 类和自定义 makeCoordinator() 方法。

    【讨论】:

    • 嗨@User_404,这个区别很重要,不是吗? makeUIView(...) 方法创建视图对象并配置其初始状态。然后updateUIView(...) 方法只是更新了之前创建的东西。
    • 嘿,安迪,您的方法有效,但我尝试加载多个 .USDZ 文件并使用您的方法删除它们。这没有用。每次按下特定模型的按钮以创建新实体时,我都会更改实体的名称。但是 removeAnchor 函数不再删除任何这些实体。对此有何建议?
    • 您可以使用.name 实例属性命名锚点或模型。然后使用arView.scene.findEntity(named: "NAME") 找到它
    • 谢谢你的回复,安迪。我发布了另一个问题,到目前为止我在其中显示了我的代码。也许你可以看看这个并告诉我我的问题可能出在哪里。我对 swift 很陌生,不了解代码中发生的所有事情。
    • 我明天去看看))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2015-04-28
    • 2023-03-12
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多