如何让 .usdz 文件显示在 AR View 上

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

我有一个应用程序使用名为

Mercury.usdz
的 .usdz 文件我想在这里显示它:

ARView(isARViewActive: $isARViewActive, planet: "Mercury")

ARView 被定义为:

struct ARView: UIViewRepresentable {
    @Binding var isARViewActive: Bool
    let planet: Planet
    
    func makeUIView(context: Context) -> ARSCNView {
        let arView = ARSCNView(frame: .zero)
        arView.delegate = context.coordinator
        
        let scene = SCNScene()
        arView.scene = scene
        
        let camera = SCNCamera()
        let cameraNode = SCNNode()
        cameraNode.camera = camera
        scene.rootNode.addChildNode(cameraNode)
        
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal, .vertical]
        arView.session.run(configuration)
        
        return arView
    }
    
    func updateUIView(_ uiView: ARSCNView, context: Context) {
        let mdlAsset = MDLAsset(url: Bundle.main.url(forResource: planet.name, withExtension: "usdz")!)
        mdlAsset.loadTextures()
        let asset = mdlAsset.object(at: 0)
        let assetNode = SCNNode(mdlObject: asset)
        
        // set planet node position in front of camera
        if let frame = uiView.session.currentFrame {
            let cameraTransform = frame.camera.transform
            let cameraPosition = SIMD3<Float>(cameraTransform.columns.3.x, cameraTransform.columns.3.y, cameraTransform.columns.3.z)
            let cameraDirection = SIMD3<Float>(-cameraTransform.columns.2.x, -cameraTransform.columns.2.y, -cameraTransform.columns.2.z)
            let planetPosition = cameraPosition + cameraDirection * 0.5 // adjust planet distance from camera as needed
            assetNode.simdWorldPosition = planetPosition
        }
        
        uiView.scene.rootNode.addChildNode(assetNode)
    }
    
    func makeCoordinator() -> ARViewCoordinator {
        return ARViewCoordinator(isARViewActive: $isARViewActive)
    }
}

ARViewCoordinator定义为:

class ARViewCoordinator: NSObject, ARSCNViewDelegate {
    
    @Binding var isARViewActive: Bool
    
    init(isARViewActive: Binding<Bool>) {
        self._isARViewActive = isARViewActive
    }
    
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
        
        let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))
        let planeNode = SCNNode(geometry: plane)
        planeNode.position = SCNVector3(planeAnchor.center.x, 0, planeAnchor.center.z)
        planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
        
        node.addChildNode(planeNode)
    }
    
}

行星未显示。当我使用 SceneKit 时,文件地址可以正常工作。

ARView 启动并能够使用摄像头,但墙壁上有白色矩形(没有深度)。我认为它们只能在平坦的墙上,我该如何让它们消失?

我该如何解决这些问题?如果您需要任何其他信息,请告诉我:)

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