Проблема с добавлением узла в вид сцены - PullRequest
1 голос
/ 25 февраля 2020

У меня проблема с размещением модели на виде сцены.

Проблема в том, что модель успешно загружается, но по какой-то причине она отображается поверх вида сцены.

вот видео проблемы:

https://www.youtube.com/watch?v=-pTPEZTF9zo

просмотр загружен:

 override func viewDidLoad() {
        super.viewDidLoad()
        self.dowloadModel()
        self.sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
        self.configuration.planeDetection = .horizontal
        self.sceneView.session.run(configuration)
        self.registerGestureRecogniser()
    }

Recofniser жестов:

 func registerGestureRecogniser(){
        let tapGestureRecogiser = UITapGestureRecognizer(target: self, action: #selector(tapped))

        self.sceneView.addGestureRecognizer(tapGestureRecogiser)
    }

Функция касания:

@objc func tapped(sender:UITapGestureRecognizer){
        let sceneView = sender.view as! ARSCNView
        let tapLocation = sender.location(in: sceneView)
        let hitTest = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)

        if !hitTest.isEmpty{
            print("touched a horizontal surface")
            self.addItem2(hitTestResult: hitTest.first!)

        }
        else{
            print("no match")
        }
    }

Скачать модель с AWS:

private func dowloadModel(){
        let url = URL(string: "https://ENTER URL HERE")!

        URLSession.shared.dataTask(with: url) { data, response, error in

            if let error = error{
                print(error.localizedDescription)
                return
            }

            if let data = data{
                print(data)

                let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

                if let documentDirectory = documentDirectories.first{

                    let fileURL = documentDirectory.appendingPathComponent("Food.scn")
                    let dataNS : NSData? = data as NSData

                    try! dataNS?.write(to: fileURL, options: .atomic)

                    print("Saved!")
                }
            }

        }.resume()
    }

Добавить функцию 2:

    func addItem2(hitTestResult : ARHitTestResult){
            let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

            if let documentDirectory = documentDirectories.first{
                let fileURL = documentDirectory.appendingPathComponent("Food.scn")

                do{
                    let scene = try SCNScene(url: fileURL, options: nil)
                    let node = scene.rootNode.childNode(withName: "Burger", recursively: true)!

let material = SCNMaterial()
                material.diffuse.contents = UIImage(named: "Hamburger_BaseColor")
                material.diffuse.wrapT = SCNWrapMode.repeat
                material.diffuse.wrapS = SCNWrapMode.repeat
                material.isDoubleSided = true

                    let transform = hitTestResult.worldTransform
                    let thirdColumn = transform.columns.3

                    node.position = SCNVector3(thirdColumn.x, thirdColumn.y, thirdColumn.z)

                    self.sceneView.scene.rootNode.addChildNode(node)
                }
                catch{
                    print(error)
                }

            }

        }

1 Ответ

1 голос
/ 26 февраля 2020

Похоже, что эта проблема полностью зависит от положения точки поворота и масштаба вашей модели.

Pivot соответствует ARPlaneAnchor и помогает вам контролировать смещение модели от пола, столешницы или стены.

node.scale = SCNVector3(x: 0.2, y: 0.2, z: 0.2)

node.pivot = SCNMatrix4MakeTranslation(0, -0.5, 0)

Поэтому, если вы хотите, чтобы ваша модель точно стояла на невидимой обнаруженной плоскости, переместите опорную точку в SceneKit в нужное место или установите ее положение в Инструмент 3D-авторинга (например, 3dsMax или Blender).

enter image description here

...