Jednoduchá ukázka, jak používat AR Face Tracking ke sledování obličeje pomocí TrueDepth kamery.
V první řadě se nastaví soubor Main.storyboard tak, že bude obsahovat třídu ARSCNView. V horním pravém rohu programu Xcode, klikněte na znaménko +. Ve vyhledávacím poli zadejte počáteční řetězec třídy ARKit SceneKit View. Tento objekt přeneste do storyboardu.
je třída v rámci frameworku ARKit od Apple, která kombinuje funkce z ARKit a SceneKit, aby umožnila vývojářům snadno vytvářet rozšířenou realitu (AR) aplikace na iOS a iPadOS zařízeních.ARSCNView
Klíčové vlastnosti ARSCNView
:
ARSCNView
-
Integrace ARKit a SceneKit:
integruje sledování pohybu a analýzu scény z ARKit s vykreslováním 3D grafiky a animacemi z SceneKit. To umožňuje vývojářům vytvářet bohaté a interaktivní AR zážitky s použitím 3D modelů a animací.ARSCNView
-
Sledování pohybu:
automaticky sleduje pohyb zařízení a upravuje pozici a orientaci virtuálních objektů ve scéně tak, aby odpovídaly pohybům v reálném světě.ARSCNView
-
Detekce rovin a objektů:
může detekovat roviny a objekty v reálném světě a umožňuje vývojářům umístit virtuální objekty na tyto roviny nebo v interakci s reálnými objekty.ARSCNView
-
Osvětlení a stíny:
automaticky odhaduje osvětlení scény v reálném světě a aplikuje odpovídající osvětlení a stíny na virtuální objekty, což zvyšuje realismus AR zážitku.ARSCNView
-
Snadná integrace s UIKit: Jako UIView podtřída lze
snadno integrovat do stávajících UIKit aplikací, což umožňuje vývojářům přidávat AR funkce do svých aplikací bez potřeby rozsáhlých úprav kódu.ARSCNView
-
Podpora pro vlastní shadery a post-procesy:
umožňuje vývojářům používat vlastní shadery a post-procesové efekty, což dává větší kontrolu nad vzhledem a chováním virtuálních objektů ve scéně.ARSCNView
Jak používat ARSCNView
:
ARSCNView
-
Přidání
do vašeho UIViewControleru: Můžete přidatARSCNView
buď programově, nebo pomocí Interface Builderu.ARSCNView
-
Nastavení delegáta: Nastavte delegáta
, aby reagoval na události AR a SceneKit.ARSCNView
-
Konfigurace AR session: Vytvořte a nakonfigurujte instanci
(např.ARSessionConfiguration
) a spusťte AR session.ARWorldTrackingConfiguration
-
Přidání 3D obsahu: Použijte SceneKit k vytvoření a správě 3D modelů a animací, které chcete zobrazit v AR scéně.
-
Reakce na události AR: Implementujte metody delegáta, aby vaše aplikace reagovala na události AR, jako je detekce rovin, aktualizace polohy a orientace objektů a další.
poskytuje výkonný a flexibilní způsob, jak vytvářet působivé AR aplikace na iOS a iPadOS zařízeních, a je široce používán vývojáři pro vytváření her, vzdělávacích aplikací, nástrojů pro vizualizaci dat a mnoha dalších typů aplikací.ARSCNView
Do souboru ViewController.swift přidejte:
import UIKit
import ARKit
Vytvoření
v Xcode je proces, který vám umožňuje propojit uživatelské rozhraní definované ve storyboardu nebo xib souboru s kódem ve vaší třídě IBOutlet
. Tady je postup, jak vytvořit UIViewController
:IBOutlet
1. Otevřete svůj projekt v Xcode
Otevřete svůj projekt v Xcode a ujistěte se, že máte otevřený soubor storyboardu nebo xib, ve kterém chcete vytvořit
.IBOutlet
2. Otevřete Assistant Editor
- Klikněte na tlačítko "Assistant Editor" v pravém horním rohu Xcode. Tlačítko vypadá jako dva překrývající se obdélníky.
- Ujistěte se, že v levém panelu Assistant Editoru je otevřený váš soubor storyboardu nebo xib a v pravém panelu je otevřený soubor kódu třídy
, do které chcete vytvořitUIViewController
.IBOutlet
3. Vyberte prvek uživatelského rozhraní
V levém panelu klikněte na prvek uživatelského rozhraní, ke kterému chcete vytvořit
(např. tlačítko, štítek, zobrazení atd.).IBOutlet
4. Vytvořte IBOutlet
- Při držení klávesy
na klávesnici přetáhněte myší z vybraného prvku uživatelského rozhraní do kódu ve vaší tříděControl
v pravém panelu.UIViewController
- Pustěte myš a objeví se dialogové okno.
- Vyberte "Outlet" z nabídky "Connection".
- Zadejte název pro váš
. Tento název použijete v kódu pro odkazování na prvek uživatelského rozhraní.IBOutlet
- Klikněte na "Connect".
Výstup pojmenujete např. arView nebo sceneView:
Po dokončení těchto kroků byste měli vidět nový řádek kódu ve vaší třídě
, který vypadá nějak takto:UIViewController
@IBOutlet weak var arView: ARSCNView!
Dále přidejte funkce tak, aby kontroler vypadal následovně:
class ViewController: UIViewController {
@IBOutlet weak var arView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
guard ARFaceTrackingConfiguration.isSupported else {
fatalError("Face tracking is not supported on this device")
}
arView.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let config = ARFaceTrackingConfiguration()
arView.session.run(config)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
arView.session.pause()
}
}
Třída
je určena pro použití s ARKit a SceneKit pro sledování obličeje na zařízeních, které podporují tuto funkci.UIViewController
-
@IBOutlet weak var arView: ARSCNView!: Toto je propojení (IBOutlet) mezi kódem a uživatelským rozhraním v Interface Builderu.
je odkaz na instanciarView
, což je pohled, který zobrazuje 3D obsah a podporuje AR zážitky. Klíčové slovoARSCNView
znamená, že je to slabý odkaz, což znamená, že nezabraňuje automatickému uvolnění paměti (ARC) odstranění objektu, pokud na něj neodkazují žádné další silné odkazy.weak
-
override func viewDidLoad(): Tato metoda je volána, když je pohled načten do paměti. V této metodě se kontroluje, zda je sledování obličeje podporováno na zařízení. Pokud není, aplikace skončí s chybovou zprávou. Pokud je podporováno, nastaví se delegát
naarView
, což znamená, že tato třídaself
bude reagovat na události zViewController
.arView
-
) a spustí se AR session s touto konfigurací.override func viewWillAppear(_ animated: Bool): Tato metoda je volána těsně předtím, než se pohled stane viditelným na obrazovce. V této metodě se vytvoří konfigurace pro sledování obličeje (
ARFaceTrackingConfiguration
-
override func viewWillDisappear(_ animated: Bool): Tato metoda je volána, když pohled začíná být neviditelný. V této metodě se pozastaví AR session.
Celkově tento kód představuje základní nastavení pro aplikaci, která používá ARKit a SceneKit k sledování obličeje na zařízeních, které tuto funkci podporují.
Před spuštěním kódu se ještě musí povolit používání přední TrueDepth kamera. To se provede v souboru Info.plist, kde v navigátoru přidejte položku
. Ve výchozím nastavení by měl být typ Privacy - Camera Usage Description
. Do value zadejte popis, proč je použita přední kamera.String
Konfigurace sledování obličeje a související třídy Už jste se setkali s ARFaceTrackingConfiguration, což je nástroj pro nastavení zařízení k tomu, aby pomocí TrueDepth kamery sledovalo váš obličej. To je skvělé.
Nicméně, co dalšího byste měli vědět o sledování obličeje?
Existují tři klíčové třídy, které budete brzy využívat: ARFaceAnchor, ARFaceGeometry a ARSCNFaceGeometry.
ARFaceAnchor je odvozen od ARAnchor. Pokud jste již pracovali s ARKit, jistě víte, že ARAnchor je důvodem, proč je ARKit tak mocný a zároveň jednoduchý na použití. ARAnchor reprezentuje pozici ve fyzickém světě, kterou ARKit sleduje, a která zůstává stabilní i při pohybu telefonu. ARFaceAnchor navíc obsahuje informace specifické pro obličej, jako jsou topologie a výrazy obličeje.
ARFaceGeometry je přesně to, co název napovídá. Jedná se o 3D reprezentaci obličeje, včetně vrcholů (vertices) a texturovacích souřadnic (textureCoordinates).
ARSCNFaceGeometry využívá data z ARFaceGeometry k vytvoření SCNGeometry, což je objekt, který lze použít k vytváření uzlů v SceneKit – tedy toho, co vidíte na obrazovce.
Přidání síťové masky
Na první pohled to vypadá, že je zapnutá pouze přední kamera. Co však není vidět je, že iPhone již sleduje obličej.
Přidejte následující kód za uzavírací složenou závorkou třídy
:ViewController
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard let device = arView.device else {
return nil
}
let faceGeometry = ARSCNFaceGeometry(device: device)
let node = SCNNode(geometry: faceGeometry)
node.geometry?.firstMaterial?.fillMode = .lines
return node
}
func renderer(
_ renderer: SCNSceneRenderer,
didUpdate node: SCNNode,
for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}
faceGeometry.update(from: faceAnchor.geometry)
}
}
Tento kód definuje rozšíření (extension) třídy
, které implementuje dvě metody protokolu ViewController
. Toto rozšíření umožňuje třídě ARSCNViewDelegate
reagovat na události spojené s AR a SceneKit.ViewController
1. Metoda renderer(_:nodeFor:)
renderer(_:nodeFor:)
Tato metoda je volána, když ARKit detekuje nový kotvu (
) a potřebuje vytvořit ARAnchor
pro její vizualizaci.SCNNode
: Nejprve se zkontroluje, zda je k dispozici zařízení proguard let device = arView.device else { return nil }
. Pokud ne, metoda vrátíarView
.nil
: Vytvoří se nová instancelet faceGeometry = ARSCNFaceGeometry(device: device)
pro dané zařízení.ARSCNFaceGeometry
je třída, která reprezentuje 3D geometrii obličeje.ARSCNFaceGeometry
: Vytvoří se novýlet node = SCNNode(geometry: faceGeometry)
s geometrií obličeje.SCNNode
: Nastaví se vzhled geometrie tak, aby se zobrazovala pouze jako síť čar, nikoli jako plný povrch.node.geometry?.firstMaterial?.fillMode = .lines
: Vrátí se vytvořený uzel.return node
2. Metoda renderer(_:didUpdate:for:)
renderer(_:didUpdate:for:)
Tato metoda je volána, když se aktualizuje stav kotvy (
) a je potřeba aktualizovat odpovídající ARAnchor
.SCNNode
: Nejprve se zkontroluje, zda je kotva typuguard let faceAnchor = anchor as? ARFaceAnchor, let faceGeometry = node.geometry as? ARSCNFaceGeometry else { return }
a zda geometrie uzlu je typuARFaceAnchor
. Pokud ne, metoda se ukončí.ARSCNFaceGeometry
: Aktualizuje se geometrie uzlu na základě aktuální geometrie obličeje získané z kotvy.faceGeometry.update(from: faceAnchor.geometry)
Celkově tento kód umožňuje aplikaci sledovat obličej uživatele v reálném čase a zobrazovat jeho 3D model jako síť čar.
Celkový kód
import UIKit
import ARKit
class ViewController: UIViewController {
@IBOutlet weak var arView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
guard ARFaceTrackingConfiguration.isSupported else {
fatalError("Face tracking is not supported on this device")
}
arView.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let config = ARFaceTrackingConfiguration()
arView.session.run(config)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
arView.session.pause()
}
}
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard let device = arView.device else {
return nil
}
let faceGeometry = ARSCNFaceGeometry(device: device)
let node = SCNNode(geometry: faceGeometry)
node.geometry?.firstMaterial?.fillMode = .lines
return node
}
func renderer(
_ renderer: SCNSceneRenderer,
didUpdate node: SCNNode,
for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
return
}
faceGeometry.update(from: faceAnchor.geometry)
}
}
Literatura:
https://www.kodeco.com/5491-ar-face-tracking-tutorial-for-ios-getting-started