RealityKit - 错误的 ModelEntity 位置

RealityKit – Wrong ModelEntity position

我使用 RealityKit composer 在 RealityKit 文件中创建了一个简单的场景:

然后我创建了一个 arView 并将其添加到它的锚点我场景的锚点:

arView.scene.anchors.append(ARSceneViewModel().sceneAnchor)

我创建了一个 ARSceneViewModel class 来设置我的场景。

当我 运行 我的应用程序时,这是我看到的:

但是当我在 ARSceneViewModel 中动态更改实体的文本时:

我认为这些行有问题(可能是因为场景的层次结构):

private func updateScene() {
    self.sceneAnchor.text?.children[0].children[0].components.set(generateModelComponentForText(text: "Hello"))
}

这是场景的层次结构:

这里是更改实体文本的函数:

private func generateModelComponentForText(text: String, size: CGFloat = 0.02, extrusion: Float = 0.0003) -> ModelComponent {
    let mesh: MeshResource =  .generateText(text,
                                            extrusionDepth: 0.001,
                                            font: .systemFont(ofSize: 0.06),
                                            containerFrame: CGRect.zero,
                                            alignment: .center,
                                            lineBreakMode: .byWordWrapping)
    
    let material: [Material] = [SimpleMaterial(color: .black, isMetallic: true)]
    
    return ModelComponent(mesh: mesh, materials: material)
}

当我 运行 应用时:

好的,我没想到。我不明白为什么它不是文本实体不以场景为中心。我更改了它的文本,而不是它的位置。 有什么建议吗?

在这里你可以download the project。 (WeTransfer)

您可以使用以下逻辑轻松地将新文本居中:

import Cocoa
import RealityKit

class ViewController: NSViewController {
    
    @IBOutlet var arView: ARView!

    override func awakeFromNib() {
        arView.environment.background = .color(.black)
        
        let scenePlate = try! Experience.loadPlate()
        arView.scene.anchors.append(scenePlate)
        
        print(scenePlate)
        
        
        // Text replacement and centering
        let text = scenePlate.findEntity(named: "simpBld_text") as! ModelEntity
        
        text.model?.mesh = .generateText("Hello",
                                         extrusionDepth: 0.05,
                                         font: .systemFont(ofSize: 0.35))

        let boundingBox: BoundingBox? = text.model?.mesh.bounds
        let coord = ((boundingBox?.max)! - (boundingBox?.min)!) / 2
        text.position = -1 * [coord.x, coord.y, coord.z]
        text.position.y -= 0.07
    }
}

这是场景层次结构:

▿ '' : Plate, children: 1
  ⟐ SynchronizationComponent
  ⟐ Transform
  ⟐ AnchoringComponent
  ▿ '' : AnchorEntity, children: 2
    ⟐ SynchronizationComponent
    ⟐ Transform
    ⟐ AnchoringComponent
    ▿ '' : Entity, children: 1
      ⟐ SynchronizationComponent
      ⟐ Transform
      ▿ 'sign' : Entity, children: 4
        ⟐ SynchronizationComponent
        ⟐ Transform
        ▿ 'squareNoEditBorder_1' : Entity, children: 1
          ⟐ SynchronizationComponent
          ⟐ Transform
          ▿ 'simpBld_root' : ModelEntity
            ⟐ ModelComponent
            ⟐ SynchronizationComponent
            ⟐ Transform
        ▿ 'squareNoEditFace_1' : Entity, children: 1
          ⟐ SynchronizationComponent
          ⟐ Transform
          ▿ 'simpBld_root' : ModelEntity
            ⟐ ModelComponent
            ⟐ SynchronizationComponent
            ⟐ Transform
        ▿ 'squareNoEditGround_1' : Entity, children: 1
          ⟐ SynchronizationComponent
          ⟐ Transform
          ▿ 'simpBld_root' : ModelEntity
            ⟐ ModelComponent
            ⟐ SynchronizationComponent
            ⟐ Transform
        ▿ 'squareText_1' : Entity, children: 1
          ⟐ SynchronizationComponent
          ⟐ Transform
          ▿ 'simpBld_root' : Entity, children: 1
            ⟐ SynchronizationComponent
            ⟐ Transform
            ▿ 'simpBld_text' : ModelEntity
              ⟐ ModelComponent
              ⟐ SynchronizationComponent
              ⟐ Transform
    ▿ 'Ground Plane' : Entity
      ⟐ SynchronizationComponent
      ⟐ CollisionComponent
      ⟐ Transform
      ⟐ PhysicsBodyComponent