IMG_0162

スマホ差込形HMD Durovis Diveを使う


はじめに

ここのところは相変わらずOculus RiftをはじめとしたVRヘッドマウントディスプレイにご執心な日々ですが、最近はOculusに加えてDurovis Diveにも手を出しました。

Oculus Riftに見た目も構造も似ていますが、開発元が異なる別のHMDです。正確には、この枠の中にスマートフォンを差し込むことでHMDとして機能するようになるマウントパーツということになります。

マウント部を開いたDurovis Dive
マウント部を開いてスマホを外すとこんな感じ。
Oculus RiftとDurovis Dive
左がOculus Rift、右がDurovis Dive

利点と欠点

Oculus Riftを開発したPalmer Luckeyは、かつてFOV2GOというスマートフォンを活用したHMDの研究プロジェクトに関わっていました。その後彼は専用ハードを作る方向に転じ、掲示板などでもスマホの性能の限界を指摘していることからも、体験のクオリティを重視するのであればそれに合わせた専用のハードウェアを作らなければならないという意見のようです。

確かに、Durovis DiveはOculus Riftに比べて

  • 視野が80〜90度程度とやや狭い
  • 次期Oculus Riftの売りであるポジショントラッキングやLow Persistenceモードの搭載は望めない
  • 加速度計やジャイロのトラッキング頻度・精度は低い1
  • 実行環境がモバイルアプリなので、リッチな表現はできない
  • 本体がそのまま頭の前に来るので、首の向き以外での操作ができない

といった欠点があり、基本的にRiftよりも体験の質は劣ります。とはいえ、このアプローチはOculus Riftに勝る点もいくつかあります:

  • PCやケーブルいらずで単体稼働できる
  • スマホ次第で高解像度な画面が使える
  • 実行環境がモバイルアプリなので、Unity3D Free版でも開発できる2
  • なにより既にスマホを持っていればそのまま使えるので安い

特に最後の2点は重要です。実際、Oculus Rift本体やらゲーミングPCやらUnity Proやら3DCGソフトやらで、出費がとんでもない事になってる人を知っています。w
極端な話、Durovisを買わなくとも、FOV2GO方式のレンズとボール紙の即席HMD + Unity Freeで超低コストに最低限の開発スタートが可能です。


  1. iPhone 5Sでも加速度センサの更新頻度は秒間100回程度ですが、頭の動きに低遅延で追随することにこだわったOculus Riftのセンサ更新頻度は秒間1000回と桁違いの高さです。 

  2. Oculus Riftの場合はPCから外部ハードウェアに直接アクセスすることになるため、Unity Pro版ライセンスが必要です。 

IMG_5081

VRネトゲの作り方:Mikulus Kinect OnlineにおけるPhoton Cloudの活用


この記事はOculus Rift Advent Calendarの4日目です。

はじめに

こんにちは。Oculus Rift Advent Calendar 12/4担当のNeedleです。

先日11/9に開催された第一回Oculus Game Jamで作ったMikulus Kinect Onlineの、特にネットワーク部分について書こうと思います。

Mikulus Kinect Onlineとはこんなソフトです。


なお現在、第五回ニコニコ学会β 研究してみたマッドネスセッションの投票受付中です。投票は本日12/4 23:59までですので、もし良ければこちらのページから投票をよろしくお願いいたします!

Mikulus Kinectとは

Mikulus Kinect Onlineの話の前に、まずその元となったMikulus Kinectについて説明します。

Mikulus Kinect

Mikulus Kinectは、Oculus RiftとKinectとUnity3Dを組み合わせて、プレイヤーが自分の手足や体がVR内で見える状態でミクさんと握手や頭を撫でるといったコミュニケーションが取れるアプリです。

Oculusを着けて最初に感じたのが頭の角度に対する映像の追随の滑らかさでしたが、一方で感じたのが、頭の位置移動が反映されないことや自分の体が見えない事による違和感でした。そのときKinect登場時に話題になったNao_uさんの動画を思い出し、自分でもやってみようと思ったのがきっかけです。「VR内でAIキャラの目を見る」という体験は、モニタ越しのゲームとは全く違ったものとして感じられました。

