所以我之前问了一个不同的问题,并得出了部分解决方案。我能够将手势添加到一个场景中的两个模型实体之一,但不能添加到另一个场景中。因为当您打印场景时,两个模型具有相同的根名称,但只有第一个获得手势。
看到这里的两个立方体,我可以将蓝色立方体拖到前面,但是当我尝试拖动绿色立方体时没有任何反应
import UIKit
import RealityKit
import SwiftUI
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
//private var myEntity: Entity?
typealias GstReady = Entity & HasCollision
//typealias ModelPack = ModelEntity & HasCollision
override func viewDidLoad() {
super.viewDidLoad()
let boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
let cubesAnchor = try! Experience.loadCubes()
arView.scene.anchors.append(cubesAnchor)
if let entity = cubesAnchor.findEntity(named: "simpBld_root") as? GstReady {
entity.generateCollisionShapes(recursive: false)
arView.installGestures([.all], for: entity)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
//self.arView.scene.anchors.removeAll()
let coneAnchor = try! Experience.loadCone()
self.arView.scene.anchors.append(coneAnchor)
print(cubesAnchor)
}
func handleTapOnEntity(_ entity: Entity?){
guard let entity = entity else { return }
//self.myEntity = entity
//self.myEntity?.isEnabled = false
}
}
}
查看相关问题这里
找到了答案,不是我一直在寻找的简单解决方法,而是一个解决方案。 我想找到一种方法来同时向给定场景中的所有模型实体添加手势,但据我所知,这是不可能的。
小组解决方案还不存在。
所以我不得不取消对象的组合,分别命名每个对象,然后分别声明每个对象。
加载场景
let cubesAnchor = 尝试!体验.loadCubes() arView.scene.anchors.append(cubesAnchor)
为场景生成碰撞形状
cubesAnchor.generateCollisionShapes(recursive: true)
为场景中的每个对象添加 Entity & HasCollision
let greenCubesGest = cubesAnchor.greenCube as? Entity & HasCollision
arView.installGestures(for: greenCubesGest!)
let blueCubesGest = cubesAnchor.blueCube as? Entity & HasCollision
arView.installGestures(for: blueCubesGest!)
完整代码如下。
import UIKit
import RealityKit
import SwiftUI
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
let cubesAnchor = try! Experience.loadCubes()
arView.scene.anchors.append(cubesAnchor)
cubesAnchor.generateCollisionShapes(recursive: true)
let greenCubesGest = cubesAnchor.greenCube as? Entity & HasCollision
arView.installGestures(for: greenCubesGest!)
let blueCubesGest = cubesAnchor.blueCube as? Entity & HasCollision
arView.installGestures(for: blueCubesGest!)
/**
cubesAnchor.generateCollisionShapes(recursive: true)
let allCubes= cubesAnchor.group as? Entity & HasCollision
arView.installGestures(for: allCubes!)
*/
/**
if let entity = cubesAnchor.findEntity(named: "simpBld_root") as? GstReady {
entity.generateCollisionShapes(recursive: false)
arView.installGestures([.all], for: entity)
}
*/
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
//self.arView.scene.anchors.removeAll()
let coneAnchor = try! Experience.loadCone()
self.arView.scene.anchors.append(coneAnchor)
print(cubesAnchor)
}
func handleTapOnEntity(_ entity: Entity?){
guard let entity = entity else { return }
//self.myEntity = entity
//self.myEntity?.isEnabled = false
}
}
}