使用ARFaceTrackingConfiguration时如何让SceneNode固定在SceneView中心
解决ARFaceTracking下3D模型固定在SceneView中心的问题
我来帮你搞定这个问题!你当前的模型随相机移动是因为它被绑定到了**面部锚点(ARFaceAnchor)**上,而面部锚点会跟随你的面部(也就是相机视角)移动。要让模型固定在屏幕中心,我们需要把它挂载到相机节点上,而不是面部锚点。
核心思路
ARFaceTrackingConfiguration中,ARSCNView的pointOfView就是相机节点,把模型作为相机节点的子节点,模型就会相对于相机保持固定位置,始终处于视野中心。
修改后的完整代码
import ARKit import SceneKit import UIKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! let scene = SCNScene(named: "art.scnassets/TEST.scn")! var contentNode: SCNNode? override func viewDidLoad() { super.viewDidLoad() // Set the view's delegate sceneView.delegate = self // Show statistics such as fps and timing information sceneView.showsStatistics = true sceneView.scene = self.scene // 关键:将模型挂载到相机节点 setupFixedModel() } private func setupFixedModel() { // 获取相机节点 guard let cameraNode = sceneView.pointOfView else { print("无法获取相机节点") return } // 从场景中获取你的3D模型节点(假设TEST.scn的根节点就是目标模型) guard let modelNode = scene.rootNode.childNodes.first else { print("无法找到模型节点") return } // 设置模型位置:x=0,y=0表示屏幕中心,z=-0.5表示在相机前方0.5米处(可调整) modelNode.position = SCNVector3(0, 0, -0.5) // 根据模型大小调整缩放比例(按需修改) modelNode.scale = SCNVector3(0.1, 0.1, 0.1) // 将模型添加到相机节点的子节点中 cameraNode.addChildNode(modelNode) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Create a session configuration let configuration = ARFaceTrackingConfiguration() configuration.isLightEstimationEnabled = true // Run the view's session sceneView.session.run(configuration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Pause the view's session sceneView.session.pause() } // MARK: - ARSCNViewDelegate func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { // 如果你不需要面部网格,可以注释掉下面的代码;如果需要保留面部追踪,继续保留即可 guard let faceAnchor = anchor as? ARFaceAnchor else { return nil } let faceGeometry = ARSCNFaceGeometry(device: sceneView.device!)! self.contentNode = SCNNode(geometry: faceGeometry) return self.contentNode } }
关键说明
setupFixedModel()方法是核心:我们获取相机节点后,把模型作为它的子节点,这样模型的位置是相对于相机的,所以会固定在屏幕中心。- 调整
modelNode.position的z值:负数表示在相机前方,数值越大(绝对值)模型越远;正数会在相机后方,看不到模型。 - 缩放比例
modelNode.scale根据你的3D模型实际大小调整,确保模型在屏幕上显示合适。
这样修改后,你的3D模型就会固定在SceneView的中心,不会随相机移动而偏移了!
内容的提问来源于stack exchange,提问作者Shahriyar
相关产品推荐
相关产品推荐

