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.import
aSwiftUI
jsou frameworky pro vytváření uživatelského rozhraní,UIKit
je framework pro práci s rozšířenou realitou aRealityKit
je Apple framework pro rozšířenou realitu.ARKit
je třída, která dědí odViewController
. Implementuje protokolyUIViewController
aARSCNViewDelegate
, které umožňují reagovat na události spojené s AR scénou a AR session.ARSessionDelegate
jsou speciální proměnné používané v Interface Builderu k propojení UI komponent z storyboardu s kódem.@IBOutlet
je pravděpodobně instancearView
, což je pohled pro zobrazování AR obsahu, aARView
jelblDistance
pro zobrazování vzdálenosti.UILabel
je 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í.ARWorldTrackingConfiguration
nastavuje 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.arView
spouš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