iOS ARKit:大尺寸对象总是随着设备相机位置的变化而移动 [英] iOS ARKit: Large size object always appears to move with the change in the position of the device camera

查看:73
本文介绍了iOS ARKit:大尺寸对象总是随着设备相机位置的变化而移动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个iOS ARKit应用,我想在其中将一个大对象放置在增强现实中.

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

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

对象的边界框:-

宽度= 3.66

高度= 1.83

深度= 2.438

模型/对象网址:-

问题的视频网址:-

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. 随着设备相机的移动,可以从各个角度看到对象,而对象位置没有任何变化.

解决方案

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

I am creating an iOS ARKit app where I wanted to place a large object in Augmented Reality.

When I am trying to place the object at a particular position it always appears to be moving with the change in camera position and I am not able to view the object from all angles by changing the camera position.

But if I reduce it's scale value to 0.001 (Reducing the size of the object), I am able to view the object from all angles and the position of the placed object also does not change to that extent.

Bounding Box of the Object:-

Width = 3.66

Height = 1.83

Depth = 2.438

Model/Object Url:-

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

Source Code:-

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 of the Problem:-

Video URL of the Problem:-

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

Approaches Tried:-

  1. Tried to place the object at the origin

 modelNode?.position = SCNVector3(0, 0, 0)

  1. Tried to place the object at some distance away from the device camera

 modelNode?.position = SCNVector3(0, 0, -800)

  1. Tried with the different combinations of worldTransform/localTransform columns

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)

But still of no luck. It still appears to be moving with the device camera and not stuck to a position where it has been placed.

Expected Result:-

  1. Object should be of actual size (Scale should be of 1.0). Their should be no reduction in the scale value.
  2. Once placed at a particular position it should not move with the movement of the device camera.
  3. Object can be seen from all angles with the movement of the device camera without any change in object position.

解决方案

I found out the root cause of the issue. The issue was related to the Model which I was using for AR. When, I replaced the model with the one provided in this link:- https://developer.apple.com/augmented-reality/quick-look/. I was not facing any issues. So, if anyone face such type of issues in future I would recommend to use any of the model provided by Apple to check if the issue persists with it or not.

这篇关于iOS ARKit:大尺寸对象总是随着设备相机位置的变化而移动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