ここで作ったMikulus Kinectはあくまで 人←→AI というシングルプレイヤーのデモでした。これをマルチプレイヤー化し、複数の人が同じVR空間内に入れるようにしたのが、Mikulus Kinect Onlineになります。

オンライン化にするにあたっての課題

オンライン対応にはネットワークミドルウェアのPhoton Cloudを使いました。以前ワークショップで少しだけ触ったことがあったからというのもありますが、ゲームジャムの会場がPhotonを日本展開されているGMOさんのオフィス内で、中の人に質問をしやすかったからでもあります。Unity用のPhoton CloudはUnity自身の内蔵ネットワーク機能に似た形で使えるよう作られているので、そちらを使う場合も同じ手法を応用できると思います。

ここからはMikulus Kinectをオンライン化する際に直面した課題について書いていきます。

アバターキャラの出現(○○さんがログインしました)

シングルプレイのMikulus Kinectではプレイヤーが操作するアバターキャラを最初からHierarchyの中に置いていましたが、ネットワーク環境では誰かがログインする度にその人のアバターキャラを出現させる必要があるため、Hierarchyにおいておくわけにはいきません。アバターキャラのGameObjectはPrefabにして、ProjectのResources内に置いておきます。

ログイン時のコードはこんな感じです。
(アバターキャラPrefabの名前はここではMKMotionCaptureContainerとなっています)

photonviewdetailモーションキャプチャ関節の共有

Photon CloudにはPhotonViewというスクリプトがあります。基本的には、ネットワーク越しにプレイヤー間で共有したいGameObjectにこのスクリプトを貼っておくことで、そのGameObjectの位置・角度・パラメータといった状態を共有できるようになります。キャラクターの動きを共有するにはこれを使います。

通常のオンラインゲームでは、一人のプレイヤーが動かせるのは基本的に自分のプレイヤーキャラ1体です。つまり一人あたりのPhotonViewは1個で十分でした。

これがMikulus Kinect Onlineにおいては話が変わります。全身の関節をKinectでキャプチャし、MMDモデルの関節に割り当てているため、位置・角度をPhotonViewで共有するのも、キャプチャしている関節全てで行わなければなりません。1

mikuwithskelparts2任意のキャラクターモデルへの対応

以上を踏まえて、単にミクのモデルだけを動かしたいのであれば、ミクモデルの各関節のGameObjectに黙々とPhotonViewを貼っていけばOKです。

しかし将来的にはKAITOやリン・レンなどアバターキャラ(モデル)の切替を可能にしたいので、決め打ち対応はなるべく避けたいところです。Kinectでキャプチャされる関節は24もあるので2 、モデルを変える度にPhotonViewを貼る作業を24回繰り返すのは生産的ではありません。一方で、モデルによっては関節の数が違い3 、24個全部を使わないこともありえます。

よって、PhotonViewの割り当ては初期化時に自動的に行えるとベストです。

PhotonViewスクリプトの自動割り当て

これらの問題を解決するため、当初は以下のような手順を考えました。

  • アバターキャラPrefabのInstantiate時にモーションキャプチャで動かせる関節GameObjectの一覧を作る
    • その関節GameObjectの配列をforeachでループし、それぞれにAddComponent()PhotonViewスクリプトを生成して貼り付ける

しかしこれだと動作しません。

調べて分かったのですが、PhotonViewスクリプトはPrefabのInstantiate時点であらかじめ共有したいGameObjectに貼られていなければならず、初期化時に生成するのでは間に合わないようでした。

しばらく悩みましたが、発想を逆転し、結果として以下の様な手順になりました。

  • Unityエディタを使い、PhotonViewが貼られた空GameObjectを24個作って入れておく
    jointphotonviews

    • アバターキャラPrefabのInstantiate時にモーションキャプチャで動かせる関節GameObjectの一覧を作る
    • その関節GameObjectの配列をforeachでループし、それぞれに先ほど作っておいたPhotonView付きGameObjectを関連付ける
    • モデルの関節数が24個未満だった場合、PhotonView付きGameObjectが関連付けられずに余るので、余った分はDestroy()して始末する

