如何在 AR View 中将相机聚焦到特定物体?

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

我有一个 AR 视图,其定义如下:

struct ARViewContainer1: UIViewRepresentable {
    @Binding var planetSelected: Bool
    @Binding var selectedPlanet: String
    @Binding var cameraAnchor: AnchorEntity?
    
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        
        // Set up an AR configuration
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.horizontal, .vertical]
        
        // Run the AR session
        arView.session.run(config)
        
        let anchor = try! Solarsystem.loadScene()
        arView.scene.anchors.append(anchor)
                
        return arView
    }

    func updateUIView(_ uiView: ARView, context: Context) {
        // Animate the camera to focus on the selected planet
        if planetSelected {
            // Get the selected planet entity
            guard let anchor = uiView.scene.anchors.first,
                  let planetEntity = anchor.findEntity(named: selectedPlanet) else {
                return
            }
            
            // Move the camera to the selected planet
            let cameraNode = uiView.pointOfView

            let newPosition = planetEntity.position + [-2, 0, 0]
            cameraNode?.move(to: newPosition, relativeTo: planetEntity)
            cameraNode?.look(at: planetEntity.position, from: [-2, 0, 0], relativeTo: nil)
            
            planetSelected = false
        }
    }


}

请注意

updateUIView
功能。我收到此错误:

Value of type 'ARView' has no member 'pointOfView'
[1] 和
'nil' requires a contextual type
[2]

我在这一行遇到错误 1

let cameraNode = uiView.pointOfView
,在这一行遇到错误 2
cameraNode?.look(at: planetEntity.position, from: [-2, 0, 0], relativeTo: nil)

基本上我想做的是让用户选择一个行星,存储在

selectedPlanet
中,然后应用程序会找到它在哪里(行星正在移动),然后聚焦/放大行星,以便用户看看:)

请提供任何帮助。

swiftui arkit realitykit reality-composer
1个回答
0
投票

首先

pointOfView实例属性与RealityKit的ARView没有关系,因为该属性只能在SceneKit中使用,因为它是一个

SCNNode
(而不是
Entity
)。这就是为什么您不断收到错误
Value of type 'ARView' has no member 'pointOfView'
。您不能在 RealityKit 中使用 SceneKit 的
SCNNode
对象,因为这两个框架完全不同

var pointOfView: SCNNode? { get set }

其次

仅在两种情况下将 3D 相机指向特定 3D 模型才有意义:

  • 如果您在 RealityKit 的
    nonAR mode
     中使用 
    ARView
  • 如果您在 SceneKit 的
    VR mode
    /
    SceneView
     中使用 
    ARSCNView

AR mode
中以编程方式将相机指向 3D 模型没有实际意义,因为您必须手动控制 AR 相机。顺便说一句,如果您在 SceneKit AR 场景中启用
.allowsCameraControl
,并在正在运行的 AR 应用程序中移动相机,它将完全破坏 AR 体验。

let sceneView = ARSCNView(frame: .zero)
let camera = sceneView.pointOfView?.camera

sceneView.allowsCameraControl = true     // VR mode
sceneView.allowsCameraControl = false    // AR mode

解决方案

由于 ARView 只有可获取的

cameraTransform
属性,因此您可以使用相同的
planetEntity
实例方法强制
move(to:relativeTo:)
向相机移动。

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