ハコスコでCoDやりたい。ためにまず、iPhoneの傾きをPCに送り、それを反映したPC画面をiPhoneに表示する仕組みを実現します。
iPhoneでのPC画面の表示にはオープンソースのNVIDIA GameStreamハッククライアント『Limelight』を使いました。GameStreamはその名の通りゲームに特化したストリーミング技術。低遅延・高フレームレートでHMDにも適していそう。
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を操作すること。次回はこれに挑戦します。