Ukázka aplikace pro měření vzdálenosti s využitím senzoru LIDAR a knihovny RealityKit na zařízeních se systéme iOS.
Programový kód umožňuje uživateli vidět vzdálenost od kamery k bodu v prostoru, který byl detekován pomocí raycastu, což může být užitečné pro různé AR aplikace, jako je měření vzdáleností nebo umisťování objektů v prostoru.
import SwiftUI
import UIKit
import RealityKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
@IBOutlet weak var arView: ARView!
@IBOutlet weak var lblDistance: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
arView.automaticallyConfigureSession = false
arView.session.delegate = self
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
arView.debugOptions.insert(.showSceneUnderstanding)
arView.session.run(config, options: [])
}
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let centerPoint = CGPoint(x: arView.bounds.midX, y: arView.bounds.midY)
if let raycastResult = arView.raycast(from: centerPoint, allowing: .estimatedPlane, alignment: .any).first {
// Calculate the distance from the camera to the raycast result
let cameraTransform = frame.camera.transform
let cameraPosition = SIMD3<Float>(cameraTransform.columns.3.x, cameraTransform.columns.3.y, cameraTransform.columns.3.z)
let hitTestPosition = SIMD3<Float>(raycastResult.worldTransform.columns.3.x, raycastResult.worldTransform.columns.3.y, raycastResult.worldTransform.columns.3.z)
let distance = simd_distance(cameraPosition, hitTestPosition)
// Do something with the distance
lblDistance.text = "Distance: " + String(format: "%.2f", distance) + " m"
}
}
}
Zde je vysvětlení jednotlivých částí kódu:
příkazy načítají potřebné moduly.importaSwiftUIjsou frameworky pro vytváření uživatelského rozhraní,UIKitje framework pro práci s rozšířenou realitou aRealityKitje Apple framework pro rozšířenou realitu.ARKitje třída, která dědí odViewController. Implementuje protokolyUIViewControlleraARSCNViewDelegate, které umožňují reagovat na události spojené s AR scénou a AR session.ARSessionDelegatejsou speciální proměnné používané v Interface Builderu k propojení UI komponent z storyboardu s kódem.@IBOutletje pravděpodobně instancearView, což je pohled pro zobrazování AR obsahu, aARViewjelblDistancepro zobrazování vzdálenosti.UILabelje metoda volaná po načtení view controlleru, kde se nastavuje AR session a její konfigurace.viewDidLoad()je nastaveno naautomaticallyConfigureSession, což znamená, že session nebude automaticky konfigurována. Místo toho se používá manuálně nastavená konfiguracefalse, která umožňuje sledování polohy a orientace zařízení a rekonstrukci scény s klasifikací.ARWorldTrackingConfigurationnastavuje debugovací možnosti proarView.debugOptions.insert(.showSceneUnderstanding), aby zobrazovala vizuální pomůcky pro lepší pochopení scény, jako jsou například mřížky na detekovaných plochách.arViewspouští AR session s předem nastavenou konfigurací.arView.session.run(config, options: [])je metoda protokolusession(_:didUpdate:), která je volána pokaždé, když se aktualizuje frame AR session. V této metodě se provádí raycast ze středu obrazovky do scény, aby se zjistila přibližná poloha v prostoru, kam uživatel směřuje zařízení.ARSessionDelegate- Raycast vrací první výsledek, který je použit k výpočtu vzdálenosti od kamery k bodu v prostoru, kde raycast narazil.
- Vzdálenost je poté převedena na textový řetězec a zobrazena v
UILabel.lblDistance