加载SCNReferenceNode时usdz对象不移动

问题描述

我一直在关注Apple文档和示例项目,以使用带有Virtual Object(SCNReferenceNode的子类)类的.SCN文件加载3d Object,但突然我需要将模型从.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对象

enter image description here

解决方法

经过多次尝试,最终我发现该模型的动态缩放会导致问题,请参考

iOS ARKit: Large size object always appears to move with the change in the position of the device camera

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

        virtualObject.scale = SCNVector3Make(0.01,0.01,0.01)