swift: как изменить материал с уже существующего узла при распознавании изображения? - PullRequest
0 голосов
/ 15 марта 2020

Я студент и хочу создать маленькое (мечта детей) AR-приложение.

Во-первых: приложение должно показывать несколько кубиков, и они выглядят как "карточки". Второе: когда я сканирую реальную карту, «приложение» распознает ее. третье: - и вот в чем проблема: измените материал существующего куба (узла) на изображение, которое сохраняется и ссылается на распознанную карту

при запуске приложения. кубы появляются, карта распознается, но затем -> com.apple.scenekit.scnview-renderer (17): фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

//first:

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!
    var box1Node : SCNNode!
    var box2Node : SCNNode!
    var box3Node : SCNNode!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view's delegate
        sceneView.delegate = self

        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true

        // Create a new scene
        var scene = SCNScene()

    var box1 = SCNBox(width: 0.8, height: 1, length: 0.01, chamferRadius: 0)
    var material = SCNMaterial()
    material.diffuse.contents = UIImage(named:"Uno_1.jpg")
    box1.materials = [material]
    box1Node = SCNNode(geometry: box1)
    box1Node.position = SCNVector3(0,0,-1.5)


    var box2 = SCNBox(width: 0.8, height: 1, length: 0.01, chamferRadius:0)
    var material2 = SCNMaterial()
    material2.diffuse.contents = UIColor.red

    box2.materials = [material2]

    var box2Node = SCNNode(geometry: box2)
    box2Node.position = SCNVector3(1,0,-1.5)

    var box3 = SCNBox(width: 0.8, height: 1, length: 0.01, chamferRadius: 0)
    var material3 = SCNMaterial()
    material3.diffuse.contents = UIColor.red

    box3.materials = [material3]

    var box3Node = SCNNode(geometry: box3)
    box3Node.position = SCNVector3(-1,0,-1.5)

    scene.rootNode.addChildNode(box1Node)
    scene.rootNode.addChildNode(box2Node)
    scene.rootNode.addChildNode(box3Node)

        // Set the scene to the view
        sceneView.scene = scene
    }

//second:

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



        if var imageAnchor = anchor as? ARImageAnchor
        { // third

        // just for checking If the card is recognized
         if var name = imageAnchor.referenceImage.name
            {
                print (name)

            }

         var targetName = imageAnchor.referenceImage.name!
            targetName += ".jpg"

// here is the Error

box2Node.geometry.firstMaterial.diffuse.contents = UIImage(named: targetName)

// I get the error -> 
//com.apple.scenekit.scnview-renderer (17): Fatal error: //Unexpectedly found nil while unwrapping an Optional value
}

  override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        guard var referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else {
            fatalError("Missing expected asset catalog resources.")
        }

        // Create a session configuration
        var configuration = ARWorldTrackingConfiguration()
        configuration.detectionImages = referenceImages

        // Run the view's session
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Pause the view's session
        sceneView.session.pause()
    }

}
...