在一个 Reality Composer 场景中向所有模型实体添加手势,而不仅仅是一个?

问题描述 投票:0回答:1

所以我之前问了一个不同的问题,并得出了部分解决方案。我能够将手势添加到一个场景中的两个模型实体之一,但不能添加到另一个场景中。因为当您打印场景时,两个模型具有相同的根名称,但只有第一个获得手势。

看到这里的两个立方体,我可以将蓝色立方体拖到前面,但是当我尝试拖动绿色立方体时没有任何反应

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
            
            
            
        }
        
        
        
        
    }
    
    
    
    
}

查看相关问题这里

entity uigesturerecognizer gesture realitykit reality-composer
1个回答
0
投票

找到了答案,不是我一直在寻找的简单解决方法,而是一个解决方案。 我想找到一种方法来同时向给定场景中的所有模型实体添加手势,但据我所知,这是不可能的。

小组解决方案还不存在。

所以我不得不取消对象的组合,分别命名每个对象,然后分别声明每个对象。

加载场景

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
            
            
            
        }
        
        
        
        
    }
    
    
    
    
}
© www.soinside.com 2019 - 2024. All rights reserved.