Introduzione alla costruzione di esperienze di realtà aumentata con la realtàKit

Reality Augmented (AR) sovrappone il contenuto digitale al mondo fisico, creando esperienze interattive che si fondono con oggetti virtuali. Il framework RealityKit di Apple fornisce agli sviluppatori un API di alto livello per creare applicazioni AR per iOS. Questo articolo si espande sui fondamenti, coprendo l'installazione, l'architettura di entità-componente, l'interazione degli utenti, l'animazione, la fisica, la collaborazione e l'ottimizzazione.

Iniziare: Impostazione e requisiti del progetto

Per sviluppare applicazioni AR con RealityKit, è necessario Xcode 13 o versioni successive, un dispositivo iOS fisico con chip A9 o più recente (iPhones SE, 6s, e più tardi; iPads 5th gen e successivi), e un account Apple Developer per la prova. Il Simulatore iOS non supporta dati della fotocamera o del sensore, quindi il test di reale-dispositivo è essenziale.

Creare un nuovo progetto Xcode e selezionare il modello []]Augmented Reality App[]. Scegliere SwiftUI o UIKit a seconda della vostra preferenza – RealityKit funziona senza soluzione di continuità con entrambi. Il modello fornisce un e una configurazione di scena di base.

In alternativa, è possibile aggiungere manualmente RealityKit a un progetto esistente importando il framework:

import RealityKit
import ARKit

Assicurare che NSCameraUsageDescription[[]]] è impostato nel ] – una stringa facile da usare che spiega perché l'applicazione ha bisogno di accesso alla telecamera.

Per maggiori dettagli, fare riferimento alla documentazione RealityKit[] e ARKit documentazione.

Comprendere il sistema Entity-Component

RealityKit utilizza un'architettura Entity‐Component, fondamentale per la costruzione di scene. Un è un contenitore che contiene componenti. I componenti definiscono il comportamento, l'aspetto, la fisica e altre proprietà dell'entità. Ad esempio, un ] definisce una scala 3D, una [[FLT6]

Questo approccio modulare rende facile comporre oggetti complessi. Crea entità, allega componenti e sistemali in una gerarchia. La radice della scena è un (tipicamente un ), che lega il contenuto virtuale a una posizione reale rilevata da ARKit.

Creazione di un Ancoraggio e Aggiungere contenuti

L’ancora più comune è un’ancora di aereo, che collega il contenuto a superfici orizzontali o verticali. Ecco come posizionare un modello 3D su qualsiasi piano riconosciuto:

// 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)

È inoltre possibile creare ancoraggi in posizioni di mondo specifiche utilizzando [] o collegare contenuti a immagini o volti rilevati utilizzando o .

Costruire una scena AR di base con RealityKit

Oltre al semplice posizionamento del modello, è necessario gestire il ciclo di vita di visualizzazione AR. In un'app UIKit, aggiungere un al controller di vista:

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
 }
}

Per SwiftUI, incorporato un che ponti nella gerarchia SwiftUI.

Interazione utente: Gestures e Hit‐Testing

Per rendere interattiva l'app AR, è necessario gestire rubinetti, trascina e rotazioni degli utenti. RealityKit fornisce test di successo per identificare quale entità l'utente ha toccato.

Toccare per posizionare o interagire

Aggiungi un al ]. Nel gestionale, chiama per recuperare l'entità sotto il dito:

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)
}

Il Raycasting contro le superfici del mondo reale è più affidabile di quello che l'entità ha colpito-testing quando si desidera inserire il contenuto su un aereo.

Trascinare e ruotare con Gesti

Per attivare il drag, allegare un e aggiornare la posizione dell'entità lungo il piano. Per la rotazione, utilizzare un :

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)
}

Per una robusta implementazione, prendere in considerazione l'utilizzo dal pacchetto di RealityKit, o la proprietà di gesto in iOS 16+.

Caratteristiche avanzate: Animazioni, Fisica e Collaborazione

