Как установить сущность перед экраном с помощью Reality Kit? - PullRequest
0 голосов
/ 12 октября 2019

Новое преобразование камеры из комплекта реальности кажется вводящим в заблуждениеКогда я устанавливаю преобразование объекта на камеру, оно не следует за передней частью экрана, вместо этого оно всегда близко к исходному миру. Раньше в scnview был pointOfView. Что я должен сделать, чтобы создать тот же эффект

1 Ответ

1 голос
/ 15 октября 2019

Если вы хотите, чтобы объект следовал за камерой и всегда находился перед камерой, самый простой способ добиться этого - использовать AnchorEntity:

    let box = ModelEntity(
      mesh: MeshResource.generateBox(size: 0.05),
      materials: [SimpleMaterial(color: .red, isMetallic: true)]
    )

    let cameraAnchor = AnchorEntity(.camera)
    cameraAnchor.addChild(box)
    arView.scene.addAnchor(cameraAnchor)

    // Move the box in front of the camera slightly, otherwise
    // it will be centered on the camera position and we will
    // be inside the box and not be able to see it
    box.transform.translation = [0, 0, -0.5]

Однако, если вы хотите использовать свойство cameraTransformмне показалось, что это нормально работает:

var c: Cancellable?
var boxAnchor: AnchorEntity?

struct ARViewContainer: UIViewRepresentable {

  func makeUIView(context: Context) -> ARView {

    let arView = ARView(frame: .zero)

    let box = ModelEntity(
      mesh: MeshResource.generateBox(size: 0.05),
      materials: [SimpleMaterial(color: .red, isMetallic: true)]
    )

    boxAnchor = AnchorEntity(world: [0,0,0])
    arView.scene.addAnchor(boxAnchor!)
    boxAnchor!.addChild(box)

    c = arView.scene.subscribe(to: SceneEvents.Update.self) { (event) in
      guard let boxAnchor = boxAnchor else {
        return
      }

      // Translation matrix that moves the box 1m in front of the camera
      let translate = float4x4(
        [1,0,0,0],
        [0,1,0,0],
        [0,0,1,0],
        [0,0,-1,1]
      )

      // Transformed applied right to left
      let finalMatrix = arView.cameraTransform.matrix * translate

      boxAnchor.setTransformMatrix(finalMatrix, relativeTo: nil)

    }

    return arView

  }

    func updateUIView(_ uiView: ARView, context: Context) {}
}
...