所以我将一个 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 }
}
}
}
查看相关问题这里
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)
}
}