Получение поворота ARAnchor от якорей didAdd - PullRequest
0 голосов
/ 14 октября 2019

Поэтому я использую session(_ session: ARSession, didAdd anchors: [ARAnchor], чтобы получить все обнаруженные самолеты (я не могу использовать renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor), потому что я использую RealityKit вместо ARKit).

Итак, мой вопрос: как я могу получить вращение обнаруженного якоря из этого метода? Я хочу создать плоскую сущность, которая имеет точно такое же положение, размер, ориентацию и вращение обнаруженного якоря. Пока что я использую экстент для размера, центр для позиции, но я не могу понять, как получить вращение. Потому что прямо сейчас он определен правильно (правильное положение и размер), но с неправильным вращением, что реальная плоскость.

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете получить положение и ориентацию ARPlaneAnchor из его свойства transform, а затем использовать его для визуализации ограничивающей плоскости в RealityKit.

extension float4x4 {

  /// Returns the translation components of the matrix
  func toTranslation() -> SIMD3<Float> {
    return [self[3,0], self[3,1], self[3,2]]
  }

  /// Returns a quaternion representing the 
  /// rotation component of the matrix
  func toQuaternion() -> simd_quatf {
    return simd_quatf(self)
  }
}

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {

  guard let planeAnchor = anchors[0] as? ARPlaneAnchor else {
    return
  }

  // NOTE: When the ARPlaneAnchor is first created its transform
  // contains the position and the plane.center == [0,0,0]. On updates
  // the plane.center will change as the extents of the plane change.
  let position = planeAnchor.transform.toTranslation()
  let orientation = planeAnchor.transform.toQuaternion()

  // The center is a position before the orientation is taken in to
  // account, so we need to rotate it  to get the true position before
  // we add it to the anchors position
  let rotatedCenter = orientation.act(planeAnchor.center)

  // You have a ModelEntity that you created earlier
  // e.g. modelEntity

  // Assuming you added the entity to an anchor that is just 
  // fixed at 0,0,0 in the world, or you created a custom entity
  // with HasAnchor set to 0,0,0
  modelEntity.transform.translation = position + rotatedCenter
  modelEntity.transform.rotation = orientation

  // Doesn't seem to be a way to update meshes in RealityKit so
  // just create a new plane mesh for the updated dimensions
  modelEntity.model?.mesh = MeshResource.generatePlane(
    width: planeAnchor.extent.x, 
    depth: planeAnchor.extent.z
  )
}
...