I get the following warning during runtime when I tap to load the model in ARView: Warning (secondary thread): in AppendProperty at line 859 of sdf/path.cpp -- Can only append a property 'preliminary:anchoring:type' to a prim path (/) Warning (secondary thread): in AppendProperty at line 859 of sdf/path.cpp -- Can only append a property 'triggers' to a prim path (/)
Anyone have insights why I'm getting this warning? All of the logic is in my ViewController:
import UIKit
import ARKit
import RealityKit
import SwiftUI
import Combine
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
private var modelArray: [String] = []
var selectedModel = ""
@IBOutlet weak var arView: ARView!
@IBOutlet weak var modelCollectionView: UICollectionView!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadModelName()
arView.session.delegate = self
setupARView()
//modelArray = getModelNames()
self.modelCollectionView.dataSource = self
self.modelCollectionView.delegate = self
arView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:))))
}
// Dynamically load available files from directory
func loadModelName() {
let fm = FileManager.default
let path = Bundle.main.resourcePath!
do {
let items = try fm.contentsOfDirectory(atPath: path)
for item in items where item.hasSuffix("usdz"){
let modelName = item.replacingOccurrences(of: ".usdz", with: "")
print("Found \(item)")
modelArray.append(modelName)
}
} catch {
// failed to read directory – bad permissions, perhaps?
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return modelArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "item", for: indexPath) as! itemCell
cell.itemImage.image = UIImage(named: self.modelArray[indexPath.row])
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.lightGray
selectedModel = self.modelArray[indexPath.row] + ".usdz"
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.white
}
func setupARView() {
arView.automaticallyConfigureSession = false
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
configuration.environmentTexturing = .automatic
if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
print("scene reconstruction supported")
configuration.sceneReconstruction = .mesh
configuration.sceneReconstruction = .meshWithClassification
arView.debugOptions.insert(.showSceneUnderstanding)
}
arView.session.run(configuration)
print("plane detection")
}
@objc
func handleTap(recognizer: UITapGestureRecognizer) {
//gets the location in the arView
let location = recognizer.location(in: arView)
//grab the results of the tap -location: the location of the tap -allowing: tye type of surface to calculate the location -alignment: the type of surface
let reults = arView.raycast(from: location, allowing: .estimatedPlane, alignment: .any)
//check to see if the raycast returned a result, did it actually hit a horizontal surface
if let firstResult = reults.first {
//returns an array of all the things it finds so grab the first
//in order to add objects into a scene, we have to add objects to anchors, firstResult.worldTransform - add anchor at the orientation and position
print("tap gesture recognized")
print("DEBUG: the model is \(selectedModel)")
let anchor = ARAnchor(name: selectedModel, transform: firstResult.worldTransform)
arView.session.add(anchor: anchor)
} else {
print("object placement failed, couldn't find surface")
}
}
func placeObject(named entityName: String, for anchor: ARAnchor) {
let entity = try! ModelEntity.loadModel(named: entityName)
//add collision to have physiscs for manipulations
entity.generateCollisionShapes(recursive: true)
arView.installGestures([.rotation, .translation], for: entity)
//create an anchor entity
let anchorEntity = AnchorEntity(anchor: anchor)
// add the entity to anchor
anchorEntity.addChild(entity.clone(recursive: true))
//add the anchor with the entity to the scene
arView.scene.addAnchor(anchorEntity)
}
}
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
for anchor in anchors {
if let anchorName = anchor.name, anchorName == selectedModel {
placeObject(named: anchorName, for: anchor)
}
}
}
}