如何解决在 ARView 中放置对象时,ARKit RealityKit 会在运行时发出警告
我在运行时在 ARView 中点击加载模型时收到以下警告:警告(辅助线程):在 sdf/path.cpp 的第 859 行的 AppendProperty -- 只能附加一个属性 'preliminary:anchoring:type ' 到主要路径 (/) 警告(辅助线程):在 sdf/path.cpp 的第 859 行的 AppendProperty 中 -- 只能将属性“触发器”附加到主路径 (/)
有人知道为什么我会收到此警告吗?所有逻辑都在我的 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)
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。