【问题标题】:iOS ARKit: Large size object always appears to move with the change in the position of the device cameraiOS ARKit:大尺寸对象总是随着设备相机位置的变化而移动
【发布时间】:2020-07-14 20:45:32
【问题描述】:

我正在创建一个 iOS ARKit 应用程序,我想在其中放置一个大型对象到增强现实中。

当我试图将对象放置在特定位置时,它似乎总是随着相机位置的变化而移动,我无法通过改变相机位置从各个角度查看对象。

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

物体的边界框:-

宽度 = 3.66

高度 = 1.83

深度 = 2.438

模型/对象网址:-

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:-

问题的视频网址:-

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】:

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

    【讨论】:

    • 我正在开发一个在 AR 中放置房屋的应用程序,并面临同样的问题。与房屋相比,您链接中的所有对象都非常小。我认为 AR 无法正确渲染距离超过几米的大型物体!物体放置得很好,但开始转动并出现偏移......如果您有任何提示可以让 AR 处理非常大的物体,请告诉我!
    • @Hecot 我也尝试过大型模型,但没有遇到任何问题。您能否尝试用此链接 (developer.apple.com/augmented-reality/quick-look) 中提供的任何 3D 模型替换您的“房屋”模型,并将其比例值增加到一个很大的数字。我尝试将模型尺寸增加到 50 米以上,但它仍然有效。我可以知道你房子的尺寸吗?
    • 如果还是不行。是否可以通过任何方式与我分享模型。我会在最后尝试弄清楚。
    • 它有 5 层楼和 55 x 45 米!我认为 ARKit 针对 1 - 5 米的距离进行了优化,当涉及到更大的尺度时,环境的变化是无法匹配的。但是是的 - 如果你看看会很棒!请在此处找到文件:dropbox.com/s/z4kcxjjr00saova/5floor_house.scn?dl=0
    • @Hecot 您的模型有问题。我尝试了其中一种苹果型号,效果很好。请在此处找到视频链接:dropbox.com/s/3e0006qqphoyoxk/….
    【解决方案2】:

    我遇到了同样的问题。

    每当我尝试更改 .usdz 类型(实际上是加密和压缩类型)的模型中的任何内容时,我们都无法编辑或更改其中的任何内容。如果我编辑或更改一点位置,那么它的行为方式与问题中突出显示的方式相同。

    为了处理这个问题,我只是将旧模型 .usdz 移到垃圾箱,并将原始文件(再次)复制到 XCode,然后它就可以工作了。

    【讨论】:

      【解决方案3】:

      与接受的答案中所述不同,问题可能与跟踪质量或模型中的错误无关。看起来模型没有正确放置在地面上,可能是由于枢轴点位置错误,并且模型的某些部分停留在地下。所以当你移动相机时,由于地下部分没有被地板遮挡,它看起来像是在移动。看看这张照片:

      Apple 提供的模型的支点位置正确,因此当它被放置在地面上的飞机顶部时,其部件保持在地面之上。

      如果您正确定位模型的轴心点,它应该可以正常工作,与模型类型无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-27
        • 2019-03-12
        • 2021-06-02
        • 1970-01-01
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多