Разработка приложения ARKit, которое оставляет текст для просмотра другими - PullRequest
0 голосов
/ 01 ноября 2018

Я создаю приложение iOS AR, которое устанавливает текст в определенном месте и оставляет его для просмотра другими. Есть ли лучший способ реализовать это, чем то, что я делаю?

В настоящее время я установил его так, чтобы текст сохранялся в Firebase и загружался путем установки узлов относительно положения камеры. Мне интересно, есть ли способ сохранить ARAnchors способом, аналогичным тому, что я делаю, но возможно ли это?

Моя текущая функция для сохранения текста в месте, когда пользователь нажимает на экран:

    /*
     * Variables for saving the user touch
     */
    var touchX : Float = 0.0
    var touchY : Float = 0.0
    var touchZ : Float = 0.0

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // will be used for getting the text
        let textNode = SCNNode()
        var writing = SCNText()

    // gets the user’s touch upon tapping the screen
        guard let touch = touches.first else {return}
        let result = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
        guard let hitResult = result.last else {return}
        let hitTransform = SCNMatrix4.init(hitResult.worldTransform)
        let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43)

    // saves X, Y, and Z coordinates of touch relative to the camera
        touchX = hitTransform.m41
        touchY = hitTransform.m42
        touchZ = hitTransform.m43

    // Was thinking of adding the ability to change colors. Probably can skip next seven lines
        var colorArray = [UIColor]()
        colorArray.append(UIColor.red)

        writing = SCNText(string: input.text, extrusionDepth: 1)

        material.diffuse.contents = colorArray[0]
        writing.materials = [material]

    // modifies the node’s position and size
        textNode.scale = SCNVector3(0.01, 0.01, 0.01)
        textNode.geometry = writing
        textNode.position = hitVector
        sceneView.scene.rootNode.addChildNode(textNode)

    // last few lines save the info to Firebase
        let values = ["X" : touchX, "Y" : touchY, "Z" : touchZ, "Text" : input.text!] as [String : Any]
        let childKey = reference.child("Test").childByAutoId().key

        if input.text != nil && input.text != "" {
            let child = reference.child("Test").child(childKey!)
            child.updateChildValues(values)
        } else {
            let child = reference.child("Test").child(childKey!)
            child.updateChildValues(values)
        } // if
    } // override func

    /*
     * Similar to the previous function but used in next function
     */
    func placeNode(x: Float, y: Float, z: Float, text: String) -> Void {
        let textNode = SCNNode()
        var writing = SCNText()

        let hitVector = SCNVector3Make(x, y, z)

        touchX = x
        touchY = y
        touchZ = z

        var colorArray = [UIColor]()
        colorArray.append(UIColor.red)

        writing = SCNText(string: text, extrusionDepth: 1)

        material.diffuse.contents = colorArray[0]
        writing.materials = [material]

        textNode.scale = SCNVector3(0.01, 0.01, 0.01)
        textNode.geometry = writing
        textNode.position = hitVector
        sceneView.scene.rootNode.addChildNode(textNode)
    } // func

 /*
  *  This next function is used in my viewDidLoad to load the data
  */
    func handleData() {
        reference.child("Test").observeSingleEvent(of: .value, with: { (snapshot) in
            if let result = snapshot.children.allObjects as? [DataSnapshot] {
                for child in result {
                    let xCoord = Float(truncating: child.childSnapshot(forPath: "X").value as! NSNumber)
                    let yCoord = Float(truncating: child.childSnapshot(forPath: "Y").value as! NSNumber)
                    let zCoord = Float(truncating: child.childSnapshot(forPath: "Z").value as! NSNumber)

                    let inscription = child.childSnapshot(forPath: "Text").value

                    self.placeNode(x: xCoord , y: yCoord , z: zCoord , text: inscription as! String)
                } // for
            } // if
        }) // reference
    } // func

Я рассмотрел несколько вещей, таких как ARCore, но похоже, что он использует Objective-C. Я сделал это приложение в Swift, и я не уверен, смогу ли я включить ARCore в то, как я реализовал свое текущее приложение.

Мне просто нужно пройти через это и выучить Objective-C? Могу ли я работать с тем, что у меня есть?

1 Ответ

0 голосов
/ 02 ноября 2018

Я думаю, что якоря ARCore доступны только в течение 24 часов, так что это может быть проблемой.

Вам, вероятно, нужно использовать ARWorldMap ARKit2.0 и сохранить его как данные на базе Firebase, чтобы другие могли видеть текст в том же месте, в противном случае в вашем коде вы предполагаете, что будущие пользователи начнут сеанс AR в том же положении. и направление как человек, который оставил текст. Вам, вероятно, нужно сначала использовать основное местоположение, чтобы увидеть, где в мире находится пользователь.

...