VR道を往く!

VRとかUnityとかそういう話中心に。

oculus utilities for Unity 1.5が出てる

表題の通りoculus utilities for Unityの1.5が出てますね。一応チェック。

さらばOVRPlugin

以前のバージョンのutilitiesで必要だったOVRPluginはUnity5.3.4p5からUnity本体に含まれるようになったのでもうありません。 ovr utilitiesのunitypackageをインポートするだけでOKです。 特に理由がなければ最新のバージョンのUnityを使っていきましょう。

その他設定の詳細は過去の記事をご参照ください。

vr-cto.hateblo.jp

OVR Screenshot: シーンのCubemapテクスチャ作成

360度全方位のスクリーンショットが撮れるOVR Screenshotなる機能が加わった模様。

まあ要は前からUnityに実装されていたCubemap書き出しの関数Camera.RenderToCubemap()を 手軽に使えるウィザードを用意した、という話です。 RenderToCubemap関数自体は以前から実装されているUnityの機能なので特に目新しくはないですが、コーディング無しで書き出せるので便利かもですね。

f:id:kaninabe:20160706014639p:plain

[Tool]->[Oculus]->[OVR Screenshot Wizard]でウィザード起動。 ウィザードではスクリーンショットを撮影する中心のオブジェクト、画像サイズ、 出力形式(UnityのCubemap形式のアセットか、横並び6面のjpegもしくはpng画像)を指定できます。

f:id:kaninabe:20160706014223p:plain

CubemapはSkyboxマテリアルに入れることで環境マップも簡単に実現。

ただどうせなら正距円筒形式のパノラマを書き出してくれる機能だったらもっと使いどころがあったのにと思います。

ちなみに僕はシーンのパノラマ画像を生成するのにはこのアセットを使っています。

VR Panorama 360 PRO Renderer

f:id:kaninabe:20160706014322p:plain

連番画像での書き出しに加え、mp4圧縮まで同時に行える優れものです。 そしてステレオパノラマにも対応。$40とちょっと値は張りますが、この機能なら納得の価格かと。

Oculus RiftでEuro Truck Simulator2を遊ぶ

f:id:kaninabe:20160629033922p:plain

SteamとOculus Storeでサマーセール中

先週末からSteamでサマーセールが始まってますね。Vive、Oculus Rift発売後で初めての大型セールなので、狙ってるタイトルがあれば要チェック。でもVR向けタイトルは新しい物も多いので割引率はまだちょっと渋いかも。

(追記: 2016年のサマーセールは終了しました。次回の大型セールはハロウィンセール?)

Welcome to Steam

f:id:kaninabe:20160629032708p:plain

ちなみにOculusストアもセール中。両方とも7/5までとなってます。

f:id:kaninabe:20160629013507p:plain

ただ実は僕、いかにもVR向きな本格FPSとか全然駄目なんですよね…。アクションゲームの操作とかとにかく下手だし、殺るか殺られるかみたいな殺伐とした雰囲気も苦手。

そんな僕のおすすめですがEuro truck simulator 2 (ETS2)です。要はトラックの運ちゃんになってにヨーロッパ中を走り回るだけのゲームです。 タイムを激しく競ったりもしないし、経営要素は若干あるものの資金管理はそれほど厳しく無い。 基本頭空っぽにして純粋にドライブを楽しめるのがイイ感じです。 発売から既に3年経っていて紹介するのも今さらな感じですが、まだ継続的にアップデートが続いているうえ、拡張DLCの発売も予定されています。 そしてVR対応。まだまだ遊ばせてくれそうな作品です。

Euro Truck Simulator 2 on Steam

f:id:kaninabe:20160629014236p:plain:w500

今なら70%off

Oculus対応はまだβ版なのでOculus Riftタグはついてない?VRゲームのコーナーには見つかりませんでした。普通に検索しましょう。 東欧・北欧マップ拡張も同時に購入するのがお勧めです(これらの拡張が無いと動かないMODが多いため)。 結局過去作まで含めたほぼ全部入りのDeluxe Bundleが一番お得?

Euro Truck Simulator 2 - Deluxe Bundle on Steam

舞台がアメリカのAmerican Truck Simulatorもあります。ゲームシステムはETS2とほぼ一緒。ただこちらはまだ発売からそれほど経っていないので割引は低め(20%off)。マップもまだ西部の3州のみでこれからのアップデートに期待といったところ。でもアメリカの雰囲気が好きな人は断然買いだと思います。

ETS2でOculus Riftを使うには

ではETS2でOculus Riftを使うための手順です。 Viveも使えるとは思うのですが持ってなくて確認できないので割愛します。

1. Oculus RiftとSteam VRを設定

