我有一个应用程序使用名为
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 启动并能够使用摄像头,但墙壁上有白色矩形(没有深度)。我认为它们只能在平坦的墙上,我该如何让它们消失?
我该如何解决这些问题?如果您需要任何其他信息,请告诉我:)