我想添加 RealityComposer 创建的实体

I want to addChild the Entity created by the RealityComposer

我将 addChild 添加到继承了我用 RealityComposer 创建的实体的自定义 class,但该实体并未放置在点击的位置,而是显示在屏幕中央。

我正在使用 official sample by Apple of collaborative session creation 并且到目前为止我已经完成了。 (它不使用 RealityComposer。)

例如,点击实体会将其放置在该位置。

但是,当我向场景中添加一个实体时,例如一个容器是一个由 RealityComposer 创建的实体的 addChild,它总是出现在中间。

我猜这是因为用 RealityComposer 创建的实体不兼容 HasModel。

在此代码中,实体始终位于屏幕中央 (我已经创建了 QRScene.rcproject。)

final class QRCardEntity: Entity, HasModel {
    let twitterCard = try! QRScene.loadTwitterCard ()
    var cardContainer: HasModel {
        twitterCard.allChildren().first { [=10=].name == " CardContainer" }! .children[0] as! HasModel
    }

    required init() {
        super.init()

        addChild(twitterCard) // preservingWorldTransform: true does not change this.
    }
}

但是,这段代码把它放在了正确的位置。

final class QRCardEntity: Entity, HasModel {
    let twitterCard = try! QRScene.loadTwitterCard ()
    var cardContainer: HasModel {
        twitterCard.allChildren().first { [=11=].name == "CardContainer" }! .children[0] as! HasModel
    }

    required init() {
        super.init()

        model = cardContainer.model
    }
}

使用的扩展程序

private extension Entity {
    func allChildren() -> [Entity] {
        children.reduce([]) { [=12=] + [] + .allChildren () }
    }
}

我认为这不是最好的方法。

AddChild 是添加整个实体同时保留层次关系的更好方法。 此模型分配只能添加顶级层次结构中的模型,因此不会添加显示所需的其他模型。

如何使用 addChild 使 RealityComposer 创建的实体出现在正确的位置?


ps 2020/07/03

准确地说,当你点击Device1时,Entity出现在中间, 无论相机指向何处,Device2 都会异步居中显示实体。

而不是由 RealityComposer 创建的实体,使用这样的代码,它可以工作。

addChild(
  ModelEntity(
    mesh: .generateBox(size: 0.1),
    materials: [
      SimpleMaterial(color: color ?? .white, isMetallic: false)
    ]
  )
)

如果位置已经为零,您可以尝试这样的操作,它可能看起来正确,但是您的实体的位置可能有点来回:

twitterCard.position = -twitterCard.visualBounds(relativeTo: nil).center

这可能需要一些调整,但希望意图是明确的。


我在理解 Reality Composer 赋予实体的层次结构时遇到了问题,这就是我避免使用它的原因。

我自己解决了

原因是因为我添加的场景是child.

这段代码是加载RealityComposer创建的场景。 TwitterCard 是场景名称。

let twitterCard = try! QRScene.loadTwitterCard()

场景名称在此处显示。

所以,ModelEntity 的名称是正确的。 我需要使用它。

此加载正确。

addChild(twitterCard.cardObject!)

只写这个,可以添加childRealityComposer创建的Entity

我还有问题。

我无法post通知由 RealityComposer 创建的移动动作。

因为twitterCard没有添加到ARView的场景中。如果做不到这一点,我们必须编写大量的动画代码。

需要时,我再创建一个 post,谢谢。