我正在将 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)
]
)
)