Animazioni

RealityKit supporta sia animazioni scheletriche (da file USDZ) che animazioni basate su proprietà.

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

È inoltre possibile animare trasformazioni, opacità o parametri personalizzati utilizzando il metodo [ precedentemente visto. Per sequenze complesse, utilizzare o .

Simulazione di fisica

Allegare un per attivare la gravità, collisioni e forze:

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)

La scatola cadrà sull'aereo e risponderà alle collisioni. Gli oggetti statici (come le pareti) dovrebbero avere .

Sessioni AR collaborative

Con le sessioni di collaborazione di ARKit, più dispositivi possono condividere lo stesso mondo AR. Abilitare la collaborazione impostando le opzioni di collaborazione della sessione:

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

Invia ad altri colleghi tramite un framework di rete (ad esempio, Multipeer Connectivity).La scena RealityKit di ogni dispositivo rimane sincronizzata.

Ottimizzazione delle prestazioni per le esperienze AR di Smooth

Le applicazioni AR richiedono alti frame rate (60 fps) per evitare la malattia del movimento.

  • Utilizzare modelli a basso contenuto di poli[[[]] e file USDZ ottimizzati. Tenere il vertex conta texture basse e usate le texture compresse (KTX o PNG).
  • Limit il numero di entità[] nella scena. Usa per debug contes.
  • Minimizzare le chiamate[] utilizzando l'istanziamento – condividere lo stesso modello tra più entità.
  • Aggiungi la qualità di rendering[[] con su dispositivi più vecchi.
  • Utilizza caricamento del modello[] per evitare il blocco del filo principale.
  • Manage the AR session lifecycle[[]: chiama [ quando l'app va sullo sfondo e ri-correre la configurazione in primo piano.

Per una guida dettagliata, vedere Apple ]Creare un'esperienza di AR immersiva[ e Testing e problemi di risoluzione della tua esperienza di AR[.

Progettazione di interfacce AR intuitive

L'esperienza dell'utente in AR differisce dalle applicazioni tradizionali. Seguire questi principi:

  • Risposte di rilevamento delle superfici[[]: Visualizza i piani rilevati con una griglia o un profilo in modo che gli utenti sappiano dove posizionare gli oggetti.
  • Le sensazioni dovrebbero essere naturali[: Utilizzare la manipolazione diretta (tap, drag, pignone) piuttosto che controlli astratti.
  • Provi suggerimenti visivi[[]: Evidenziare entità interattive o mostrare un balestra quando l'utente punta su un piano valido.
  • L'illuminazione di un maneggio[[[]]: RealityKit può valutare automaticamente la luce del mondo reale e applicarla agli oggetti virtuali.
  • Test in vari ambienti[[[]: Illuminazione, texture e dimensioni delle camere influenzano il tracciamento dell'AR.

Debug e Testing AR Apps

I test di reale necessità non sono negoziabili. Usare Xcode ARKit Debugging Features[[:

  • Abilita per mostrare punti di funzionalità, origine del mondo e fili di fisica.
  • Utilizzare log per vedere quando le superfici vengono rilevate.
  • Aggiungi un per monitorare lo stato di monitoraggio e gli errori.
  • Prova su più generazioni di dispositivi (ad esempio, iPhone 8 vs. iPhone 14 Pro) per misurare le prestazioni.

Per i test automatizzati dell'interfaccia utente, è possibile selezionare i dati dell'AR, ma il test manuale rimane essenziale per l'accuratezza.

Conclusioni

RealityKit astratti gran parte della complessità dello sviluppo di AR, ma la costruzione di un'esperienza lucida richiede attenzione all'architettura delle entità, all'interazione degli utenti, alle prestazioni e al design. Combinando le tecniche coperte – dalla configurazione della scena e dalla gestione dei gesti alla fisica e alla collaborazione – è possibile creare applicazioni AR che coinvolgono gli utenti e sfruttare il pieno potenziale dell'hardware iOS.