相同大小的物体总是被卡在相机的前面

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

我创建了一个小的增强现实演示应用程序,我想在AR中放置一个大对象。但是,当将对象缩放到1.0时,它始终似乎卡在了相机的前面,我无法从所有角度看到该对象。好像将其缩放到0.001一样,我可以从各个角度查看整个对象。谁能解释为什么我在大型模型中会遇到此类问题,并且有什么办法可以解决此问题。

模型尺寸:-

enter image description here

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.1.x,
                                         hitTestResult.worldTransform.columns.2.y,
                                         -800)
        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)
    }
}

也请在附件中找到视频的链接:-

  1. 将模型缩放到0.001后的视频捕获https://drive.google.com/open?id=1sBFEyleSIBMmQV5MgA6rOqJZEc0YUyKR

  2. 将模型缩放为1后的视频捕获https://drive.google.com/open?id=1k5-adqLCcwaXoYY1ZePE2D-mOdyLvHvi

缩放比例为1时,我无法从所有角度看到整个对象,并且该对象也随iPad​​相机一起移动。有什么方法可以将物体固定在固定的位置上吗?

谢谢你。

ios swift augmented-reality scenekit arkit
1个回答
0
投票

尝试以下代码,以便将模型放置在预期的经过测试的位置:

@objc func tap(gesture: UITapGestureRecognizer) {

    let touch: CGPoint = gesture.location(in: sceneView)

    let result: [ARHitTestResult] = sceneView.hitTest(touch, 
                                               types: .existingPlaneUsingExtent)

    guard let hitTest: ARHitTestResult = result.first 
    else { return }

    self.loadModel(hitTest)
}

然后为loadModel(:_)方法创建内容:

func loadModel(_ result: ARHitTestResult) {

    let scene = SCNScene(named: "art.scnassets/myScene.scn")!

    let node: SCNNode? = scene.rootNode.childNode(withName: "model", 
                                               recursively: true)

    node?.position = SCNVector3(result.worldTransform.columns.3.x,
                                result.worldTransform.columns.3.y,
                                result.worldTransform.columns.3.z)

    node?.scale = SCNVector3(0.5, 0.5, 0.5)

    self.sceneView.scene.rootNode.addChildNode(node!)
}

然后使用@objc #selector方法提供tap

override func viewDidLoad() {
    super.viewDidLoad()

    let gestureRecognizer = UITapGestureRecognizer(target: self, 
                                                   action: #selector(tap))

    self.sceneView.addGestureRecognizer(gestureRecognizer)
}
© www.soinside.com 2019 - 2024. All rights reserved.