1

我正在将 addChild 添加到一个自定义类,该类继承了我使用 RealityComposer 创建的实体,但该实体没有放置在点击位置,而是显示在屏幕中央。

我正在使用Apple 的协作会话创建的官方示例,并且到目前为止我已经完成了它。(它不使用 RealityComposer。)

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

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

我的猜测是这是因为使用 RealityComposer 创建的实体不符合 HasModel。

在这段代码中,实体始终位于屏幕的中心(我已经创建了一个 QRScene.rcproject。)

final class QRCardEntity: Entity, HasModel {
    let twitterCard = try! QRScene.loadTwitterCard ()
    var cardContainer: HasModel {
        twitterCard.allChildren().first { $0.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 { $0.name == "CardContainer" }! .children[0] as! HasModel
    }

    required init() {
        super.init()

        model = cardContainer.model
    }
}

使用的扩展

private extension Entity {
    func allChildren() -> [Entity] {
        children.reduce([]) { $0 + [$1] + $1.allChildren () }
    }
}

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

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

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


ps 2020/07/03

准确地说,当您点击 Device1 时,Entity 出现在中心,而 Device2 显示 Entity 异步居中,无论相机指向何处。

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

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

4

2 回答 2

0

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

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

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


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

于 2020-07-02T14:09:39.657 回答
0

我自己解决了。

原因是我将场景添加为孩子。

此代码用于加载 RealityComposer 创建的场景。 TwitterCard是场景名称。

let twitterCard = try! QRScene.loadTwitterCard()

场景名称显示在此处。

在此处输入图像描述

所以,正确的 ModelEntity 的名字在这里。我需要使用这个。

在此处输入图像描述

这加载正确。

addChild(twitterCard.cardObject!)

只写这个,它可以添加由 RealityComposer 创建的子实体。

我还有问题。

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

因为 twitterCard 没有添加到 ARView 的场景中。如果做不到这一点,就必须写很多动画代码。

需要的时候,我再写一篇,谢谢。

于 2020-07-05T14:47:05.537 回答