我有一个 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
功能。我收到此错误:
[1] 和Value of type 'ARView' has no member 'pointOfView'
[2]'nil' requires a contextual type
我在这一行遇到错误 1
let cameraNode = uiView.pointOfView
,在这一行遇到错误 2 cameraNode?.look(at: planetEntity.position, from: [-2, 0, 0], relativeTo: nil)
基本上我想做的是让用户选择一个行星,存储在
selectedPlanet
中,然后应用程序会找到它在哪里(行星正在移动),然后聚焦/放大行星,以便用户看看:)
请提供任何帮助。
pointOfView实例属性与RealityKit的ARView没有关系,因为该属性只能在SceneKit中使用,因为它是一个
SCNNode
(而不是Entity
)。这就是为什么您不断收到错误Value of type 'ARView' has no member 'pointOfView'
。您不能在 RealityKit 中使用 SceneKit 的 SCNNode
对象,因为这两个框架完全不同。
var pointOfView: SCNNode? { get set }
仅在两种情况下将 3D 相机指向特定 3D 模型才有意义:
nonAR mode
中使用
ARView
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:)
向相机移动。