iOS ARKit:大型对象总是随着设备相机位置的变化而移动

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

我正在创建一个iOS ARKit应用,我想在其中将大物体放在增强现实中。

[当我尝试将对象放置在特定位置时,它总是随着相机位置的变化而移动,并且无法通过更改相机位置从所有角度查看对象。

但是,如果我将其比例值减小到0.001(减小对象的大小),则可以从所有角度查看对象,并且放置对象的位置也不会改变到该程度。

对象的边界框:-

宽度= 3.66

高度= 1.83

深度= 2.438

enter image description here

Model / Object Url:-

https://drive.google.com/open?id=1uDDlrTIu5iSRJ0cgp70WFo7Dz0hCUz9D

源代码:-

import UIKit
import ARKit
import SceneKit

class ViewController: UIViewController {

    @IBOutlet weak var sceneView: ARSCNView!
    private let configuration = ARWorldTrackingConfiguration()
    private var node: SCNNode!

    //MARK: - Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        self.sceneView.showsStatistics = false
        self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
        self.sceneView.automaticallyUpdatesLighting = false
        self.sceneView.delegate = self
        self.addTapGesture()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

       configuration.planeDetection = .horizontal
       self.sceneView.session.run(configuration)

    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.sceneView.session.pause()
    }

    //MARK: - Methods

    func addObject(hitTestResult: ARHitTestResult) {

        let scene = SCNScene(named: "art.scnassets/Cube.obj")!
        let modelNode = scene.rootNode.childNodes.first
        modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.3.x,
                                         hitTestResult.worldTransform.columns.3.y,
                                         hitTestResult.worldTransform.columns.3.z)
        let scale = 1
        modelNode?.scale = SCNVector3(scale, scale, scale)
        self.node = modelNode
        self.sceneView.scene.rootNode.addChildNode(modelNode!)


       let lightNode = SCNNode()
       lightNode.light = SCNLight()
       lightNode.light?.type = .omni
       lightNode.position = SCNVector3(x: 0, y: 10, z: 20)
       self.sceneView.scene.rootNode.addChildNode(lightNode)

       let ambientLightNode = SCNNode()
       ambientLightNode.light = SCNLight()
       ambientLightNode.light?.type = .ambient
       ambientLightNode.light?.color = UIColor.darkGray
       self.sceneView.scene.rootNode.addChildNode(ambientLightNode)


    }

    private func addTapGesture() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(_:)))
        self.sceneView.addGestureRecognizer(tapGesture)
    }

    @objc func didTap(_ gesture: UIPanGestureRecognizer) {
        let tapLocation = gesture.location(in: self.sceneView)
        let results = self.sceneView.hitTest(tapLocation, types: .featurePoint)

        guard let result = results.first else {
            return
        }

        let translation = result.worldTransform.translation

        guard let node = self.node else {
            self.addObject(hitTestResult: result)
            return
        }
        node.position = SCNVector3Make(translation.x, translation.y, translation.z)
        self.sceneView.scene.rootNode.addChildNode(self.node)
    }

}

extension float4x4 {
    var translation: SIMD3<Float> {
        let translation = self.columns.3
        return SIMD3<Float>(translation.x, translation.y, translation.z)
    }
}

问题的GIF:-

enter image description here

问题的视频URL:-

https://drive.google.com/open?id=1E4euZ0ArEtj2Ffto1pAOfVZocV08EYKN

已尝试的方法:-

  1. 试图将对象放在原点
 modelNode?.position = SCNVector3(0, 0, 0)
  1. 试图将物体放置在距离设备相机较远的位置
 modelNode?.position = SCNVector3(0, 0, -800)
  1. 尝试使用worldTransform / localTransform列的不同组合
modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.3.x, hitTestResult.worldTransform.columns.3.y, hitTestResult.worldTransform.columns.3.z)
modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.2.x, hitTestResult.worldTransform.columns.2.y, hitTestResult.worldTransform.columns.2.z)
modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.1.x, hitTestResult.worldTransform.columns.1.y, hitTestResult.worldTransform.columns.1.z)
modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.1.x, hitTestResult.worldTransform.columns.2.y, hitTestResult.worldTransform.columns.3.z)
modelNode?.position = SCNVector3(hitTestResult.localTransform.columns.3.x, hitTestResult.localTransform.columns.3.y, hitTestResult.localTransform.columns.3.z)

但是仍然没有运气。它似乎仍随设备相机一起移动,并且没有卡在放置位置。

E 预期结果:-

  1. 对象应为实际大小(比例应为1.0)。它们应该不减小比例值。
  2. 一旦放置在特定位置,它就不应随设备相机的移动而移动。
  3. 可以通过设备相机的移动从各个角度看到物体,而物体位置没有任何变化。
ios swift scenekit arkit
1个回答
0
投票

我找出了问题的根本原因。问题与我用于AR的模型有关。何时,我用此链接中提供的模型替换了该模型:-https://developer.apple.com/augmented-reality/quick-look/。我没有遇到任何问题。因此,如果将来有人遇到此类问题,我建议使用Apple提供的任何模型来检查问题是否仍然存在。

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