placementPose method

UArPose placementPose(
  1. UArHitResult hit
)

World pose for content placed on hit: upright and facing the camera on floors and tables, flat against walls.

Implementation

UArPose placementPose(UArHitResult hit) {
  final UArVector3 position = hit.pose.position;
  if (hit.isWall) {
    UArVector3 normal = hit.pose.up;
    final UArVector3 toCamera = controller.value.frame.camera.position - position;
    if (normal.dot(toCamera) < 0) normal = -normal;
    final UArVector3 flat = UArVector3(normal.x, 0, normal.z).normalized;
    final UArVector3 right = UArVector3.up.cross(flat).normalized;
    return UArPose(position: position, rotation: UArQuaternion.fromBasis(right, UArVector3.up, flat));
  }
  final UArVector3 toCamera = controller.value.frame.camera.position - position;
  return UArPose(position: position, rotation: UArQuaternion.yaw(atan2(toCamera.x, toCamera.z)));
}