ここも詳細は省きますが…まずはOculus Appをインストールして設定しておいてください。 まあ持っている人は既にやっていますよね。

Oculus Rift Setup | Oculus

SteamゲームでOculusを使う場合はOculus Appの[Setting] -> [General]のUnknown Sourcesをオンにするのを忘れずに。

f:id:kaninabe:20160629005508p:plain

あとSteam VRの方も設定しておいてください。 Riftを接続した状態でSteamアプリを起動すればSteam VRインストールの案内が出るはず。 インストールできたらSteamアプリ右上にVRアイコンが出るのでそれをクリックして起動しておきます。 初回はルームセットアップの画面が出るので指示に従って設定しておいてください。

このウィンドウが出たらOK。

f:id:kaninabe:20160629011844p:plain:w300

2. Oculus対応のベータ版を入れる

Steamアプリでライブラリをクリック、購入していればEuro Truck Simulator 2が左のリスト内にあります。 ここを右クリックして[プロパティ]を選択、プロパティダイアログでは[ベータ]タブを選択します。 ここの「参加希望のベータ」のドロップダウンリストの中から"oculus - Experimental Oculus support (1.4.0) -..."を選択します(たぶん一番上にあります)。 選択するとダウンロード・インストールが始まるので待ちます。

f:id:kaninabe:20160629012330p:plain

インストールされるとライブラリ中のETS2のゲーム名が"Euro Truck Simulator 2 [oculus]"となります。

3. 起動オプションに-oculusを付けて起動

もう一度ETS2のプロパティを開きます。 今度は一般タブに"起動オプションを設定"というボタンがあるのでこれを開き、

-oculus

と入力してOKを押します。

f:id:kaninabe:20160629013427p:plain

4. ETS2を起動!

この状態でETS2を起動するとOculus Riftで見られるようになっているはずです。 ちなみにメニュー画面に限っては、F11を押すことでPCモニタ表示に切り替えもできます。

適当に荷物を請け負ってヨーロッパの街に繰り出しましょう! 今まではハンドル操作と視点操作の両方のコントロールに気を配る必要がありましたが、 Oculus Riftで視点の操作が自然にできるようになり断然快適になりました。

交差点とかロータリーに進入するときの左右確認もこれで安心。 また運転中に軽いよそ見もする余裕ができたので、窓から見えるヨーロッパの風景も楽しめるようになりました。

f:id:kaninabe:20160629031239p:plain

f:id:kaninabe:20160629031639p:plain

バックするときは後ろ振り向かないといけないのでちょっと面倒くさい気もしますが、それもまたリアルで良し。

そんな訳でVR用にEuro Truck Simulator 2、おすすめです。 Steamのサマーセールは7/5までなので購入の際はお早めに。

お財布に余裕のある人はハンコン併用すれば没入感MAXです。 フォースフィードバック機能があるハンコンならハンドルから路面の振動まで伝わってきてドライバー感覚にどっぷり浸れます。 ちょっと高いけど…Oculus Rift買える人なら行ける!

もうちょい安価なタイプだとこの辺がおすすめ。

ロジクール ドライビングフォース GT(LPRC-14500)

ロジクール ドライビングフォース GT(LPRC-14500)

Google VR (Daydream) コントローラをAndroid Nでない実機(Android、iOS)から利用する。Unity Remote不要な方法

f:id:kaninabe:20160607002223p:plain

前回はGoogle VRアプリのサンプルを動作させるまでを書きました。

vr-cto.hateblo.jp

ただコントローラとの連携などCardboard時代にはなかった機能を使うには、 Android N DP3以降がインストールされた対応端末(今の所Nexus 6P)が必要だということでした。 ただし、Unity Editor上では適当なAndroid端末に コントローラのエミュレータアプリを入れて動作を検証することは可能ということでした。

そういう訳で、実機上でコントローラなどを試すにはとにかくNexus 6Pを買ってAndroid Nをインストールする必要があるのですが、 面倒くさいしNexus買う金もないけど、何とか手持ちの実機でも使わせてよと我儘なことを考えていました。

ちなみにmogura VRさんがUnity Remoteを使った方法も紹介されています。 まあデバッグ目的にはこれでいいかもしれませんね。

www.moguravr.com

ただエミュレータアプリに接続するルーチンはネイティブで書いてある訳では無さそうだったので、 もしかしたらUnity Remoteを使わなくても実機で動かせるんじゃない?
ついでに言うとiOSでも動かせるんじゃない?
と軽い気持ちでソースを眺めることにしました。

結論:できた。

少しソースを修正するだけで簡単にできたので以下に手順を書いていきます。多分Unity Remote使うよりもサクサク動くんじゃないかなあ。

