ARKit 2.0 でAR経験を共有できるようになりました。あと、アプリを実装しなくてもARできます。

今朝発表された iOS 12では、ARがいままでになく身近になりました。 実は、わざわざアプリを作らなくてもARを実現できるようになっています。

iOS12でなにができるようになったかみてみましょう。

ARKit 2.0 とiOS 12

iOS 12 と同時に、ARKit 2.0が発表され、おおざっぱに言うと、こんなことができるようになりました。

  • アプリをつくらなくてもARができるようになった。(iOS12)
  • みんなでARを共有できるようになった。(ARKit 2.0)

アプリをつくらなくてもAR!

今朝 AppleがUSDZファイルを発表しました。 これは、新しいARのオブジェクトのファイルフォーマットです。

実は iOS 12 では、独自のアプリを使わなくても、このファイルをSafariなどでそのままARとして表示することができます。

f:id:toyship:20180605182320p:plain:w200

(↑これ、ARになっているので、椅子の後ろの背景はカメラでみている画像です)

これって結構すごいと思うんですよね。

iPhoneアプリもAndroidアプリも作らずに、ただファイルをウェブサイトに置くだけでARができちゃうんです。

ファイルをサイトに置くのではなく、メールで送ったりしても大丈夫。

ARに対応した商品カタログを作ろうとすると、今までは、商品の3Dモデルをつくって、アプリを作って、アプリのなかからよびだす、というかなり大変な作業がありました。

でも、iOS 12 なら、商品カタログサイトにUSDZファイルをおいておくだけで、その商品をARで自分の部屋に表示できるようになるんです。

アプリを作らずにARができると、ARの活用方法がいろいろと広がります。

例えば、新製品のUSDZファイルをつくって、登録したユーザーにメールで送るだけで、ユーザーはAR素材として使えます。 新しい商品を拡散してもらいやすくなり、販促キャンペーンに使えそうです。

また、例えば恐竜博覧会で、恐竜のUSDZファイルをつくってウェブサイトにおいておくと、アプリをつくらなくても、その恐竜を自分の部屋に表示することができます。 USDZファイルはアニメーションも含めることができるので、恐竜が部屋の中をあるいている風景もアプリなしでつくることができます。 USDZファイルをつくって、展覧会場にiPhoneかiPadを何台か置いておけば、それだけで来場者がARを体験できますね。

アプリをつくる予算やノウハウがなくても大丈夫です。

USDZとは

USDZとは、3Dオブジェクトを表示するための新しいファイルフォーマットです。

仕様書はこちらです。

https://graphics.pixar.com/usd/files/USDZFileFormatSpecification.pdf

USDZのサンプルファイルはこちらにあります。(このページにiOS 12 の端末でアクセスするだけで、3DオブジェクトをARでみることができます。)

ARKit - AR Quick Look Gallery - Apple Developer

USDZファイルは、Adobeを含む複数の会社のツールで作ることができるようになるそうです。

USDZのQuick Look

Safariなどの標準アプリでAR表示することも簡単ですが、自分のアプリでこのUSDZファイルをAR表示するのもとても簡単です。

ARKitは必要ありません。

pdfや画像ファイルなどを簡単に表示できる QLPreviewController というクラスがあり、USDZファイルもサポートしています。

下記のコードだけで表示することができます。

import QuickLook

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // ボタンを押したらここを呼んでください。
    @IBAction func showQuickLook(_ sender: Any) {

        let quickViewCon = QLPreviewController()
        quickViewCon.dataSource = self

        self.present(quickViewCon, animated: true, completion: nil)

    }

}

