HacosCoD #1 Limelight改

ハコスコでCoDやりたい。ためにまず、iPhoneの傾きをPCに送り、それを反映したPC画面をiPhoneに表示する仕組みを実現します。

iPhoneとPCとの連動の様子。スマホHMDアプリ一般に応用できる(かもしれない)


iPhoneでのPC画面の表示にはオープンソースのNVIDIA GameStreamハッククライアント『Limelight』を使いました。GameStreamはその名の通りゲームに特化したストリーミング技術。低遅延・高フレームレートでHMDにも適していそう。

Limelight-Ikaruga

写真だと微妙に遅延しているのがわかるが、タイミングのシビアなゲームでなければ気にならない程度。当然ネットワーク環境にも依り、自宅ではスムーズだったが会社ではたまにカクついたりした

PC画面を映すだけならLimelightをそのまま導入すれば良いのですが、iPhoneの傾きをPCに送るには少々手を加えなければなりません。方法はなんでも構いませんが、ここではお手軽にOSCで値を送信することにしました。

Limelightストリーミング画面のビューコントローラ ViewControllers/StreamFrameViewController.m 内でiPhoneの傾き(CMAttitude.quaternion)を読み取って送信します。OSC通信には『VVOSC(vvosc-ios)』を使いました。実装部分はググって出てきたコードをコピペしただけです。Objective-CもXcodeもよく知りませんが(むかしiOSアプリ作ったときはほとんどC++で実装した)、次々出てくるエラーメッセージをひたすらググって解消してたら何とかなりました。送信先アドレスなどはハードコーディングです。

個人的にハマったところ、というか知らずに面倒くさかったところは以下。しかし生粋のMacユーザ/iOS開発者なら楽勝でしょう。

  • Limelightのビルドには limelight-common も必要(こちらがストリーミング受信処理本体らしい)。まず後者のソースをダウンロード、ビルドする
  • それぞれのビルドの Architecture や Build Configuration を合わせておく
  • ビルドしたライブラリファイル(*.a)は「/Users/ユーザ名/Library/Developer/Xcode/DerivedData/プロジェクト名+変な数字/Build/Products/[Release|Debug]-iphoneos」ディレクトリに生成される
  • VVOSCの送信処理で実行時エラーが出る場合は、Limelightの「Build Setting → Linking → Other Linker Flags」に「-ObjC」を設定する

上のビデオはOSC受信した値で視点を動かすUnityサンプルです。このようにプログラムを直接書くぶんにはどうにでもなりますが(Unityなら受信したクォータニオンの値をTransform.rotationに突っ込むだけ。必要に応じて軸方向を調整)、最終目的はCoDなどの既存FPSを操作すること。次回はこれに挑戦します。

Experience

GameStream非対応のゲームや自作プログラムも『NVIDIA GeForce Experience』の「基本設定 → GameStream」画面のリストに追加すればストリーミング可能になる。プログラムはフルスクリーンで起動するよう設定しておくこと

Limelight

こちらはiPhoneのLimelight画面。ネットワーク上のGameStream対応PCが自動的に表示される。タップしてPCに接続すると起動可能なプログラム一覧が下段に表れる