必要な物

  • Google VRアプリを書き出せるUnity開発環境
  • コントローラ用Android端末
  • Google VRアプリを動かす端末(Android or iOS端末)

UnityのAndroidiOS開発環境は整っているものとします。 また、コントローラ用Androidには前回の記事を参考に コントローラのエミュレータアプリをインストールしておいてください。 ちなみに今回コントローラに使用した端末はGalaxy S6 (Android 6.0.1)、 Google VR側は同じくGalaxy S6、 またiOS検証用としてiPad mini2 (iOS 8.3)を使いました。

1. AndroidWifiをONにしてネットワークにつなぐ

USBでなくWifiで接続するので2台のAndroidWifiをオンにします。 ちなみにGoogle様の解説によるとGoogle VR側の端末からコントローラ側の端末につなぐ方法は

(a) コントローラの側の端末を親機にしてテザリングする
(b) 2台をLANにつなぎつつ、Google VRを動かす端末上のGoogle VR Servicesの設定でコントローラ端末のアドレスを指定

という2つの方法が提案されています。 (b)はGoogle VR ServicesがそもそもAndroid Nで追加された機能かと思うので(a)を使うのが楽かと思います。 ただ自分の場合はSIMが刺さっておらず、SIMがないとテザリングできないと言われました。

f:id:kaninabe:20160606175141p:plain:w300
Oh...

まあそういうことなので諦めてLAN環境につなぐことにして話を進めていきます。 とりあえずコントローラ側でコントローラのエミュレータアプリを開いて IPアドレスを確認しておきます。

f:id:kaninabe:20160606175005p:plain:w400

2. Unityプロジェクトとスクリプトの修正

前回も使用したコントローラ確認用のサンプルアプリを利用します。 ヒエラルキー内のオブジェクト"GvrControllerMain"のGvrControllerコンポーネントに emulatorConnectionModeというパラメータがあります。 デフォルトではUSBになっていますが、今回はWifiを使うので設定を変更します。

f:id:kaninabe:20160606174940p:plain

次にスクリプトを少し修正します。修正箇所は次の2か所です。

  • Assets/GoogleVR/Scripts/Controller/Internal/Emulator/EmulatorConfig.cs
    // IP address of the phone, when connected to the PC via WiFi.
    public static readonly string WIFI_SERVER_IP = "192.168.0.78";//"192.168.43.1";

このファイルの最後にWIFI_SERVER_IPという変数があるので、 これを先ほどのコントローラ端末のIPへと書き換えておきます。 もし手順1で(a)のコントローラを親機とするテザリングを選択した場合は、親機のIPアドレスが192.168.43.1になるらしい?ので、 ここの変更はしなくてよいかも(未確認)。

  • Assets/GoogleVR/Scripts/Controller/Internal/ControllerProviderFactory.cs
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_ANDROID || UNITY_IOS // <-- ここにUNITY_ANDROIDとUNITY_IOSを追加
      // Use the Controller Emulator.
      return new EmulatorControllerProvider(owner.emulatorConnectionMode, owner.enableGyro,
          owner.enableAccel);
//#elif UNITY_ANDROID // ここ以下3行をコメントアウト
//      // Use the GVR C API.
//      return new AndroidNativeControllerProvider(owner.enableGyro, owner.enableAccel);
#else

26行目辺りからの#ifディレクティブを修正。AndroidiOSの時もEditor、スタンドアロンの時と同じようにエミュレータを使うよう書き換えます。#elsif UNITY_ANDROIDの所の処理はコメントアウトしておきます。

3. 書き出し・実行

Galaxy S6に書き出し。ちゃんと動いた。


Google VR (Daydream) controller demo on Galaxy S6

続いてiPad miniでも書き出し。 本当はiPhoneでやるべきところをiPadでやっているのでサイズが変になっていますがお気になさらず。 しかしこちらでもちゃんとコントローラの動きがとれています。

f:id:kaninabe:20160606220414p:plain

これでコントローラを使ったデモも機種にこだわらず実機でできるようになりました! IPアドレスが変わったら書き出し直さないといけない欠点はありますが。 また、非常にアドホックな方法なうえ、公式の推奨しない利用方法でもあるため、今後のバージョンアップで使えなくなる可能性もあることにはご注意を。

どうでもいいおまけ - Gear VRでもGoogle VRアプリを一応見られる。

f:id:kaninabe:20160606233522p:plain

Cardboardを使わずにGear VRでGoogle VRアプリを見る方法。

Google VRアプリが起動した状態でGalaxyをGear VRに甘差しして、ピントをうまく調整すれば一応両眼視ができます。 旧バージョンのGear VR(Innovator Edition)だとぴったりとはまってOculus Homeが起動してしまうので、ちょっとたてつけの悪い製品版の方がおすすめです。 端子をきっちり差し込まないように意識してパチンとはめるのがコツです。

