1

我正在关注 Apple 文档和示例项目,以使用带有虚拟对象(SCNReferenceNode 的子类)类的 .SCN 文件加载 3d 对象,但突然我需要将模型从 .scn 更改为 usdz 。现在我的 usdz 对象已成功加载,但它不在表面上(在空中),我无法像(点击、平移、旋转)那样与它进行交互......有没有其他方法可以与 usdz 对象进行交互和如何像以前使用 .scn 文件一样将其放置在表面上

用于获取模型 URL(从服务器下载)

    static let loadDownloadedModel : VirtualObject = {
    let downloadedScenePath = getDocumentsDirectory().appendingPathComponent("\(Api.Params.inputModelName).usdz")
    
    return VirtualObject(url: downloadedScenePath)!
}()

从 URL 加载它

    func loadVirtualObject(_ object: VirtualObject, loadedHandler: @escaping (VirtualObject) -> Void) {
    isLoading = true
    loadedObjects.append(object)
    
    
    // Load the content asynchronously.
    DispatchQueue.global(qos: .userInitiated).async {
        object.reset()
        object.load()

        self.isLoading = false
        loadedHandler(object)
    }
}

放置在场景中

    func placeObjectOnFocusSquare() {
    virtualObjectLoader.loadVirtualObject(VirtualObject.loadDownloadedModel) { (loadedObject) in
              DispatchQueue.main.async {
                  self.placeVirtualObject(loadedObject)
                self.setupBottomButtons(isSelected: true)
              }
    }
}


func placeVirtualObject(_ virtualObject: VirtualObject) {
    guard let cameraTransform = session.currentFrame?.camera.transform,
        let focusSquarePosition = focusSquare.lastPosition else {
        statusViewController.showMessage("CANNOT PLACE OBJECT\nTry moving left or right.")
        return
            
    }
    Api.Params.selectedModel = virtualObject
    virtualObject.name = String(Api.Params.inputPreviewId)
    virtualObject.scale = SCNVector3(Api.Params.modelXAxis, Api.Params.modelYAxis, Api.Params.modelZAxis)
    virtualObject.setPosition(focusSquarePosition, relativeTo: cameraTransform, smoothMovement: false)
    updateQueue.async {
        self.sceneView.scene.rootNode.addChildNode(virtualObject)
    }
}

场景视图中的 .usdz 对象

在此处输入图像描述

4

1 回答 1

0

经过这么多尝试,我终于发现模型的动态缩放导致问题,参考this

iOS ARKit:大尺寸对象总是随着设备相机位置的变化而移动

我将所有轴(x、y 和 z)的对象缩放到 0.01

        virtualObject.scale = SCNVector3Make(0.01, 0.01, 0.01)
于 2020-10-21T09:57:10.903 回答