要は初期化時に生成するのがダメでも、初期化時に破壊するのはOKという性質を利用しています。

以下は該当部分のソース。

その他参考資料

2013/12/4現在、Photon公式のドキュメンテーションページが落ちてるようです。
公式ではないですが、こちらのスライドがPhotonの基本概念を理解するのに役立ちそうです。

まとめ&今後の展望


こうしてなんとかゲームジャム終了までに動作する形にまとめる事ができ、その後のデモやTwitterにおいても好評を得ることが出来ました。(一緒に開発した@sinkukkuさん、ありがとうございます。)

Mikulus Kinectで実装した「VR内でAIキャラの目を見る」という体験も不思議な感覚でしたが、「VR内でネットワーク越しに他の人間の目を見る」というのは、生身の人間がアバターキャラの中にいると知っているだけに、また更に違う体験に感じられます。これについては、また別の機会に書ければと思います。

ただ、粗はまだまだ多いですし、当初やってみたかった事もできていないことは沢山あるので、今後少しずつやっていきたいところです。今後考えているところとしては

  • 新規に入ってきた人の立ち位置や向きを重ならないようにずらす
  • その為にPhoton, Kinect (Zigfu), Oculusそれぞれで向いている方角を揃える
  • モーションキャプチャの動きを記録し、後から再生できるようにする
  • 人間が動かすキャラとAIが動かすキャラを混在させる
  • MecanimのIKを活用して肘関節などの位置・角度情報の共有を省き、通信量を減らす
  • 表情制御(HMDかぶってるのにどうやって…?w)
  • 公開する!

などなど。

長いエントリに最後までお付き合いいただき、ありがとうございます。再度になりますが、現在、第五回ニコニコ学会β 研究してみたマッドネスセッションの投票受付中です。投票は本日12/4 23:59までですので、もし良ければこちらのページから投票をよろしくお願いいたします!

Oculus Rift Advent Calendar、明日は@blkcatmanさんです。


  1. 余談ですが、各関節に使うPhotonViewState Synchronizationタイプは、「頻繁に位置が変わる」「送信失敗したデータを再送する必要はない」事から、Unreliable On Changeにしておくのが良さそうです。 

  2. Kinect v2ではキャプチャされる関節数が更に増えているはずです。 

  3. シテヤンヨとかゆっくりとかMogg式ミクとか… 

XREA+からValue Serverへ移行


このブログのホストをXREA+からValue Serverに移行しました。ちゃんと移行出来ている事のWordPressのチェックも兼ねてこのエントリを書いています。

ここの所は相変わらずOculus Rift三昧で、Mikulus Kinectなんてソフトを公開してみたりしていますが、それについては後程。Oculus Riftについての記述は主にTwitterに書いていますので、ひとまずそちらをご覧ください。

Oculus Riftの小ネタ色々


去年の夏にKickstarterで出資していたVRヘッドマウントディスプレイOculus Riftが先日届き、ここ最近はイタリアに行ったり中世に行ったり宇宙に行ったりとバーチャル旅行三昧です。没入感が凄い、というのは各所で言われている通りなので、ここでは他で書かれていない(主に所有者向けの)小ネタを書いておこうと思います。

入手

現在「Oculus Riftを日本でも発売」という記事がいくつかのニュースサイトで出ていますが、あれは別に公式の代理店というわけではなく、単なる輸入代行のようです。製造元のOculus VR社はOculus Riftを全世界に出荷できる体制を整えているので、日本の業者を通さなくとも、Oculus VR社に直接注文することでより安く入手が可能です。

Oculus Riftの接眼レンズは使用者の視力に応じて取り外し可能となっており、健常者及び遠視・軽度近視・強度近視用の3セットのレンズが付属してきます。取り外す際には埃の侵入を防ぐため開口部を下に向けるべきという指示がマニュアルにありますが、ぶっちゃけ下に向けても埃は入ります。レンズの拡大率が強烈なだけに埃は結構目立って困りますが、この場合、レンズを外した穴にエアダスターのノズルを差し込んで1,2吹きしてやると大抵埃が飛んで綺麗になります。

ACアダプタ