まあCardboardくらい買えっつー話ですね…。

UnityでDaydream(Google VR)を試してみる

f:id:kaninabe:20160530043728p:plain

つい先日Googleから発表のあったDaydreamですが、気が付けばもうSDKとUnity用のサンプルが出ていたのでとりあえず試してみました。

developers.google.com

Daydreamとは

VR界隈の人はもうご存知と思いますが一応。

Daydreamとは今月行われたGoogle I/O 2016で発表された、Android向けのVRプラットフォームのことです。

今までGoogleはモバイル向けのVRソリューションとしてGoogle Cardboardというプラットフォームを提供していました。 CardboardではAndroidスマホだけでなくiPhoneも含む広範囲な機種を、VR表示ディスプレイとして使うことができます。 またHMDのガワはオープンソースで提供され、段ボールでも組み立てられるお手軽さが売りでした。

GearVRが登場以降も低コストなVRコンテンツ向けとして一定の支持を得ていました。 しかし、OculusやSamsungAndroidのVR市場を席捲しているのに危機感を抱いたからでしょうか。 Cardboardの機能をAndroidOSに組み込みつつ、 さらに高品質なVRプラットフォームであるDaydreamを提供することとなったのです。 DaydreamではCardboardでも提供されていたオープンソースなグラスだけでなく コントローラもセットになった設計となっています。

Daydreamを動かすには (実機)

Daydreamを動かすことのできる端末は現時点ではNexus 6Pのみとなっています。 Nexus 6PにAndroid N Developer Preview version 3(以降)をインストールすれば、 実機でDaydreamアプリを試すことができるようです。

今回は、Nexus 6Pを持っていないので実機については割愛です…。

Daydreamを動かすには (Unity)

とりあえず実機は置いておいて、Unity上で開発することだけ考えます。

Cardboard + DaydreamなGoogle VR SDKが既にリリースされており、 Unity向けSDKも提供されています。 とりあえずダウンロードしてサンプルを試してみましょう。

ここからダウンロードするか、 以下のようにgit cloneしてください。

# git clone https://github.com/googlevr/gvr-unity-sdk.git

展開した(git cloneした)ディレクトリ直下にGoogleVRForUnity.unitypackageというパッケージファイルがあるので、 これをUnityプロジェクトにインポートしましょう。

インポート後、 Assets/GoogleVR/DemoScenes以下にデモシーンがあるので適当なのを選んでPlayすればOKです。

f:id:kaninabe:20160530034915p:plain

デモプログラムはUnity Edito上では以下のようにカメラが動きます。

  • Altボタンを押しながらマウスを動かすと、上下左右にカメラパン
  • Ctrlボタンを押しながらマウスを動かすと、カメラがロール回転

コントローラのエミュレート

さて、Daydreamの特徴でもあるコントローラ機能をUnityで使ってみましょう。
コントローラですが、今の所ハードウェアが出てるわけでもないのでどうすれば…

でも大丈夫。Google様はコントローラのエミュレータも用意してくれています。
エミュレータAndroid端末(4.4以降ならだいたいOK)で動くアプリになっており、 ここからapkがダウンロードできます。 このapkを手持ちのAndroidにコピーして実行するか、USBケーブル越しにadbでインストールしてください。

# adb install controller_emulator.apk

Android端末にインストールされた"Controller Emulator"を実行するとこんな感じ。

f:id:kaninabe:20160530040507p:plain:w300

上の大きい丸がタッチパッドエリア、
真ん中の"-"マークの丸がAppボタン、
下の"o"ボタンがHomeボタンです。

このアプリを立ち上げてUnityを実行しているPCにUSB接続すれば、 Android端末をコントローラとしてエミュレートできます。 (USBデバッグをオンにすること)
VRアプリと接続されたら上のメッセージが"Connected!"となります。

コントローラを使ったサンプルはAssets/GoogleVR/DemoScenes/ControllerDemo/ControllerDemo.unityです。 先ほどのアプリを立ち上げた状態でPlayしてみましょう。

f:id:kaninabe:20160530045634g:plain できました。コントローラ(Android端末)を傾ければカーソルが動き、キューブにカーソルを当ててコントローラをドラッグ(タッチパッドエリアを押しながらコントローラを傾ける)すればキューブが動かせます。

コントローラのAPIにはGvrControllerクラスを使うことでアクセスできます。非常に簡単・便利です。

Controller API Basics  |  Google VR  |  Google Developers

実機で完全に動かすにはNexus 6Pを買うか、ほかの対応端末の発売を待たなければいけませんが、楽しみですね!

