24/03/2023
Vítejte ve fascinujícím světě rozšířené reality (AR), kde se digitální obsah plynule prolíná s reálným světem. Díky frameworku ARKit od společnosti Apple se vývoj AR aplikací pro iOS stal dostupnějším a výkonnějším než kdykoli předtím. Tento komplexní průvodce vás provede celým procesem tvorby vlastní aplikace rozšířené reality, od základních konceptů až po pokročilé techniky optimalizace a ladění. Připravte se prozkoumat, jak můžete s ARKit oživit své kreativní nápady a nabídnout uživatelům iPhone a iPadu skutečně pohlcující zážitky.

Co je ARKit a proč ho používat?
ARKit je robustní framework pro iOS, který umožňuje vývojářům snadno vytvářet aplikace s rozšířenou realitou. Využívá pokročilé technologie, jako je vizuální inerciální odometrie (VIO), k přesnému sledování polohy zařízení ve fyzickém prostoru. To umožňuje aplikacím umisťovat virtuální objekty s neuvěřitelnou přesností a realističností do reálného světa.
Klíčové pojmy a terminologie
- Rozšířená Realita (AR): Překrytí digitálního obsahu na reálné prostředí, viditelné skrze obrazovku zařízení (např. iPhone). Umožňuje interakci s virtuálními objekty, které se jeví jako součást skutečného světa.
- Virtuální Realita (VR): Úplné ponoření do digitálního světa, obvykle s použitím speciálních náhlavních souprav, které blokují pohled na reálné prostředí.
- Smíšená Realita (MR): Kombinace AR a VR, kde se digitální objekty nejen překrývají, ale mohou také interagovat s reálným světem a na něj reagovat.
- 3D Modelování: Proces vytváření trojrozměrných digitálních reprezentací objektů.
- 3D Texturování: Aplikace obrázků (textur) na povrchy 3D modelů, které jim dodávají detail, barvu a realističnost.
- Odhad Světla (Light Estimation): Schopnost ARKit odhadnout světelné podmínky v reálném prostředí a přizpůsobit osvětlení virtuálních objektů tak, aby vypadaly přirozeně.
- Odhad Kamery (Camera Estimation): Sledování polohy a orientace kamery zařízení v reálném čase, což je základ pro přesné umístění virtuálních objektů.
ARKit vs. VR vs. MR: Srovnání
Pro lepší pochopení rozdílů mezi těmito technologiemi, podívejme se na srovnávací tabulku:
| Funkce | Rozšířená Realita (AR) | Virtuální Realita (VR) | Smíšená Realita (MR) |
|---|---|---|---|
| Ponoření | Částečné (digitální na reálném) | Úplné (pouze digitální) | Vysoké (digitální s interakcí reálného) |
| Zařízení | Smartphone/tablet (iPhone, iPad) | VR headset (Oculus, HTC Vive) | Pokročilé MR headsety (HoloLens) |
| Interakce s reálným světem | Ano | Ne | Ano (často s porozuměním prostředí) |
| Příklady použití | Hry (Pokémon GO), nábytek v místnosti, navigace | Hry, simulace, virtuální prohlídky | Průmyslový design, medicína, vzdálená spolupráce |
Jak ARKit funguje pod pokličkou?
ARKit využívá kombinaci senzorů a softwarových algoritmů k neustálému odhadování prostředí a následnému překrývání digitálního obsahu. Proces zahrnuje několik klíčových kroků:
- Sledování Polohy (Tracking): ARKit nepřetržitě sleduje polohu a orientaci zařízení v prostoru pomocí vizuální inerciální odometrie. To znamená, že kombinuje data z kamery (vizuální informace o rysech prostředí) a inerciálních senzorů (akcelerometr, gyroskop).
- Detekce Plochy (Plane Detection): Schopnost ARKit detekovat rovné povrchy v reálném světě, jako jsou podlahy, stoly nebo stěny. Na tyto detekované plochy lze pak umístit virtuální objekty.
- Odhad Světla (Light Estimation): ARKit analyzuje osvětlení scény pomocí kamery a odhaduje směr, intenzitu a barvu světla. Virtuální objekty jsou pak renderovány s osvětlením, které odpovídá reálnému prostředí, což výrazně zvyšuje realismus.
- Kotevní body (Anchors): Virtuální objekty jsou připojeny k tzv. kotevním bodům (ARAnchors), které ARKit udržuje v přesné poloze v reálném světě, i když se zařízení pohybuje.
- Renderování: Jakmile jsou data o prostředí a poloze k dispozici, ARKit (ve spojení se SceneKit nebo RealityKit) vykresluje 3D modely a textury na pohled z kamery zařízení pomocí grafické jednotky (GPU).
Co potřebujete k zahájení vývoje?
Než se pustíte do kódování, ujistěte se, že máte připravené následující nástroje a znalosti:
Hardware a Software
| Kategorie | Požadavek | Poznámky |
|---|---|---|
| Vývojové prostředí | Xcode 12 nebo novější | Nezbytné pro vývoj iOS aplikací. |
| Operační systém | macOS s kompatibilním procesorem | Xcode běží pouze na macOS. |
| Cílové zařízení | iPhone nebo iPad s iOS 14 nebo novějším a čipem A9 (nebo novějším) | Pro plné testování ARKit funkcí je nutné fyzické zařízení. Simulační prostředí má omezení. |
| Framework | ARKit 4 nebo novější | Je součástí iOS a Xcode. |
Potřebné znalosti
- Programovací jazyk: Swift (doporučeno) nebo Objective-C. Swift je moderní a preferovaný jazyk pro vývoj iOS.
- Základy iOS vývoje: Znalost UIKit (nebo SwiftUI), práce s ViewControllery, delegáty a základní správa paměti.
- 3D koncepty: Základní porozumění 3D souřadnicím, transformacím (rotace, posun, měřítko) a scénám.
- Volitelné nástroje:
- 3D modelovací software: Např. Blender (zdarma), Maya, Cinema 4D pro tvorbu vlastních 3D modelů.
- Software pro úpravu textur: Např. Adobe Photoshop, GIMP pro přípravu textur pro vaše 3D modely.
- Herní enginy: Unity nebo Unreal Engine s AR Foundation / AR Toolkit pro komplexnější AR aplikace, které vyžadují pokročilejší fyziku nebo vizuály.
Krok za krokem: Vytvoření AR aplikace
Následující kroky popisují základní proces implementace AR aplikace s ARKit a SceneKit (který je s ARKit často používán pro správu 3D scény).
Krok 1: Vytvoření nového projektu v Xcode
Začněte vytvořením nového projektu v Xcode. Zvolte šablonu Augmented Reality App , která automaticky nastaví základní strukturu s ARSCNView (ARKit a SceneKit View) a potřebnými konfiguracemi. To vám ušetří spoustu počátečního nastavení.
// Vytvořte nový projekt v Xcode // Zvolte šablonu: App -> iOS -> Augmented Reality App // Ujistěte se, že je vybrána technologie SceneKit nebo RealityKit pro zobrazení 3D obsahu.Krok 2: Nastavení ARKit session
Každá AR aplikace potřebuje ARSession, která spravuje sledování pohybu zařízení a detekci prostředí. Konfigurace session určuje, jaké funkce ARKit bude využívat (např. detekce rovin).
import ARKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.showsStatistics = true // Zobrazí statistiky ladění jako je FPS } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Konfigurace ARSession pro sledování světa a detekci horizontálních rovin let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal] configuration.environmentTexturing = .automatic // Zlepšuje realismus osvětlením // Spuštění AR session sceneView.session.run(configuration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Pozastavení AR session při opuštění zobrazení sceneView.session.pause() } }Krok 3: Vytvoření 3D modelů a textur
Vaše AR aplikace bude potřebovat 3D obsah. Můžete použít hotové 3D modely (např. ve formátu USDZ, který je pro ARKit optimalizovaný) nebo je vytvořit sami v 3D modelovacím softwaru. Textury pak dodají modelům vizuální detaily.
// Příklad vytvoření jednoduchého 3D modelu (krychle) v SceneKit let cubeGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.01) let material = SCNMaterial() material.diffuse.contents = UIColor.blue // Nastaví barvu krychle na modrou // Můžete také použít obrázek jako texturu: // material.diffuse.contents = UIImage(named: "mojeTextura.png") cubeGeometry.materials = [material] let cubeNode = SCNNode(geometry: cubeGeometry) cubeNode.position = SCNVector3(0, 0, -0.5) // Umístí krychli 0.5 metru před kameru // Přidání uzlu do scény // self.sceneView.scene.rootNode.addChildNode(cubeNode) Pro komplexnější modely je doporučeno importovat soubory jako .scn, .usdz, .obj nebo .dae, které vytvoříte v externích aplikacích.
Krok 4: Implementace odhadu kamery a osvětlení
ARKit automaticky provádí odhad polohy kamery a světelných podmínek. Tyto informace jsou klíčové pro realistické vykreslování virtuálních objektů. ARKit se snaží, aby virtuální objekty vypadaly, jako by byly přirozeně osvětleny v reálném světě.
// ARKit automaticky používá informace z kamery a světelných senzorů. // Světlo se obvykle přidává automaticky do scény pomocí SceneKit. // Pro pokročilejší ovládání osvětlení můžete použít ARLightEstimate: func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { if let lightEstimate = sceneView.session.currentFrame?.lightEstimate { // Zde můžete použít lightEstimate.ambientIntensity nebo lightEstimate.directionalLightEstimate // pro dynamickou úpravu osvětlení vašich virtuálních objektů. // Například, můžete upravit intenzitu světel ve scéně. } }Krok 5: Vytvoření interaktivních 3D objektů a scén
Aby vaše aplikace byla poutavá, virtuální objekty by měly reagovat na uživatelský vstup. Toho lze dosáhnout přidáním gest na ARSCNView a následnou interakcí s 3D uzly (SCNNode).
// Přidání 3D objektu na detekovanou plochu (příklad z ARSCNViewDelegate) func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { guard let planeAnchor = anchor as? ARPlaneAnchor else { return } // Vytvoření roviny pro vizualizaci detekované plochy let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z)) let planeNode = SCNNode(geometry: plane) planeNode.position = SCNVector3(planeAnchor.center.x, 0, planeAnchor.center.z) planeNode.eulerAngles.x = -.pi / 2 // Otočení roviny, aby byla horizontální node.addChildNode(planeNode) // Přidání vizualizace roviny k anchor uzlu // Zde můžete přidat váš vlastní 3D model na detekovanou plochu: // let customModelNode = SCNNode(geometry: SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0.0)) // customModelNode.position = SCNVector3(0, 0.1, 0) // Mírně nad rovinou // node.addChildNode(customModelNode) }Krok 6: Zpracování uživatelského vstupu a gest
Nejčastější interakcí v AR aplikacích je klepnutí na obrazovku pro umístění nebo manipulaci s objekty. Pomocí UITapGestureRecognizer a metody hitTest můžete zjistit, kam uživatel klepl v 3D prostoru.
// V ViewControlleru přidejte gesto do viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:))) sceneView.addGestureRecognizer(tapGesture) // Implementace metody pro zpracování klepnutí @objc func handleTap(recognizer: UITapGestureRecognizer) { let sceneView = recognizer.view as! ARSCNView let touchLocation = recognizer.location(in: sceneView) // Provedení hit testu pro nalezení existujících 3D objektů let hitTestResults = sceneView.hitTest(touchLocation, options: nil) if let firstResult = hitTestResults.first { // Uživatel klepl na existující 3D objekt print("Klepnutí na 3D objekt: \(firstResult.node.name ?? "Neznámý objekt")") // Zde můžete implementovat rotaci, změnu barvy, atd. firstResult.node.runAction(SCNAction.rotateBy(x: 0, y: CGFloat(GLKMathDegreesToRadians(360)), z: 0, duration: 2)) } else { // Uživatel klepl do prostoru, zkuste umístit objekt na detekovanou rovinu let hitTestResultsWithFeaturePoints = sceneView.hitTest(touchLocation, types: .estimatedHorizontalPlane) if let hitResult = hitTestResultsWithFeaturePoints.first { // Vytvořte nový objekt a přidejte ho na místo klepnutí let newObject = SCNNode(geometry: SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.01)) newObject.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z) newObject.name = "Nový Objekt" sceneView.scene.rootNode.addChildNode(newObject) print("Umístěn nový objekt na rovině.") } } }Nejlepší postupy a optimalizace
Pro vytvoření plynulé a vizuálně přitažlivé AR aplikace je klíčová optimalizace a dodržování osvědčených postupů.
Úvahy o výkonu
- Optimalizujte 3D modely a textury: Používejte modely s nízkým počtem polygonů (pokud to vizuální kvalita dovolí) a komprimované textury. Formát USDZ je pro ARKit vysoce optimalizovaný.
- Správa paměti: AR aplikace mohou být náročné na paměť. Uvolňujte zdroje, které již nepotřebujete (např. po skončení AR session).
- Efektivní renderování: Minimalizujte počet uzlů ve scéně. Používejte culling (odstranění neviditelných objektů z renderování) a level of detail (LOD) pro složité modely.
- Sledování FPS: Využívejte
sceneView.showsStatistics = truepro sledování snímkové frekvence (FPS) a dalších metrik výkonu během vývoje. Ideální je udržet FPS co nejblíže 60.
Bezpečnostní úvahy
- Ochrana uživatelských dat: Pokud vaše aplikace shromažďuje jakákoli uživatelská data (např. data o prostředí), zajistěte jejich zabezpečení šifrováním.
- Validace vstupu: Vždy ověřujte uživatelský vstup a gesta, abyste předešli bezpečnostním zranitelnostem nebo neočekávanému chování aplikace.
- Oprávnění: Jasně vysvětlete uživateli, proč vaše aplikace potřebuje přístup ke kameře.
Tipy pro organizaci kódu
- Konzistentní struktura adresářů: Udržujte svůj projekt uspořádaný pomocí logické struktury složek (např. Models, Views, Controllers, Utilities).
- Jasné a popisné názvy proměnných: Používejte názvy, které jasně vyjadřují účel proměnných, funkcí a tříd.
- Komentáře: Komentujte složitější části kódu, algoritmy nebo části, které by mohly být pro ostatní vývojáře nejasné.
- Modulární design: Rozdělte komplexní funkce do menších, znovupoužitelných modulů nebo tříd.
Časté chyby, kterým se vyhnout
- Slabé reference na ARSession, uzly: Ujistěte se, že držíte silné reference na klíčové objekty (jako je ARSession nebo SCNNodes), které potřebujete, aby zůstaly v paměti. Slabé reference mohou vést k neočekávanému uvolnění objektů a pádům aplikace.
- Ignorování chyb: Vždy implementujte robustní mechanismy pro zpracování chyb a neočekávaných stavů (např. ztráta sledování, nedostatečné osvětlení).
- Neoptimalizované modely: Používání neoptimalizovaných 3D modelů je nejčastější příčinou špatného výkonu.
- Nedostatečné testování: Netestování na různých zařízeních a v různých prostředích může vést k problémům u koncových uživatelů.
Testování a ladění AR aplikací
Testování je neodmyslitelnou součástí vývoje AR aplikací. Vzhledem k závislosti na reálném prostředí je nezbytné testovat na fyzickém zařízení.
Testování implementace
- Testujte na různých zařízeních: Chování ARKit se může mírně lišit na různých modelech iPhonu/iPadu kvůli rozdílům v senzorech a výkonu.
- Testujte v různých prostředích a světelných podmínkách: ARKit se spoléhá na vizuální informace, takže aplikace by měla fungovat spolehlivě v dobře osvětlených místnostech, venku i v méně ideálních podmínkách.
- Testujte výkon a bezpečnost: Sledujte FPS a spotřebu paměti. Zkuste záměrně vyvolat chyby nebo neplatný vstup, abyste otestovali mechanismy pro zpracování chyb.
Nástroje pro ladění v Xcode
- Xcode Debugger: Použijte standardní debugger pro krokování kódem a kontrolu hodnot proměnných.
- Xcode Console: Využijte
print()pro logování zpráv a výstupů ladění. - ARKit Debug Options:
sceneView.debugOptionsnabízí užitečné vizualizace, jako je detekce rovin, body sledování (feature points) a vizualizace orientace zařízení. Například:sceneView.debugOptions = [.showFeaturePoints, .showWorldOrigin]. - AR Session Observer: Implementujte metodu
session(_:didFailWithError:)v delegátu ARSession pro zachycení chyb ARKit. - Apple Developer Documentation: Oficiální dokumentace ARKit je neocenitelným zdrojem pro řešení běžných problémů a pochopení pokročilých funkcí.
Běžné problémy a řešení
| Problém | Možná příčina / Řešení |
|---|---|
| AR aplikace se nespustí nebo se nic nezobrazí. | Zkontrolujte stav ARSession. Ujistěte se, že je ARKit framework správně importován a že cílové zařízení podporuje ARKit (čip A9+ a iOS 14+). Zkontrolujte konfiguraci ARWorldTrackingConfiguration. |
| Virtuální objekty se neobjevují nebo mizí. | Zkontrolujte, zda ARSession běží. Ujistěte se, že objekty jsou správně přidány do scény a že jsou viditelné (jejich pozice není mimo rozsah kamery). Pro detekci rovin se ujistěte, že je povolena planeDetection a že je v prostředí dostatek textury pro ARKit, aby mohl roviny detekovat. |
| AR aplikace nereaguje na uživatelský vstup (klepnutí, gesta). | Ověřte konfiguraci UITapGestureRecognizer a zda je správně přidán k ARSCNView. Zkontrolujte metodu hitTest a její parametry. |
| Objekty se třesou nebo se posouvají. | Indikuje problémy se sledováním. Ujistěte se, že je v místnosti dostatečné osvětlení a dostatek vizuálních prvků pro sledování. Vyvarujte se rychlým a trhavým pohybům zařízení. |
| Nízká snímková frekvence (FPS). | Příliš mnoho polygonů ve 3D modelech, velké textury, mnoho světel nebo složité shadery. Optimalizujte 3D assety a snižte komplexnost scény. |
Často kladené otázky (FAQ)
Zde jsou odpovědi na některé běžné otázky, které mohou vyvstat při práci s ARKit.
Jaký je rozdíl mezi SceneKit a RealityKit pro AR?
SceneKit je 3D grafický framework od Applu, který existuje déle a je velmi flexibilní pro práci s 3D scénami. Je vhodný pro vývojáře, kteří preferují imperativní programování a mají zkušenosti s 3D grafikou. RealityKit je novější framework (představený s iOS 13), navržený speciálně pro AR, s důrazem na realismus, snadné použití a výkon. RealityKit je deklarativnější a lépe se integruje s USDZ formátem. Pro začátečníky nebo pro aplikace, které vyžadují vysoký realismus a plynulé animace, může být RealityKit lepší volbou. Pro složité interakce a vizuální efekty může být SceneKit stále výhodnější.
Proč se můj AR objekt neobjevuje?
Nejčastější důvody jsou:
- ARSession není spuštěna nebo je nesprávně nakonfigurována (např. chybí
configuration.planeDetection). - Objekt je umístěn mimo viditelné pole kamery. Zkuste ho umístit blízko středu obrazovky (např.
SCNVector3(0, 0, -0.5)). - ARKit nedokázal detekovat povrch pro umístění objektu. Zkuste skenovat okolí pomalými pohyby zařízení.
- Problém s importem 3D modelu (např. chybějící soubor nebo nesprávná cesta).
Jak mohu zlepšit výkon mé AR aplikace?
Kromě optimalizace 3D modelů a textur (snížení polygonů, komprese textur) můžete:
- Omezit počet objektů ve scéně.
- Vypnout nepoužívané funkce ARKit (např.
environmentTexturing, pokud ji nepotřebujete). - Používat efektivní shadery a materiály.
- Zajistit, aby ARSession nebyla pozastavena na pozadí.
- Sledovat statistiky výkonu v Xcode Debug Navigatoru.
Mohu použít ARKit pro více uživatelů?
Ano, ARKit podporuje multi-user AR zážitky, kde více uživatelů může sdílet stejný AR prostor. Toho se dosahuje sdílením mapy světa (world map) mezi zařízeními. Používá se k tomu ARSession.Collaboration a ARWorldMap. Tato funkce je ideální pro společné hry nebo aplikace pro spolupráci.
Jak ARKit ovlivňuje životnost baterie?
ARKit je poměrně náročný na systémové zdroje, protože neustále využívá kameru, senzory a GPU. To může mít významný dopad na životnost baterie. Pro minimalizaci spotřeby byste měli:
- Pozastavit
ARSession, když aplikace není v popředí nebo když AR funkce nejsou aktivně používány. - Optimalizovat výkon aplikace, aby se minimalizovalo zatížení GPU.
- Informovat uživatele o potenciální vyšší spotřebě baterie.
Závěr
Vývoj iOS aplikací s ARKit otevírá dveře k neuvěřitelně inovativním a poutavým uživatelským zážitkům. Od jednoduchých her až po komplexní vizualizační nástroje, možnosti jsou téměř nekonečné. S pochopením základních konceptů, osvojením si implementačních kroků a dodržováním osvědčených postupů můžete vytvářet funkční a vizuálně přitažlivé AR aplikace, které překračují hranice mezi digitálním a fyzickým světem. Pamatujte, že nejdůležitější je experimentovat a neustále se učit. Svět rozšířené reality se neustále vyvíjí, a s ARKit máte v rukou výkonný nástroj, jak být v čele této vzrušující revoluce v mobilních aplikacích.
Chceš-li si přečíst další články podobné jako ARKit na iOS: Vytvořte si vlastní AR aplikaci, navštiv kategorii iPhone.