Oculus Rift Devkitに付属するACアダプタはDC5V、1500mA、センタープラス、プラグ外形5.5mm・内径2.1mmです。Riftの定格消費は1000mAのようですが、Hack a dayの記事曰く、実際の消費は600mA程度のようです(ただし明度・コントラストによって変動するかも)。純正アダプタを紛失した場合やスペアが必要な場合、これに当てはまるスペックのアダプタがあれば使えるはずです。秋葉原で買えるものとしては秋月電子の5V2Aアダプタ等でしょうか。勿論推奨はされていないので、何かする際は自己責任で。

追記するかも。

ニコニコ研究合宿タイムテーブル

ニコニコ研究合宿「電脳メガネにはあと何が足りない?」


「ニコニコ研究会 様」先週末の日曜・月曜、またも夏休みを利用して、ニコニコ学会β主催の下つくばで開催された「ニコニコ研究合宿」に参加してきました。会議は「アンカンファレンス」形式で、白紙のタイムテーブルに各々が自分の話したい議題をポストイットに書いて貼り、その場でアドホックに会議が形成されるフォーマット。

「電脳メガネにはあと何が足りない?」セッション

研究とは・学会とは・ニコニコとはといった話が多い中、僕は空気を読まずにウェアラブルコンピュータについてのセッションをやってました…w

セッション内容は、最後のまとめセッションにおいてそれぞれ短く発表しあう形でした。自分のセッションのまとめを喋る際に「MOVERIOにカンペを表示しながら喋る」というのを思いついてその場でやってみたのですが、これが思いの外便利(後でタイムシフトを観直したら早口すぎましたが)。セッションで話し合った内容=すなわち目の前に見えてた内容は、だいたい以下の通りです。

  • 電脳メガネには何が足りない?
  • OSやUIが足りないと思うのだが
  • 視神経直結(表示は出来るが入力が出来ないとコンピュータにはならない)、脳波という話が出た一方で。
  • OSやUIを考えるにしても、機能やハードから考えるのでなく、ユースケースから考える。両手が空くとできること、例えば子供を抱きながら撮影できる、とか。
  • Googleのは操作よりは大量の主観映像の入手・分析にあるのではないか。
  • あと、今の発想は実際に使ってない人の発想が多い。ヘッドマウントカメラつけて1日過ごしただけでも知見が得られた。実際に使ってみるべき。
  • ATMのパスワードが録画されちゃう、携帯電話の画面が録画されちゃう。エッチなポスターに目を奪われてるのも録画されちゃう。

これを改行無しで読める大きさの文字にして詰め込んでMOVERIOの画面いっぱい埋まるくらい。即席で作ったにしてはまあまあでしょうか。

なお、より詳しいセッションのまとめも作ろうと思ったのですが、同じく合宿に参加された湯村さんのブログにて文句なしのまとめが書かれてしまったため、リンクしてお茶を濁します。w

カンペの作成手順

カンペの作り方としては以下のようなものでした。無理矢理。

  • カンペを出すのを思いつく
  • iPadで取ってたメモをコピーしてMOVERIOから見られる場所に出そう
  • MOVERIOは文字入力が極悪でログイン操作に時間がかかるので、ログインしないと見られない所には出したくない
  • 仕方ないので自分のブログに新規エントリとしてペースト、すぐ消す前提で公開
  • MOVERIOのブラウザで自分のブログにアクセス。勿論アドレス打つのも時間かかる
  • フォントサイズを大きめに変更、キーロックON
  • 発表
  • エントリを非表示にする

即席でこんな真似が出来るのもMOVERIOだからこそです。カンペ表示専用のアプリやサービスがあればもっとスムーズに出来るはず。…こういうアプリをワンオフで実装してみるのは現状のAndroidでも出来るけど、それに適したOSか、せめて再利用できるUIツールキットくらいはやっぱり必要だよなー。

なお、アンカンファレンスの他に夜の懇親会や、JAXAなどの近隣の施設への見学も、意外な表の話・裏話を色々見たり聞いたり議論したり出来て、非常に有意義でした。もしまたあったら是非参加したいですね。

気象衛星ひまわり(実物)