Table of Contents
Introducere în construirea de experiențe augmentate de realitate cu RealityKit
Realitatea extinsă (AR) suprapune conţinutul digital în lumea fizică, creând experienţe interactive care îmbină realitatea cu obiectele virtuale. Apple
Pregătirea proiectului și cerințele
Pentru a dezvolta aplicații AR cu RealityKit, aveți nevoie de Xcode 13 sau mai târziu, un dispozitiv iOS fizic cu un cip A9 sau mai nou (iPhone SE, 6s, și mai târziu; iPad-uri 5 gen și mai târziu), și un cont de Apple Developer pentru testare. Simulator iOS nu suportă camere sau senzori de date, astfel încât testarea real-dispozitiv este esențială.
Creați un nou proiect Xcode și selectați App de realitate extinsă[] șablon. Alegeți SwiftUI sau UIKit în funcție de preferințele dumneavoastră
Alternativ, puteți adăuga manual RealityKit la un proiect existent prin importul cadrului:
import RealityKit
import ARKit
Asiguraţi-vă că NSCameraDescriereUtilizare] este stabilită în ]
Pentru mai multe detalii, a se vedea Apple
Înțelegerea sistemului de entitate-component
RealityKit folosește o arhitectură Componentă de entitate, care este fundamentală pentru construirea scenelor. Un container este un recipient care deține componente. Componentele definesc comportamentul, aspectul, fizica și alte proprietăți ale entității. De exemplu, o definește o plasă 3D, o manipulează poziția/rotația/scala și o permite simularea fizicii.
Această abordare modulară face ușor de compus obiecte complexe. Creați entități, atașați componente și aranjați-le într-o ierarhie. Rădăcina scenei este o (de obicei o , care leagă conținutul virtual de o locație din lumea reală detectată de ARKit.
Crearea unui conţinut ancoră şi adăugarea
Cea mai comună ancoră este o ancoră plană, care ataşează conţinutul pe suprafeţe orizontale sau verticale. Aici se pune un model 3D pe orice plan recunoscut:
// 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)
De asemenea, puteți crea ancore la anumite poziții ale lumii folosind sau atașați conținut la imagini sau fețe detectate care utilizează sau .
Construirea unei scene AR de bază cu RealityKit
Dincolo de plasarea simplă a modelului, trebuie să gestionaţi ciclul de viaţă al vizualizării AR. Într-o aplicaţie UIKit, adăugaţi un la controlerul vizual:
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
}
}
Pentru SwiftUI, a introdus un care poduri ] în ierarhia SwiftUI.
Interacţiunea cu utilizatorul: Gesturi şi Testarea Hit
Pentru a face aplicaţia AR interactivă, trebuie să se ocupe de robinete de utilizator, trageri, şi rotaţii. RealityKit oferă hit-testare pentru a identifica ce entitate a atins utilizatorul.
Atingeți la locul sau la interacțiunea
Adăugaţi un la . În handler gest, apel pentru a prelua entitatea sub deget:
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)
}
Raidul împotriva suprafeţelor din lumea reală este mai fiabil decât testarea prin lovire a entităţii atunci când doriţi să plasaţi conţinutul pe un plan. Utilizaţi pentru aceasta.
Trageți și rotiți cu Gesturile
Pentru a activa dragul, atașați o și actualizați poziția entității de-a lungul planului. Pentru rotație, utilizați 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)
}
Pentru o implementare robustă, să ia în considerare utilizarea din pachetul RealityKits sau a pachetului de gesturi în iOS 16+.
Caracteristici avansate: Animaţii, Fizică şi Colaborare
Animații
RealityKit sprijină atât animații scheletice (din fișiere USDZ) cât și animații bazate pe proprietate. Pentru a declanșa o animație încorporat pe un model cu resurse de animație:
guard let model = try? ModelEntity.load(named: "dancing_character") else { return }
model.playAnimation(model.availableAnimations[0].repeat(duration: .infinity), transitionDuration: 0.5, startsPaused: false)
Puteți anima și transformările, opacitatea sau parametrii personalizați folosind metoda observată mai devreme. Pentru secvențe complexe, utilizați sau .
Simulare fizică
Ataşarea unei pentru a permite gravitaţia, coliziunile şi forţele:
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)
Cutia va cădea în plan şi va răspunde la coliziuni. Obiectele statice (ca pereţii) ar trebui să aibă .
Sesiuni AR colaborative
Cu sesiunile de colaborare ARKit . Multiple dispozitive pot partaja aceeași lume AR. Activați colaborarea prin setarea opțiunilor de colaborare sesiune:
config.collaborationEnabled = true
arView.session.run(config)
Trimite altor colegi prin intermediul unui cadru de rețea (de exemplu, Conectivitate Multipeer). Fiecare dispozitiv ți-a făcut o scenă RealityKit rămâne sincronizată. Acest lucru este ideal pentru jocuri multiplayer sau comentarii de design partajate.
Optimizarea performanței pentru experiențe AR netede
Aplicaţiile AR cer rate mari de cadru (60 fps) pentru a evita boala de mişcare. Urmează aceste practici:
- Folosiţi modele de poli scăzut şi optimizaţi fişierele USDZ. Păstraţi numărătoarele Vertex scăzute şi utilizaţi texturi comprimate (KTX sau PNG).
- Limiteți numărul de entități din scenă. Utilizați ] pentru a depana numărul de contor.
- Minimizează apelurile de tragere prin utilizarea instancing
- Adjust reding quality with [[ ] on old devices.
- Folosiţi încărcarea modelului pentru a preveni blocarea filetului principal.Încarcă modelele într-o coadă de fundal și prezintă-le când sunt gata.
- Managerează ciclul de viață al sesiunii AR : apel atunci când aplicația merge în fundal și re-rulează configurația pe prim plan.
Pentru orientări detaliate, a se vedea Apple
Proiectarea interfețelor AR intuitive
Experienţa utilizatorilor în AR diferă de aplicaţiile tradiţionale. Urmează aceste principii:
- Recepția de detectare a suprafeţei: Vizualizează avioanele detectate cu o grilă sau conturează astfel încât utilizatorii să știe unde să plaseze obiecte.
- Gesturile ar trebui să se simtă naturale: Folosiți manipularea directă (tap, drag, pinch) mai degrabă decât comenzi abstracte.
- Aluzii vizuale vizibile: Afișați entitățile interactive sau arătați un fir de păr atunci când utilizatorul indică un plan valid.
- Iluminarea mânerului: RealitateaKit poate estima automat lumina din lumea reală și o poate aplica obiectelor virtuale. Utilizați ] pentru a ajusta intensitatea.
- Test în diferite medii: diferite lumini, texturi și dimensiuni ale încăperilor afectează urmărirea AR. Optimizează pentru condiții medii.
Depanarea și testarea aplicațiilor AR
Testarea dispozitivului real nu este negociabilă. Utilizați Xcode
- Activați ] pentru a arăta puncte de caracteristici, origine mondială, și fire de fizică.
- Se utilizează loguri pentru a vedea când sunt detectate suprafețele.
- Se adaugă un pentru a monitoriza starea de urmărire și erorile.
- Test pe mai multe generații de dispozitive (de exemplu, iPhone 8 vs. iPhone 14 Pro) pentru a măsura performanța.
Pentru testarea automată UI, puteți să vă bateți joc de datele AR, dar testarea manuală rămâne esențială pentru precizie.
Concluzie
RealityKit abstractizează o mare parte din complexitatea dezvoltării AR, dar construirea unei experiențe lustruite necesită atenție la arhitectura entității, interacțiunea cu utilizatorul, performanța și designul. Prin combinarea tehnicilor acoperite