You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:29:31