Unity Cache Serverを使う。 CentOS6/7でのサービス作成の話

f:id:kaninabe:20160522001949p:plain

Unityのアセットインポートって結構時間かかりますよね…。
多数のファイルをうっかりインポート始めてしまったために数時間作業を中断するはめに…という経験のある人もいるかと思います。

そんな時役立つのがUnity Cache Server。Editor上で一度インポートしたアセットのデータをキャッシュしてくれるサーバプログラムです(Unity Pro限定)。

Unity - マニュアル: キャッシュサーバー (チームライセンス)

Proライセンスを持っていてある程度の規模のプロジェクトを回している人は大抵使っているのではと思います。

Cache Serverのプログラムをネットワークのどこかのマシン(サーバ)で動かしておき、 Unity EditorでCache Serverの設定をしている状態でアセットのインポートをすれば、そのインポートデータが自動的にサーバにキャッシュされます。 その後同じアセットをインポートする際、インポート処理を行う代わりにキャッシュデータを勝手にダウンロードしてくれるので、インポート時間の節約になるのです。 例えば開発チームのメンバー間で同じプロジェクトを共有して作業する場合、 またマルチプラットフォーム向けの開発をしていてSwitch Platformを頻繁に行う場合などに非常に効果があるわけです。

さて、今回はこのCache ServerプログラムをCentOS6と7のサーバマシン上でサービスとして動かす手順をまとめてみたいと思います。 Unityの話というよりはCentOS(RedHatlinux)でのサービス作成方法の話ですね。

Cache Serverの入手・実行(サーバ上の操作)

とりあえずCache Serverをサーバ上にダウンロードして実行する所から始めます。
ダウンロード場所が少し分かりにくいですが、ダウンロードページの「追加ダウンロード」を押すとリンクが出てきます。

f:id:kaninabe:20160522003451p:plain Unity - Update

パッチリリースのページにもあります。Windows向けとMac向けで2つリンクがありますがどちらも内容は同じ?

f:id:kaninabe:20160522011811p:plain Unity - Unity QA - Patch Releases

こうしてダウンロードしたプログラムをサーバ上で動かすことで利用できます。 サーバはいわゆるサーバ専用機でなくても、作業するマシンから参照可能なネットワーク上にあり、 ディスク・メモリに余裕のあるマシンなら大丈夫です。 極端な話、作業するマシン上で動かしてもかまいません。 ただしマニュアルページにも書いてありますが、 ファイルシステムの関係上WindowsではなくMacLinuxを使うべしとのことです。 今回はCentOSなのでOKですね。

zipファイルを解凍してできたディレクトリにRunLinux.shというシェルスクリプトが用意されているので、 シェル上でこれを実行するだけでOKです。

Cache Serverの利用(Unity Editor上での操作)

f:id:kaninabe:20160522002043p:plain

実際に作業するUnity Editor上では、(WindowsではEdit、MacではUnityの下から)Preferencesダイアログを開き、Cache Serverタブを選択。 「Use Cache Server」にチェックを付け、「IP Address」にサーバのアドレスを入れます。 もし正しくサーバプログラムが動いており、ネットワーク越しにアクセス可能であれば[Check Connection]ボタンを押した時にConnection Successfulと出ます。

この設定が完了した状態でアセットのインポートが起きた場合に、サーバ上へインポート済みデータがキャッシュされるようになります。 ある少し大きめのファイルをインポートする際、1回目はインポートに少し時間がかかりますが、 2回目以降はキャッシュを利用するためインポート時間が短縮されているかと思います。

CentOS6でのCache Serverのサービス作成

さて、基本的には上記のRunLinux.shをnohupコマンドを使うなどしてバックグラウンドで走らせれば利用可能になるですが、 この状態だとサーバプログラムが稼働しているかの確認や、プログラムの停止などが少し面倒だし、 サーバを再起動するなどした場合に、Cache Serverもいちいち立ち上げ直す必要があります。 このようにずっと立ち上げておくタイプのプログラムはサービスとして登録しましょう。 起動・停止や自動起動の設定などが簡単にできるようになります。 では、Cache Serverのプログラムをサービスに登録していきたいと思います。

まず前準備として、Cache Serverプログラムを解凍してできるディレクトリを/opt/CacheServerとして配置します。 また、/opt/CacheServer以下にキャッシュデータを置くものとし、 そのためにCacheServer以下のディレクトリ所有者をサービスを実行するユーザ(ここでは仮にunitysrvとします)に変更しておきます。

# unzip CacheServer-5.3.4p6.zip
# mv CacheServer /opt/
# chown -R unitysrv:unitysrv /opt/CacheServer/