extension ViewController: QLPreviewControllerDataSource {

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int{
        return 1
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem{

        return MyARItem()
    }

}

class MyARItem: NSObject, QLPreviewItem{
    var previewItemURL: URL? {
        return Bundle.main.url(forResource: "coffee", withExtension: "usdz")
    }
}

これで、自分のアプリでもUSDZファイルをARとして表示することができます。

(上記の実装ではなく、WKWebViewを使っても表示することができます。)

このQuickLookのサポートで、ほとんどのアプリではARKitの実装をする必要はなくなったと思います。 とても簡単なので、なにかをAR的に表示したいアプリは今すぐにでも実装するべきです。

みんなでARを共有できるようになった

さて、今回できるようになった二つ目の機能は、ARが完全に共有できるようになったこと、です。

「ARを完全に共有する」とはなんでしょうか。

たとえば、いままでもポケモンGOなどでARの経験自体は共有できていました。 街角でそこにいる全員でホウオウを倒したりするのも、ARの共有の一つです。

ただ、その時にその場にいる全員のiPhoneのなかでホウオウの3Dデータが全く同じ動きをしていた(同時に羽ばたいたり、同時に声をあげたり)していたわけではありません。 ホウオウのHPは共有されていても、3Dモデルの動きはiPhoneごとに少しづつ異なっています。

ポケモンGOなら、3Dモデルのデータを正確に同期する必要はありません。 みんなで一緒にホウオウを倒せばAR経験は共有できます。

でも、3Dパズルなどでは、3Dモデルのデータの状態が正確に同期できないとAR経験が共有できません。

今回のARKit 2.0では、ARで表示している座標系と3Dモデル情報をまとめてアーカイブできる機能が追加されました。

まとめてアーカイブした情報を保存しておけば、ARの状態をSave/Loadでき、この情報をシェアすれば大勢でARの情報を完全に共有することができます。

実は、これは今までもがんばって実装すればできないことはなかったんですが、認識したWorld座標、表示している3Dオブジェクトすべての情報をアーカイブするのはそこそこ大変な実装です。

ARKit 2.0では、それをARWorldMapクラスが全部サポートしてくれるようになりました。

ARWorldMapの使い方は下記に開設されています。

Archiving World Map Data for Persistence or Sharing | Apple Developer Documentation

データのsaveはこんな感じです。

func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {
    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
    try data.write(to: url)
}

loadはこちらになります。

func loadWorldMap(from url: URL) -> ARWorldMap throws {
    let mapData = try Data(contentsOf: mapURL)
    guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(of: ARWorldMap.classForKeyedUnarchiver(), from: mapData) as? ARWorldMap
        else { throw ARError.invalidWorldMap }
    return worldMap
}

楽ですね……。

AR Multiuser Sample

Appleから、ARWorldMapのシンプルなサンプルが提供されているので、それをみてみるといいでしょう。

Creating a Multiuser AR Experience | Apple Developer Documentation

このサンプルアプリは、機能がシンプルでわかりやすいです。

起動すると、AR画面が表示され、画面をクリックすると、このたぬき(?)が画面に何体も表示されます。

f:id:toyship:20180605181323p:plain:w200

あとから起動したデバイスに、先に起動したデバイスのタヌキが共有されるはずです。

f:id:toyship:20180605174208p:plain:w500

ちなみに、ファイル情報の共有にはMultipeerConnectivityを使っていますが、通信プロトコルは問わないので、別の方法でも大丈夫です。

SwiftShot Sample

Appleからは、もう一つARの共有サンプルが提供されています。

SwiftShot: Creating a Game for Augmented Reality | Apple Developer Documentation

こちらも、基本的にはMultipeerConnectivityを使ってARWorldMapの情報を共有するアプリですが、商業レベルのゲームとして作られているのでコードの量が非常に多いです。

認識した平面の上に木のブロックが表示され、パチンコで撃ち合うアクションゲームですね。

f:id:toyship:20180605181302p:plain:w500

WWDC会場で動作しているこのアプリのデモの様子です。


iOS 12 multiplayer AR gaming first look

Scan

また、ARKit 2.0では、3D オブジェクトのスキャンもできるようになっています。

こちらのサンプルアプリは、bounding boxを表示して、その中のオブジェクトをスキャンするようになっています。

Scanning and Detecting 3D Objects | Apple Developer Documentation

f:id:toyship:20180605190527p:plain

使い方がちょっと複雑で、何かを一回スキャンし、その物体から ARReferenceObject を作成し、そのファイルをもう一度Projectに追加して、その ARReferenceObject と同じ物体を検知するようになっています。

まだベータだからか、認識率は少し悪いようで、ARReferenceObject の作成に何回も失敗してしまいました。

下記のことを注意すれば、認識率があがるようです。

  • ARKitは背景がクリアな背景でオブジェクトを確認します。オブジェクトは模様があったほうが検知しやすいです。
  • オブジェクトのスキャンは、テーブルの上にのるような小さいものがよいでしょう。
  • 検知するオブジェクトは、ARReferenceObjecと全く同じ形でなくてはいけません。柔らかいものより、固いもののほうがよいでしょう。
  • 検知は照明の条件がよいところにしましょう。安定した室内照明がよいでしょう。
  • 高品質のオブジェクトスキャンは、デバイスのパフォーマンスを必要とします。高性能のiPhoneだとよりよい品質となります

まとめ

iOS 12ではアプリをつくらなくてもARができます!

イベントや販促、教育などに是非つかってみてください。