Slide 1

Slide 1 text

ARKit+Vuforia+UNET でマルチプレイAR

Slide 2

Slide 2 text

株式会社Jollystics所属 だいたいUnity ときどきXamarin(≒C#er) アプリ、インタラクティブ、XR 今年から「ゆにくえ福岡」という 初心者向けのUnity相談会を毎週やってます 最近やってるゲーム ディヴィニティ:オリジナル・シン エンハンスド・エディション 自己紹介 長峰慶三 @KzoNag

Slide 3

Slide 3 text

はじめに ▪ Unityで作ってます ▪ デモしたい!!

Slide 4

Slide 4 text

マルチプレイAR って何ですか?

Slide 5

Slide 5 text

AR Augumented Reality 拡張現実

Slide 6

Slide 6 text

Augmeted Reality, 拡張現実 現実環境をコンピュータで認識し、 情報を付与するなどして拡張する技術 現実環境の認識手法として、 ・マーカー認識 ・カメラ・センサーによる  自己位置推定・環境測定 ・GPSからの位置情報 などがある

Slide 7

Slide 7 text

マルチプレイ 複数人で遊ぶやつ

Slide 8

Slide 8 text

マルチプレイ コンピューターゲームにおいて、複数人 のプレイヤーが一緒にプレイすること 以下のようなパターンがある ・インターネット経由で別端末と通信 ・オフラインで別端末と通信 ・1端末で画面分割

Slide 9

Slide 9 text

マルチプレイAR 複数人が一緒に体験できるAR

Slide 10

Slide 10 text

マルチプレイAR 複数人が一緒に体験できるAR どのプレイヤーから見ても同じ時間 ・場所に同じ情報が付加される お互いの位置情報を共有している プレイヤーによるインタラクションが 他プレイヤーに反映される (例:イスを回転する) ※HoloLensのシェアリングの機能はコレ

Slide 11

Slide 11 text

Place your screenshot here Share World Demo 壁の文字からワールドにログイン ログインすると空間に存在するオブ ジェクトを視認可能に 複数のプレイヤーが同じワールドに ログイン プレイヤーはオブジェクトを発射す ることができる 発射されたオブジェクトはワールド 上に存在するため他プレイヤーも視 認可能

Slide 12

Slide 12 text

Vuforia ARKit UNET 3つの要素

Slide 13

Slide 13 text

Vuforia ARKit UNET 3つの要素

Slide 14

Slide 14 text

iOS11で導入されたフレームワーク 主にできること↓ ▪ 自己位置推定 ▪ 平面検出(水平,垂直)※垂直面はiOS11.3から ▪ 照明光推定 ▪ 前面カメラでの顔・表情の認識 ※iPhoneXのみ Unityで使うプラグインが公開されている ARKit

Slide 15

Slide 15 text

ARKitによる自己位置推定 (Visual Inertial Odometry、VIO、視覚慣性オドメトリ) カメラとジャイロや加速度などのセンサーを組み 合わせて、デバイスの移動・回転をトラッキング 分かるのは開始地点からの相対位置 現実環境における絶対位置が分かるわけではない

Slide 16

Slide 16 text

ARKitによる自己位置推定 (Visual Inertial Odometry、VIO、視覚慣性オドメトリ) トラッキング開始 開始地点からの位置・姿勢 Pos(1,2,3) Rot(30, 10, 20) 移動

Slide 17

Slide 17 text

Vuforia ARKit UNET 3つの要素

Slide 18

Slide 18 text

Vuforia AR開発プラットフォーム iOS,Android,UWP(HoloLens) カメラ画像ベースのトラッキング 様々な認識ターゲット ▪ 平面画像 ▪ 直方体や円柱といった立体 ▪ CADなどの3Dデータ Unity2017.2からVuforiaが統合された Vuforia7からは平面検出もできるように

Slide 19

Slide 19 text

画像を検出すると画像との相対位置が分かる Vuforiaでの画像ターゲットによるトラッキング 画像からの位置・姿勢 Pos(1,2,3) Rot(30, 10, 20)

Slide 20

Slide 20 text

Vuforia ARKit UNET 3つの要素

Slide 21

Slide 21 text

UNET Unityに用意されたネットワークシステム 高レベルAPIと低レベルAPIがある 高レベルAPIはマルチプレイに必要とされる ほとんどの共通要件をカバーする(らしい)

Slide 22

Slide 22 text

UNETの高レベルAPIの特徴(あんまり分かってない) ▪ サーバー処理もUnityで実装 ▪ サーバー/クライアント方式 ▪ サーバー兼クライアントのホストにもなれる ▪ 汎用データシリアライズ ▪ ネットワークメッセージ送受信 ▪ クライアントからサーバーにコマンド送信 ▪ サーバーからクライアントにRPC ▪ サーバーからクライアントにイベント送信

Slide 23

Slide 23 text

サーバーとクライアントがいる サーバー クライアントA クライアントB クライアントC

Slide 24

Slide 24 text

サーバーを介して変数を同期する val = 5 val = 5 val = 5 val = 5

Slide 25

Slide 25 text

クライアントからサーバーに関数を実行させる(コマンド) SetPos(5)を 実行して

Slide 26

Slide 26 text

サーバーからクライアントに関数を実行させる(RPC) ShowResult() を実行して

Slide 27

Slide 27 text

クライアントの1つがサーバーを兼ねることも可能 クライアントA クライアントB クライアントC サーバー ホスト

Slide 28

Slide 28 text

やってること

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

各クライアントと専用のサーバーマシンを用意 (今回は同一LAN内で) クライアント クライアント サーバー

Slide 31

Slide 31 text

それぞれの位置・姿勢情報を クライアント間で同期 Pos(-1,2,3) Rot(30,10,5) Pos(2,1,5) Rot(20,15,0) ARKit + Vuforia

Slide 32

Slide 32 text

クライアントからサーバーにアクションを通知 画面をタップしたよ

Slide 33

Slide 33 text

サーバーからクライアントに オブジェクト生成を通知 オブジェクト生成 オブジェクト生成

Slide 34

Slide 34 text

オブジェクトの状態はサーバーが管理して 各クライアントと同期 Pos(-1,2,3) Rot(30,10,5) Pos(-1,2,3) Rot(30,10,5)

Slide 35

Slide 35 text

位置・姿勢の同期

Slide 36

Slide 36 text

ARKitの自己位置推定を使いたいけど・・・ Pos(-5,6,1) Rot(60,5,10) Pos(1,4,6) Rot(0,15,30) クライアントB クライアントA

Slide 37

Slide 37 text

固有の座標系での値なので Pos(-5,6,1) Rot(60,5,10) Pos(1,4,6) Rot(0,15,30) 座標系A 座標系B クライアントB クライアントA <座標系A> <座標系B> この値をそのまま Aに送ると、、、

Slide 38

Slide 38 text

位置が合わない 座標系A クライアントB クライアントA Pos(1,4,6) Rot(0,15,30) クライアントB? <座標系A>

Slide 39

Slide 39 text

Vuforiaの画像ターゲットを配置 座標系A 座標系B

Slide 40

Slide 40 text

認識するとターゲットとの位置関係が分かる = ターゲットを基準とした共通の座標系 座標系A 座標系B Pos(-1,2,3) Rot(30,10,5) Pos(2,1,5) Rot(20,15,0) <座標系V> <座標系V> 座標系V

Slide 41

Slide 41 text

各座標系でのターゲット位置を逆算できる = 座標変換が可能 座標系A 座標系B Pos(-4,4,-2) Rot(30,-5,5) <座標系A> Pos(-1,3,1) Rot(-20,0,30) <座標系B> Pos(-1,2,3) Rot(30,10,5) Pos(2,1,5) Rot(20,15,0) <座標系V> <座標系V> 座標系V この値をAに送る

Slide 42

Slide 42 text

位置が合った! 座標系A Pos(-4,4,-2) Rot(30,-5,5) <座標系A> Pos(2,1,5) Rot(20,15,0) <座標系V> 座標系V <座標系A> Pos(-2,5,3) Rot(50,10,5)

Slide 43

Slide 43 text

位置・姿勢の同期 ▪ 画像ターゲットで共通の座標系を用意 ▪ ARKitで自己位置を取得 ▪ 共通の座標系に変換 ▪ UNETで送信 ▪ 受け取った座標を固有の座標系に変換 ▪ 実際はプレイヤーオブジェクトを 画像ターゲットの子にすることで簡素化

Slide 44

Slide 44 text

困ったところ ❖ ARKitとVuforiaを同時に有効にできない ➢ はじめにVuforiaで認識、認識したらVuforiaを 切ってARKitをオンにすることで対処 ➢ 切り替え時にカメラ画像がチラつくので演出で目立 たないように

Slide 45

Slide 45 text

DEMO

Slide 46

Slide 46 text

まとめ ▪ ARKitで自分の位置をトラッキング ▪ Vuforiaで座標系を合わせる ▪ UNETで情報を同期する でマルチプレイARができました!

Slide 47

Slide 47 text

次のステップ ▪ 精度の向上・内容を充実 ▫ ちょっとズレるのをなんとかしたい ▫ 撃ち合いとかゲームっぽくしたい ▪ マルチプラットフォーム ▫ AndroidやHoloLensも入れるはず ▫ なんならポジショントラッキングできなくても Vuforiaの画像が見えてれば入れるのでは ▪ いろんな情報を共有 ▫ HoloLensの環境マップとか ▫ 各種センサーを置いてサーバー側から送るとか

Slide 48

Slide 48 text

ありがとうございました! 休憩時間に体験できます!

Slide 49

Slide 49 text

CREDITS Special thanks to all the people who made and released these awesome resources for free: ▪ Presentation template by SlidesCarnival ▪ Photographs by Unsplash