我遵循Apple和示例项目,使用带有Virtual (SCNReferenceNode的子类)类的SCNReferenceNode文件加载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对象在中的应用
发布于 2020-10-21 09:57:10
经过这么多的尝试,最后我发现这个模型的动态缩放引起了问题,参考了这一点。
对于所有轴(x、y和z),我将对象缩放为0.01。
virtualObject.scale = SCNVector3Make(0.01, 0.01, 0.01)
https://stackoverflow.com/questions/64445193
复制相似问题