CentOS6上でサービスを作成するには、/etc/init.d以下に起動・停止を行うシェルスクリプト(initスクリプト)を記述します。 ラッキーなことに以下のページにスクリプト例がありました。

Cache server installation on CentOS | Unity Community

これを少し修正して以下のようにしました。

#!/bin/sh

### BEGIN INIT INFO 
# Provides: unity_cache_server
# Required-Start $network $remote_fs
# Required-Stop: $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Unity Cache Server.
# Description: Unity Cache Server provides fast importing
# of assets that have already been processed by any member of the team.
### END INIT INFO

if [ -f /etc/init.d/functions ]; then
    # Source function library.
 . /etc/init.d/functions
else
    echo_success () { echo -n " [ OK ] "; }
    echo_failure () { echo -n " [FAILED] "; }
fi

if [ -f /etc/sysconfig/network ]; then
        # Source networking configuration.
        . /etc/sysconfig/network

        # Check that networking is up.
        [ X\${NETWORKING} = Xno ] && exit 0
fi

##
# UnityCacheServer startup script
##

################################################################################
## EDIT FROM HERE
################################################################################

# Installation prefix
PREFIX="/opt/CacheServer"
# Username to run as
CSUSER="unitysrv"

CACHEDIR=$PREFIX/cache5.0
LEGACYCACHEDIR=$PREFIX/cache

# Arguments
ARGS="--path $CACHEDIR --legacypath $LEGACYCACHEDIR"

################################################################################
## STOP EDITING HERE
################################################################################

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PROG="unity_cache_server"
DAEMON_APP=$PREFIX/RunLinux.sh
DAEMON="nohup $DAEMON_APP $ARGS > /dev/null 2> /dev/null &"
RETVAL=0
PID=""

getpid() {
    PID=`ps ax | grep $PREFIX | grep -v grep | awk '{print $1}'`
}

start () {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is already running."
        return 0
    fi

    echo -n $"Starting $PROG: "
    su -l $CSUSER -c "$DAEMON"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
        echo
    else
        echo_failure
        echo
        exit 1
    fi
}

stop () {
    getpid
    if [ ! $PID ]; then
        echo $"$PROG is not running."
        return 0
    fi
    echo -n $"Stopping $PROG: "
    su -l $CSUSER -c "kill $PID"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
}

restart () {
    stop
    start
}

