Help us understand the problem. What is going on with this article?

iOSでUSDZファイルのAR表示(AR Quick Look)

はじめに

WWDC2018で発表されたusdz形式のファイルでのAR表示(AR Quick Look)についてまとめます。

  • USDZとは
  • 対応機種
  • Quick Look表示のイメージ
  • Webコンテンツ内にUSDZファイルを配置する方法
  • ネイティブアプリでAR表示する場合の方法
    • WKWebViewでの表示は未対応
    • SFSafariViewControllerで表示する場合
    • QLPreviewControllerで表示する場合
  • サンプルリポジトリ

usdzとは

  • 3Dデータ用のファイル形式
  • ピクサーが2013に発表したUSD形式の改良版
  • iOS12以降の対応機種であればブラウザやネイティブアプリでQuick Look表示が可能

対応機種

iOSでの対応機種は以下のようになっています。

  • iPhone 6s以降
  • すべてのiPad Proモデル
  • iPad(第5世代)
  • iPad(第6世代)

※OSはiOS12以降

さらにWWDCの発表では以下のメモリ容量の大きいデバイスが推奨されていました。

  • iPhone 7 Plus
  • iPhone 8 Plus
  • iPhone X
  • iPad Pro 12.9

Quick Look表示のイメージ

iO12の対応機種であればSafariでAR Quick Lookギャラリーを見ることで、Quick Look表示を体験できます。

  • ARコンテンツを含むWebページを表示した場合、上記のようにAR対応のアイコン(写真左)が画像の上に表示される
  • オブジェクトタブでは白い何もない空間上に3Dモデルが表示(写真中央)
  • ARタブでは背面カメラを利用して平面を検知した時に3Dモデルが配置される(写真右)

試してみた感想としては、なかなか平面が検知されないのでカメラでいろんな方向を撮る手間がある、3Dモデルのサイズが大きめに表示されてしまうなどのiOS側の課題がありそうだなと感じました。

Webコンテンツ内にUSDZファイルを配置する方法

WebコンテンツでUSDZファイルを配置するにはaタグのhref属性にusdzファイルのパスを、rel属性に"ar"を設定します。内部にimgタグを配置すると自動でAR対応のアイコンが表示されます。この設定をしない場合、ブラウザがusdzという拡張子を判定することができません。

<a href="item.usdz" rel="ar" >
    <img src="item_thumbnail.png">
</a>

以下のようにWebサーバーのMIME設定も必要なようです。

AddType model/vnd.pixar.usd .usdz
AddType model/usd .usdz

ネイティブアプリでAR表示する場合の方法

WKWebViewでの表示は未対応

WKWebViewでの表示も試みましたが、表示できませんでした。
以下のWebKitのサイトにも書かれていますが、WKWebViewでの表示は未対応のようです。

Viewing Augmented Reality Assets in Safari for iOS

Other than Safari, the AR integration is available in SFSafariViewController clients. We’ve also received requests to add it to WKWebView.

標準ブラウザ(Safari)を利用せず、ネイティブアプリで表示する方法は以下の2つです。

  • SFSafariViewController
  • QLPreviewController

SFSafariViewControllerで表示する場合

以下のようにURLを指定してあげればOKです。ただし、SFSafariViewControllerはカスタマイズできることがかなり制限されているので、実際に利用する場合は次のQLPreviewControllerを使うことが多いかと思います。

import SafariServices
import UIKit

public final class SafariViewController: SFSafariViewController {
    let url: URL

    init(url: URL) {
        self.url = url
        super.init(url: url, configuration: Configuration())
    }
}

QLPreviewControllerで表示する場合

以下のようにQLPreviewControllerDataSourceを実装すればOKです。

import UIKit
import QuickLook

public final class ARNativeViewController: QLPreviewController {
    let url: URL

    init(url: URL) {
        self.url = url
        super.init(nibName: nil, bundle: nil)
        dataSource = self
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension ARNativeViewController: QLPreviewControllerDataSource {
    public func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }

    public func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        // URL must be a file-type URL (local files only)
        return url as QLPreviewItem
    }
}

注意点として、指定するURLは端末内に保存されたusdzファイルのURLである必要があります。そのため、WebサーバーからUSDZファイルを取得する場合は一度ローカルディレクトリにファイルを保存する必要があります。以下はAlamofireを利用してusdzファイルをダウンロードするサンプルコードです。

let destination: DownloadRequest.DownloadFileDestination = { _, _ in
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendingPathComponent("teapot.usdz")

    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}

let url = URL(string: "https://developer.apple.com/arkit/gallery/models/teapot/teapot.usdz")!
Alamofire.download(url.absoluteString, to: destination)
    .responseData { [weak self] response in
        DispatchQueue.main.async {
            self?.openInNative(url: url)
        }
}

サンプルリポジトリ

サンプルコードはこちらのリポジトリに置いてあります。

github.com/shtnkgm/ARQuickLook

まとめ

  • USDZとQuickLookを利用することで非常に簡単に3DモデルのAR表示ができる
  • USDZファイルをネイティブで表示するにはWKWebViewは未対応なので注意
  • QLPreviewControllerを利用することが多いと想定される
  • QLPreviewControllerを利用する場合にもWeb上のUSDZファイルは一度端末にダウンロードが必要

参考サイト

本記事を作成するにあたり参考にさせていただいたサイトです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away