如何使一个 Reality Composer 场景中的分组对象可拖动?

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

所以我将一个 Reality Composer 文件“Experience”加载到一个包含三个场景的 XCode 项目中。

我添加了适用于 XCode 的行为和动作。当我点击不同的对象时,这些动作完美地隐藏和显示了另外两个场景。

但是在一个名为“立方体”的场景中,我添加了两个立方体。我将这两个立方体分组为“twoCubes”,根据 Apple 的文档,它们现在将表现为单个对象:

您可以将场景中的多个资产组合成一个组。分组 对象在 Reality Composer 的场景中表现为单个组合对象 查看.

这个场景没有关联的动作,我只想让两个立方体在我捏的时候可以拖动和缩放。我没能做到这一点。即使我以不同的方式命名每个立方体,也没有任何反应。

我怀疑它与对象分组时发生的事情有关 [参考 Apple 文档 here ] 但我一直无法找到解决方案。我看了很多来自常驻天才 Andy Jazz 的答案,他是这方面的专家,但什么都没有......我这样做是因为我有一个更大的模型,我正在处理我自己的应用程序,它有每个场景大约 20 个孩子......所以我希望我能在这里找到一个解决方案,我可以在以后用于更大的东西......

我尝试了多个 Reality Composer 模型,在我的手机上查看现实文件时我可以拖动这些模型,但是一旦我将场景导入 Xcode 模型后该功能就被删除了。

我什么都试过了,包括一个立方体……拖拽也不行。

import UIKit
import RealityKit

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)
                   
        guard let addingGestures = cubesAnchor.twoCubes as? ModelEntity else { return }
        addingGestures.generateCollisionShapes(recursive: true)
        arView.installGestures([.all], for: addingGestures as (Entity & HasCollision))            
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
            self.arView.scene.anchors.removeAll()
            let coneAnchor = try! Experience.loadCone()
            self.arView.scene.anchors.append(coneAnchor)                
            print(coneAnchor)                
        }
        
        func handleTapOnEntity(_ entity: Entity?) {
            guard let entity = entity else { return }  
        }
    }
}

查看相关问题这里

swift collision-detection uitapgesturerecognizer realitykit reality-composer
1个回答
0
投票

Models Grouping
到底是什么意思

在 Reality Composer 和 RealityKit 中,将多个对象组合在一起意味着将多个子对象组合在单父项下(即

parenting
op)。分组的对象可以使用它们的父实体同时移动、旋转和缩放。然而,这不能应用于物理——换句话说,碰撞、各种动力、光线投射和三种类型的 RealityKit 手势(EntityGestureRecognizer)。

正如您所写,这在docs中明确说明。

如果你在你的场景中启用了物理,分组的对象仍然表现得像单独的、单独的对象。

因此,默认情况下,当您对一组应用相应的

draggable
scalable
手势时,您不能将两个立方体
pan
/
pinch
。不过,有一种解决方法。

解决方法

在 RealityKit 中,创建一个空组作为 ModelEntity。使其 CollisionShape 大于两个模型。在这种情况下,您可以使用

pan
rotate
pinch
手势一次控制多个对象。您可以生成 collision shape 作为
box
,
sphere
,
capsule
, and
convex
.

import UIKit
import RealityKit

class ViewController: UIViewController {
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.arView.debugOptions = .showPhysics
        
        let sph01 = ModelEntity(mesh: .generateSphere(radius: 0.05))
        sph01.position.x = -0.1
        let sph02 = ModelEntity(mesh: .generateSphere(radius: 0.05))
        sph02.position.x = 0.1
    
        let group = ModelEntity() as ModelEntity & HasCollision
        group.addChild(sph01)
        group.addChild(sph02)
        
        group.generateCollisionShapes(recursive: false)
        self.arView.installGestures(.all, for: group)
        
        let shape = ShapeResource.generateSphere(radius: 0.16)
        let collision = CollisionComponent(shapes: [shape],
                                             mode: .trigger,
                                           filter: .sensor)    
        group.components.set(collision)
        
        let anchor = AnchorEntity()
        anchor.addChild(group)
        anchor.scale = [5,5,5]
        arView.scene.anchors.append(anchor)    
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.