dostatus() {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is running."
    else
        echo $"$PROG is not running."
    fi
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    dostatus
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage: unity_cache_server {start|stop|status|restart}"
    exit 1
esac

exit $RETVAL

このファイルを/etc/init.d/unity_cache_serverとして保存し、 実行権限を与えてサービスをスタートします。

# chmod +x /etc/init.d/unity_cache_server
# service unity_cache_server start
Starting unity_cache_server:                               [  OK  ]

OKと出れば起動成功です。
これでさらにchkconfig --addで自動起動設定を追加。chkconfig --listで確認してランレベル2、3、4、5がonになっていれば大丈夫です。

# chkconfig --add unity_cache_server
# chkconfig --list unity_cache_server
unity_cache_server      0:off   1:off   2:on    3:on    4:on    5:on    6:off

CentOS7でのサービス作成

CentOS7ではサービスの登録はsystemdを使います。 CentOS6の場合のようなシェルスクリプトを書くのではなく、 ディレクトリ/etc/systemd/systemに次のような設定ファイルを配置することでサービスを定義します。

[Unit]
Description=Cache Server for Unity
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/opt/CacheServer/RunLinux.sh --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache 
WorkingDirectory=/opt/CacheServer
KillMode=process
Restart=always
User=unitysrv
Group=unitysrv

[Install]
WantedBy=multi-user.target

この内容の設定ファイルを/etc/systemd/system/unity_cache_server.serviceという名前で保存します。 設定ファイルの詳細なフォーマットは省略しますが、要はExecStartで指定したコマンドを実行してくれます。 CentOS6のシェルスクリプトに比べて非常にシンプルに記述できるのでいい感じですね!

さて、ではサービスの登録・スタートを行います。 systemctl enableでサービス登録、systemctl startでサービススタートです。

# systemctl enable unity_cache_server.service
# systemctl start unity_cache_server.service

systemctl statusで稼働状態を確認しましょう。「Active: active (running)」と出ていればOKです。

# systemctl status unity_cache_server.service
● unity_cache_server.service - Cache Server for Unity
   Loaded: loaded (/etc/systemd/system/unity_cache_server.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-05-17 23:50:49 JST; 30s ago
 Main PID: 2078 (node)
...

これでサーバマシンを再起動した時にCache Serverも自動的に立ち上がるようになります。 さらに設定ファイル内のRestartを適当に設定しておけばプログラムが不正終了しても プログラムを立ち上げ直してくれます。

# ps ax | grep CacheServer
 2078 ?        Ss     0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache
 2167 pts/0    R+     0:00 grep --color=auto CacheServer
# kill 2078
# ps ax | grep CacheServer
 2168 ?        Ss     0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache
 2174 pts/0    R+     0:00 grep --color=auto CacheServer

Cache Serverのプロセスをkillしても再び立ち上がっていますね。

これでUnityのキャッシュサーバがいつでも使えます!!

新発売のGalaxy S7 edgeの期待値が高い件

f:id:kaninabe:20160514000233p:plain

Galaxy S7 edgeがついに日本でも5/19に発売されますね。Gear VR対応端末としては国内ではGalaxy S6/S6 edge以来の機種。 docomoauからの発売でsoftbankは今回は無いようです。 また国内では曲面仕様のS7 edgeのみの発売でS7の発売は今の所無しのようです。

さて、S7 edgeを5/18までに予約した人には両社ともGear VRをプレゼントするキャンペーンをやっていて、これも結構話題になっていますね (docomoはGear VRの代わりにdポイント7000ポイントをもらうことも可能)。 VRを体験してみたい人もGear VR開発に挑戦したい人も、この機会に購入してもらって、もっとVR業界を盛り上げてもらえれば…!

www.nttdocomo.co.jp

au-s7edge.galaxy-cp.jp

Galaxy S7 edgeのスペック

S6 vs S7みたいな比較は色んなサイトで既にやられていますので、 ここではあくまでもVRユーザ/開発者としてみた場合に注目すべきスペックのみに絞ってチェックしていきたいと思います。

Galaxy S6 edge Galaxy S7 edge
サイズ(縦x横x厚さ) 142mm x 70mm x 7mm 151mm x 73mm x 7.3mm
重さ 132g 158g
CPU Exynos7420 8コア (2.1GHz x 4 + 1.5GHz x 4) Snapdragon820 4コア (2.2GHz x 2 + 1.6GHz x 2)
GPU Mali-T760MP8 Adreno 530
メモリ 3GB 4GB
ビデオ再生解像度 4K @ 30fps 4K @ 60fps
バッテリー 2,600mAh 3,600mAh
microSDスロット 無し SDXC対応、最大200GB
防水防塵 無し 防水(IPX5/IPX8)、防塵(IP6X)

サイズ・重量は若干増

f:id:kaninabe:20160514002343p:plain

VR用途で考えた場合にはそれほど大きな増加ではないので影響は少なそうです。 ただ日常での利用を考えるともちろんマイナス要素なので、 気になる場合はショップなどで実物を触って確認するのが無難でしょう。

CPUはSnapdragon820、発熱が改善か

Snapdragonは前のモデルの810が爆熱で不評だったようですが、820はその辺りの問題を克服したようで、発熱の検証実験でもGalaxy S6/S6 edgeより優秀な結果が出ているようです。 Gear VRの利用で一番の問題は発熱で、コンテンツによってはすぐに警告が出ることもあったのでこの点には期待が高いです。

www.androidcentral.com

メモリも4Gになり、よりハイスペックなアプリの実装も試せそうです。

4K動画の60fps再生が可能に!

また820の特徴のひとつとして外せないのが、4K動画の再生が30fpsから最大60fpsになったことではないでしょうか。 PCでないと描画できないような高画質なCG空間を360°全方位の動画としてVRコンテンツに組み込む手法は Gear VR向けコンテンツではもはや定番かと思います。 それが60fpsになったことでよりヌルヌル感の高いクオリティが実現できそうですね。 自分的には最も試してみたい点です。

blog.livedoor.jp

バッテリー容量は1.4倍に大幅アップ

バッテリー容量は2,600mAhから3,600mAhに増加。 VRコンテンツをプレイするうえで、発熱に次ぐ心配といえばバッテリーの持続時間なので、この改良も非常にイイですね。 ただ、Snapdragon820の目玉機能のひとつ、Quick charge 3.0は搭載されないようです。まあ2.0でも十分高速ですが少し残念。

microSDスロットが復活、200GBまで増量可能

S6/S6 edgeでは内部メモリのみでmicroSDには対応していませんでしたが、 S7 edgeでは内部メモリ32GBに加え、最大200GBまでのmicroSDカードの利用が可能となっています。 VRコンテンツは容量の大きいものが多いので、内部メモリのみの前仕様はかなり不評だったんじゃないでしょうか。 360°全方位の動画ファイルなどは数GBいくものもざらにありますからね。 そうしたコンテンツを大量に入れておくのにもいいですし、 microSDカードを交換することでデータを差し替えたりという運用法も可能となりそうです。

防水防塵に対応

VRを楽しむ場は部屋の中などの屋内が普通だと思います。 そういう意味で水回りなどの危険とは縁遠いものでした。 しかしS7 edgeで防水防塵に対応したことで、 屋外などでの多少ハードな使い方も増えていくかもしれません。

結論:スペック的には文句なしに買い

と、まあ色々挙げましたが、サイズ・重量の増加を除いてほぼ順当に進化しており、 海外のレポートでも特に大きな地雷報告も無いので、 VRデバイスとしても間違いなく買いであると言えるでしょう。

普段は「新製品にそんなに急に飛びつく必要無いんじゃない?」とか「人柱の報告を待ってから」というスタンスなので、 Galaxy S7 edgeも当初はそこまで期待していなかったのですが、 調べてみるとVRコンテンツを開発していて気になった点を意外にもちゃんとカバーしてきていたので、 推しの記事を書いてみました。

既存のS6/S6 edgeユーザの方は特に慌てる必要は無いかと思いますが、 新規購入の方には迷いなくS7 edgeをお勧めします。 是非予約特典でGear VRを手に入れてもらって、VRの裾野がさらに広がればと思います。

PLYモデルをUnityで使う

f:id:kaninabe:20160508222726p:plain

PLYフォーマット・・・スタンフォード大で1990年代に開発された3次元モデルのフォーマット。
以下のサイトで代表的なモデルのデータが配布されています。 かの有名なStanford Bunnyもこのフォーマットで公開されています。

The Stanford 3D Scanning Repository

現在あまり主流の3Dフォーマットではないですが、自分は仕事柄、今でもよく使っております。 センサ計測したデータに使われることが多いでしょうか?
という訳でこのフォーマットのモデルをUnityで読み込ませてみたいと思います。

Unityで読み込めるフォーマットはfbx、dae、obj、dxfか、 もしくは3DSMAXやMAYA、Blenderなどのメジャーな3Dアプリケーションの保存形式に対応しています(詳しくはここを参照)。
が、残念ながらPLYフォーマットは入っておらず。ではどうすればいいか。

方法1: 有料アセットを使う

Unity非対応の3Dフォーマットをインポート可能にするアセット。

Esoteric Mesh Importer

お値段は$20。PLY以外にも20以上のフォーマットに対応しています。 Windowsのみのサポートのようです(一度インポートすれば他のプラットフォームで利用可能)。

方法2: MeshLabで対応形式に変換

無料の方法は無いのか?そんなときは別のアプリケーションで対応する形式に変換してやりましょう。 自分のおすすめはMeshLabです。

meshlab.sourceforge.net

このページのDownload Latest Versionのリンクから自分のプラットフォームのインストーラをダウンロードしてインストールします。Win、Mac両対応です。

PLYファイルはとりあえず上のスタンフォードのページから適当なデータをダウンロードして解凍します。 ばらばらのレンジデータ(3Dセンサで計測した生のデータ)もありますが、 reconstructionとかreconstructedとか書いてあるのが完成したデータです。

MeshLabを立ち上げてPLYファイルをドラッグ&ドロップすれば読み込めます。 そんでもって[File]->[Export Mesh As...]で適当なフォーマットを選べばOKです。
Unityに対応しているのだとdaeかobjですね。

f:id:kaninabe:20160508220125p:plain

後は書き出したobjもしくはdaeファイルをUnityプロジェクトにインポートすればOKです。

f:id:kaninabe:20160508221457p:plain
できた。

大きいモデルをインポートするには

Bunnyくらいなら問題ないですが、あまりにデカいモデルだとUnityにインポートするのも表示するのも大変です。 スタンフォードのページにも面数が100万、1000万を超えるような大きなモデルが結構あります。 例えばAsian Dragonのモデルは面数は約700万あります。そんな大きいモデルはMeshLabで面数を減らしてやります。

[Filter]->[Remeshing, Simplification and Reconstruction]->[Quadric Edge Collapse Decimation] でダイアログが開きます。

f:id:kaninabe:20160508223741p:plain

このダイアログで減らした後の面数を指定するか、どのくらいの割合まで減らすかを0~1で指定してApply。 ここではとりあえずAsian Dragonの面数を1/10に減らしてみます。

f:id:kaninabe:20160508221347p:plain
これでこのモデルもインポートできました。

なんだかMeshLabの紹介のようになってしまいました。
MeshLabはPLY以外にも多くのフォーマットに対応してますし、面数の削減以外にも多数の便利機能がありますので、利用価値は高いと思います。

PLYファイルもスタンフォード大のページのように 高精細、高品質な文化財3Dデータを公開しているところがいくつかありますので、 大いに活用されるといいと思います(利用ライセンスの確認はお忘れなく)。