ios - 点击扫描平面时如何将 3D 对象添加到引用图像?

标签 ios swift xcode arkit

当用户点击 scnplane 时,我正在尝试将 3D 对象转换为引用图像。我已经开始触摸 scnplane 添加新的 3D 对象。现在我可以添加 3D 对象,但它不引用引用图像。

我的问题是,当用户点击 scnplane 时,它​​会显示要引用的 3d 对象,点击另一个 scnplane 应该添加新的 3d 对象并删除旧的 3d 对象?

这是我尝试过的代码:

 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    DispatchQueue.main.async {
        guard let imageAnchor = anchor as? ARImageAnchor,
            let imageName = imageAnchor.referenceImage.name else { return }

        let rotationAsRadian = CGFloat(GLKMathDegreesToRadians(360))


            // Check To See The Detected Size Of Our Menu Card (Should By 18cm*27cm)
            let menuCardWidth = imageAnchor.referenceImage.physicalSize.width
            let menuCardHeight =  imageAnchor.referenceImage.physicalSize.height

            print(
                """
                We Have Detected menu Card With Name \(imageName)
                \(imageName)'s Width Is \(menuCardWidth)
                \(imageName)'s Height Is \(menuCardHeight)
                """)

            let plane = SCNPlane(width: menuCardWidth, height: menuCardHeight)
            plane.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0.75)

            let planeNode = SCNNode(geometry: plane)
            planeNode.eulerAngles.x = -.pi / 4
            planeNode.runAction(SCNAction.moveBy(x:  0, y: 0, z: 0, duration: 0.75))



            /******************Break fast*******************/

            //BREAKFAST, FALTBREADS, SANDWICHES, ALLDAY
            let labelPlane = SCNPlane(width: 0.065, height: 0.015)
            labelPlane.firstMaterial?.diffuse.contents = UIImage(named: "BREAKFAST")

            let lableNode = SCNNode(geometry: labelPlane)
            self.lableNode = lableNode
            lableNode.name = "lableNode"
            lableNode.eulerAngles.x = -.pi / 2
            lableNode.runAction(SCNAction.moveBy(x: 0.2, y: 0, z: -0.125, duration: 0))
     node.addChildNode(lableNode)

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

   }
    }


   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    //1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
    guard let currentTouchLocation = touches.first?.location(in: self.sceneView),
        let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node else { return }


    if let lableName = hitTestNode.name {
        print("touch working")
        if lableName == "lableNode"{

            makeCakeOnNode(hitTestNode)


        }
    }
}


func makeCakeOnNode(_ node: SCNNode){




                    let overlayNode = self.getNode(withImageName: "imageName")
                    print("overlay::\(overlayNode)")

                    self.sceneView.scene.rootNode.addChildNode(overlayNode)


  }

最佳答案

创建新的 scnplane 并添加 3D 对象作为新 scnplane 的子级

       func makeCakeOnNode(_ node: SCNNode){

    let planeGeometry = SCNPlane(width: 0.18  , height: 0.15)
    planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(1)

    planeNode0 = SCNNode(geometry: planeGeometry)
    planeNode0?.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))

                    let overlayNode = self.getNode(withImageName: "menu")
                    print("overlay::\(overlayNode)")



    if planeBool == true {

        planeNode1?.isHidden = true
        node.addChildNode(planeNode0!)
        planeNode0?.addChildNode(overlayNode)
        planeBool = false

    } else {

        print("plane removed")
        planeNode0?.isHidden = true

        planeBool = true
    }


}

现在一切正常了!!

关于ios - 点击扫描平面时如何将 3D 对象添加到引用图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52496515/

相关文章:

ios - 在 Firebase 中再次登录后删除子根节点? - swift

ios - 估计数据和服务器数据不匹配 Parse.com

ios - 自定义tableviewCell内容宽度与tableView不同

swift - pickerView 在展开 Optional 时意外发现 nil

json - Swift 4 Codable 解码数组用引号括起来

ios - 动画 NSLayoutConstraint 乘数和/或处于事件状态

ios - 更新 Parse.com 中的 createdAt 列

ios - 当互联网中断时,它使我的应用程序在加载数据时处于缓慢状态

ios - 计算某一层上某个类的 CCNodes 的数量

iphone - UITableViewCell 中的 UILabel 无需创建单独的类即可创建自定义单元格