iOS ARKit: объект большого размера всегда появляется, чтобы двигаться с изменением положения камеры устройства. - PullRequest
3 голосов
/ 02 апреля 2020

Я создаю iOS приложение ARKit, в котором я хотел разместить большой объект в дополненной реальности.

Когда я пытаюсь поместить объект в определенную позицию, он всегда кажется движущимся с изменением положения камеры, и я не могу смотреть на объект со всех сторон, меняя положение камеры.

Но если я уменьшу значение его масштаба до 0,001 (уменьшение размера объекта), я смогу увидеть объект со всех сторон, и положение размещенного объекта также не изменится в этой степени.

Ограничительная рамка объекта: -

Ширина = 3,66

Высота = 1,83

Глубина = 2,438

enter image description here

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)
Пытался разместить объект на некотором расстоянии от камеры устройства
 modelNode?.position = SCNVector3(0, 0, -800)
Пробовал с различными комбинациями столбцов 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. Объект может быть виден со всех сторон при движении камеры устройства без каких-либо изменений положения объекта.

1 Ответ

0 голосов
/ 23 апреля 2020

Я выяснил причину проблемы root. Проблема была связана с моделью, которую я использовал для AR. Когда я заменил модель на модель, указанную в этой ссылке: - https://developer.apple.com/augmented-reality/quick-look/. У меня не было никаких проблем. Поэтому, если в будущем кто-то столкнется с такими проблемами, я бы порекомендовал использовать любую из моделей, предоставленных Apple, чтобы проверить, сохраняется ли проблема с ней или нет.

...