iOS 向け拡張現実デベロッパー ガイド

独自のアプリで拡張顔を使用する方法をご覧ください。

Prerequisites

顔の拡張機能を利用するには、以下が必要です。

  • Xcode バージョン 10.3 以降

  • Cocoapods

  • iOS 11.0 以降を搭載した ARKit 対応 Apple デバイス(iOS 10.0 以降の導入対象)

サンプルアプリをビルドして実行する

詳細な手順については、クイックスタートをご覧ください。

  1. GitHub から ARCore SDK for iOS のクローンを作成するか、ダウンロードして、サンプルアプリのコードを取得します。
  2. ターミナル ウィンドウを開き、Xcode プロジェクトが存在するフォルダから pod install を実行します。
  3. Xcode バージョン 10.3 以降でサンプルアプリを開き、デバイスを USB 経由で開発マシンに接続します。ビルドエラーを回避するには、.xcodeproj ファイルではなく .xcworkspace ファイルからビルドしていることを確認してください。
  4. Cmd+R キーを押すか、Run をクリックします。顔の拡張機能を使用するには、シミュレータではなく物理デバイスを使用します。
  5. [OK] をタップすると、カメラがサンプルアプリにアクセスできます。アプリは前面カメラを開き、すぐにカメラフィードで顔を追跡します。キツネの耳の画像を前頭の両側に置き、キツネの鼻を自分の鼻の上に置きます。

拡張顔をアプリに実装する方法の概要

*.scn ファイルを Xcode にインポートする

テクスチャや 3D モデルなどの独自のアセットを、アプリ内で検出された顔に追加するには、*.scn アセットを Xcode にドラッグします。

顔の拡張セッションを初期化する

アプリから Augmented Faces API を使用するには、拡張顔セッションを初期化します。このセッションでは 60 fps でカメラ画像を取り込んで、顔の更新をデリゲート メソッドに非同期で返します。初期化するときは、キャプチャ デバイスの視野を渡して、デリゲートを必ず設定します。

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

カメラ画像をセッションに渡す

セッションが初期化され、設定が完了したので、アプリからカメラ画像の送信を開始できます。サンプルアプリは、前面カメラからの動画フレームを含む AVCaptureSession を作成して、カメラ画像を取得します。

次のコードサンプルでは、AVFoundation のキャプチャ出力デリゲート メソッドの実装を示しており、画像、タイムスタンプ、認識ローテーションを顔のセッションに渡します。

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

画像の処理が完了すると、Augmented Faces API が GARAugmentedFaceFrame を返すデリゲートのコールバックを送信します。顔に効果を付けるのに役立つ、拡張顔オブジェクトが含まれています。また、更新メソッドに渡した画像バッファとタイムスタンプも格納されています。これは顔効果を画像に同期させる場合に便利です。また、このオブジェクトは、変換された 3D 世界と 2D ビューを、検出された顔に付随して簡単にレンダリングできる状態に設定するために役立つディスプレイ変換と投影マトリックスを提供します。

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

顔のメッシュの向き

iOS の顔メッシュの向きに注意してください。

2D テクスチャを顔に適用する

サンプルアプリには、拡張顔を SCNGeometry オブジェクトに変換するクラスが用意されています。このジオメトリを使用すると、SceneKit ノードに簡単に添付できます。SceneKit ノードは、拡張顔のセンター変換に配置します。

let faceNode = SCNNode()

// Gets the most recent frame's face
let face = faceSession.currentFrame?.face

// This is instantiated once, not with every frame
let faceGeometryConverter = FaceMeshGeometryConverter()

// Converts Augmented Face to SCNGeometry object
let faceMesh = faceGeometryConverter.geometryFromFace(face)

// Assigns geometry to node and sets the pose
faceNode.geometry = faceMesh
faceNode.simdTransform = face.centerTransform

2D の顔テクスチャは UIImage として読み込まれ、顔メッシュのジオメトリにアタッチされたマテリアルに設定されます。

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

3D オブジェクトを顔に接続する

デリゲートのコールバックから受け取った GARAugmentedFace は、3 つの異なるリージョン(変換)を提供します。これを使用して、顔にコンテンツをアタッチできます。これらの変換により、ワールド空間において、鼻、額の右側、額の右側を取得できます。ここでは、球を鼻にアタッチするためにノーズ変換を使用しています。

// Create node and add to scene
let node = SCNNode(geometry: SCNSphere(radius: .02))
sceneView.rootNode.addChild(node)

// Every frame updates the node's position
node.simdWorldTransform = session.currentFrame.face.transform(for: .nose)

独自のアセットを Xcode にインポートする

テクスチャや 3D モデルなどのアセットをアプリで検出された顔に追加するには、まずアセットを Xcode にインポートします。

  1. *.dae(3D モデル)ファイルをエクスポートします。
  2. *.dae ファイルを Xcode プロジェクトにドラッグします。
  3. Xcode で Editor > Convert to SceneKit scene file format (.scn) に移動して、ファイルを .scn 形式に変換します。