Introduktion till att bygga förstärkta verklighetsupplevelser med RealityKit

Augmented Reality (AR) överlagrar digitalt innehåll på den fysiska världen, skapar interaktiva upplevelser som blandar verkligheten med virtuella objekt. Apples RealityKit-ramverk ger utvecklare med en hög nivå, performant API för att bygga AR-appar för iOS. Denna artikel expanderar på grunderna, täcker inställning, enhetskomponentarkitektur, användarinteraktion, animation, fysik, samarbete och optimering. I slutet har du en praktisk förståelse för hur man skapar polerad AR-upplevelser med Swift och RealityKit.

Komma igång: Projektinställning och krav

För att utveckla AR-appar med RealityKit behöver du Xcode 13 eller senare, en fysisk iOS-enhet med ett A9-chip eller nyare (iPhones SE, 6s och senare; iPads 5th gen och senare) och ett Apple Developer-konto för testning. IOS Simulator stöder inte kamera- eller sensordata, så verklig-enhetstestning är viktigt.

Skapa ett nytt Xcode-projekt och välj ] Augmented Reality App ]] mall. Välj SwiftUI eller UIKit beroende på din preferens - RealityKit fungerar smidigt med båda. Mallen ger en ] och en grundläggande scenuppsättning.

Alternativt kan du manuellt lägga till RealityKit till ett befintligt projekt genom att importera ramverket:

import RealityKit
import ARKit

Se till att ] NSCameraUsageDescription är inställd i din - en användarvänlig sträng som förklarar varför appen behöver kameraåtkomst.

För mer information, hänvisa till Apples RealityKit dokumentation ] och ]]ARKit dokumentation].

Förstå Entity-Component System

RealityKit använder en ] Entity-Component ] arkitektur, som är grundläggande för att bygga scener. En ] är en behållare som håller komponenter. Komponenter definierar beteende, utseende, fysik och andra egenskaper hos företaget. Till exempel definierar en ] en 3D-nät, en hanterar position / rotation / skala, och en gör det möjligt för fys.

Denna modulära metod gör det enkelt att komponera komplexa objekt. Du skapar enheter, bifoga komponenter och ordna dem i en hierarki. Scenens rot är en (vanligtvis en ), som binder virtuellt innehåll till en verklig plats som upptäcktes av ARKit.

Skapa ett ankare och lägga till innehåll

Den vanligaste ankar är ett planankare, som fäster innehåll till horisontella eller vertikala ytor. Så här placerar du en 3D-modell på alla erkända plan:

// Load a USDZ model
guard let model = try? ModelEntity.load(named: "robot") else { return }

// Create an anchor on any horizontal plane
let anchor = AnchorEntity(plane: .horizontal, classification: .any, minimumBounds: [0.2, 0.2])

// Attach the model to the anchor
anchor.addChild(model)

// Add the anchor to the ARView’s scene
arView.scene.addAnchor(anchor)

Du kan också skapa ankare på specifika världspositioner med ] eller fästa innehåll för att upptäcka bilder eller ansikten med ] eller ]].

Bygga en grundläggande AR-scen med RealityKit

Utöver enkel modellplacering måste du hantera AR-vyns livscykel. I en UIKit-app, lägg till en till din visningskontroll:

class ViewController: UIViewController {
 @IBOutlet var arView: ARView!

 override func viewDidLoad() {
 super.viewDidLoad()
 arView.session.delegate = self
 // Configure session
 let config = ARWorldTrackingConfiguration()
 config.planeDetection = [.horizontal, .vertical]
 arView.session.run(config)
 loadContent()
 }

 func loadContent() {
 // Create and add anchors
 }
}

För SwiftUI, bädda in en ] som broar ] i SwiftUI hierarki.

Användarinteraktion: Gester och Hit-Testing

För att göra din AR-app interaktiv, måste du hantera användarna kranar, dras och rotationer. RealityKit ger hit-testning för att identifiera vilken enhet användaren rörde.

Tryck på att placera eller interagera

Lägg till till ]]. I gesthandlaren, ring för att hämta enheten under fingret:

arView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))))

@objc func handleTap(_ sender: UITapGestureRecognizer) {
 let location = sender.location(in: arView)
 if let entity = arView.entity(at: location) {
 // Scale the entity
 var transform = entity.transform
 transform.scale *= 1.2
 entity.move(to: transform, relativeTo: entity.parent, duration: 0.3, timingFunction: .easeInOut)
 } else {
 // Place a new object at the tapped location
 placeObject(at: location)
 }
}

func placeObject(at screenPoint: CGPoint) {
 let results = arView.raycast(from: screenPoint, allowing: .estimatedPlane, alignment: .any)
 guard let result = results.first else { return }
 let anchor = AnchorEntity(world: result.worldTransform)
 let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .blue, isMetallic: false)])
 anchor.addChild(box)
 arView.scene.addAnchor(anchor)
}

Raycasting mot verkliga ytor är mer tillförlitlig än entitetstestning när du vill placera innehåll på ett plan. Använd för detta.

Dra och rotera med gester

