Я студент и хочу создать маленькое (мечта детей) 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()
}
}