Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将节点添加到场景视图时出现问题_Swift_Xcode_Scenekit_Augmented Reality_Arkit - Fatal编程技术网

Swift 将节点添加到场景视图时出现问题

Swift 将节点添加到场景视图时出现问题,swift,xcode,scenekit,augmented-reality,arkit,Swift,Xcode,Scenekit,Augmented Reality,Arkit,我对模型在场景视图中的放置方式有问题 问题是模型下载成功,但由于某种原因,它出现在场景视图的顶部 以下是问题的视频: 未加载的视图: override func viewDidLoad() { super.viewDidLoad() self.dowloadModel() self.sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.sho

我对模型在场景视图中的放置方式有问题

问题是模型下载成功,但由于某种原因,它出现在场景视图的顶部

以下是问题的视频:

未加载的视图:

 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()
    }
手势识别器:

 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")
        }
    }
    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)
                }

            }

        }
从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项功能:

@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")
        }
    }
    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)
                }

            }

        }

这个问题似乎完全取决于轴点的位置和模型的比例

轴点与ARAnchor相交,可帮助您控制地板、桌面或墙上模型的偏移、方向和比例

node.scale = SCNVector3(x: 0.2, y: 0.2, z: 0.2)
node.pivot = SCNMatrix4MakeTranslation(0, -0.5, 0)
…或使用此方法定位枢轴:

node.simdPivot.columns.3.y = -0.5
因此,如果希望模型精确地站在不可见的检测平面上,请将SceneKit中的轴点移到所需的位置,或在3D创作工具(如3dsMax或Blender)中设置其位置


谢谢您的回答。我现在还有一个问题,就是模型中没有添加颜色。如何将漫反射图像添加到模型中?在那里找到它并将其添加到代码中!无论如何,万分感谢!