För att möjliggöra drag, bifoga en ] och uppdatera företagets position längs planet. För rotation, använd en :

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
arView.addGestureRecognizer(panGesture)

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
 let location = sender.location(in: arView)
 guard let entity = arView.entity(at: location) else { return }
 guard let parent = entity.parent as? HasAnchoring else { return }
 // Translate the entity in the anchor’s local plane
 let translation = sender.translation(in: arView)
 // ... (convert to 3D movement)
}

För ett robust genomförande, överväga att använda ] från RealityKits ] paket, eller gest egendom i iOS 16+.

Avancerade funktioner: Animationer, fysik och samarbete

Animationer

RealityKit stöder både skelettanimationer (från USDZ-filer) och fastighetsbaserade animationer. För att utlösa en inbyggd animation på en modell med animationsresurser:

guard let model = try? ModelEntity.load(named: "dancing_character") else { return }
model.playAnimation(model.availableAnimations[0].repeat(duration: .infinity), transitionDuration: 0.5, startsPaused: false)

Du kan också animera transformer, opacitet eller anpassade parametrar med ] metoden som ses tidigare. För komplexa sekvenser, använd eller ].

Fysik Simulering

Fäst en för att möjliggöra gravitation, kollisioner och krafter:

let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .red, isMetallic: false)])
box.position = [0, 0.5, 0] // above a plane

let physicsBody = PhysicsBodyComponent(
 massProperties: .default,
 material: .generate(staticFriction: 0.8, dynamicFriction: 0.5, restitution: 0.3),
 mode: .dynamic
)
box.components.set(physicsBody)

let collision = CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])
box.components.set(collision)
// Add box to anchor anchor.addChild(box)

Lådan kommer att falla på planet och svara på kollisioner. Statiska objekt (som väggar) bör ha .

Samarbetspartner AR Sessions

Med ARKits samarbetssessioner kan flera enheter dela samma AR-värld. Gör samarbete genom att sätta sessionens samarbetsalternativ:

config.collaborationEnabled = true
arView.session.run(config)

Skicka till andra kamrater via ett nätverksramverk (t.ex. Multipeer Connectivity) . Varje enhets RealityKit-scen är synkroniserad. Detta är idealiskt för multiplayer-spel eller delade designrecensioner.

Optimering av prestanda för Smooth AR upplevelser

AR-appar kräver höga ramhastigheter (60 fps) för att undvika rörelsesjukdom. Följ dessa metoder:

  • ] Använd lågpoly-modeller[] och optimerade USDZ-filer. Fortsätt att vertex räknas lågt och använda komprimerade texturer (KTX eller PNG).
  • ]] Lita på antalet enheter ] i scenen. Använd för att avvisa räkningar.
  • ]Minimera ritningssamtal genom att använda omedelbara åtgärder - dela samma modell över flera enheter.
  • Justera kvalitet med på äldre enheter.
  • ] Använd ] modellbelastning för att förhindra blockering av huvudtråden. Load modeller i en bakgrundskö och presentera dem när de är redo.
  • ]Hantera AR-sessionens livscykel : ring ] när appen går till bakgrunden och kör om konfigurationen på förgrunden.

För detaljerad vägledning, se Apples Skapa en uppslukande AR-upplevelse ] och ]] Testa och felsöka din AR-upplevelse ].

Designa intuitiva AR-gränssnitt

Användarupplevelse i AR skiljer sig från traditionella appar. Följ dessa principer:

  • ]Surface detection feedback: Visualisera upptäckta plan med ett rutnät eller skissera så att användarna vet var man ska placera objekt.
  • ]Gester bör känna sig naturliga: Använd direkt manipulation (tap, drag, nypa) snarare än abstrakta kontroller.
  • ]] Förse visuella tips: Höj interaktiva enheter eller visa ett kors när användaren pekar på ett giltigt plan.
  • ]]Handle belysning ]: RealityKit kan automatiskt uppskatta verkliga ljus och tillämpa det på virtuella objekt. Använd för att justera intensiteten.
  • ]Test i olika miljöer: Olika belysning, texturer och rumsstorlekar påverkar AR-spårning. Optimera för genomsnittliga förhållanden.

Debugging och testning AR Apps

Testning av verklig enhet är icke-förhandlingsbar. Använd Xcodes ]ARKit Debugging Funktioner :

  • Möjliggöra ] att visa funktionspunkter, världsuppkomst och fysik trådframställningar.
  • Använd loggar för att se när ytor upptäcks.
  • Lägg till en för att övervaka spårningstillstånd och fel.
  • Test på flera enhetsgenerationer (t.ex. iPhone 8 vs iPhone 14 Pro) för att mäta prestanda.

För automatisk UI-testning kan du håna AR-data, men manuell testning är fortfarande avgörande för noggrannhet.

Slutsats

RealityKit abstraherar mycket av komplexiteten i AR-utvecklingen, men att bygga en polerad upplevelse kräver uppmärksamhet på entitetsarkitektur, användarinteraktion, prestanda och design. Genom att kombinera de tekniker som täcks - från scenuppsättning och gesthantering till fysik och samarbete - du kan skapa AR-appar som engagerar användare och utnyttjar den fulla potentialen hos iOS-hårdvara. Håll dig uppdaterad med Apples utvecklande AR-ramverk och alltid testa på riktiga enheter för att säkerställa en sömlös, uppslukande upplevelse.