UnityのApplication.Quit()がWindows環境でフリーズしたりしなかったりする
Application.Quit()によるアプリのフリーズ
Unityのversionを5.3.6p1にあげたところ、Application.quit()が動いたり動かなかったりするようになってしまいました
動かないときはアプリ自体がフリーズして最終的にはクラッシュしてしまいます
調べてみると色々なversionで多くの人が同じ問題に遭遇しているらしいのですが、根本的な原因に関しての記述は見つかりませんでした。
対応策も人によって様々なのですが、自分がうまくいった方法は、Application.quit()後すぐにreturnして、明示的にそれ以降の処理をスキップさせる方法です
void Update () { if (終了させるためのトリガー){ Application.Quit(); return; } // 以降いろんな処理 }
これでいまのところは正常に動いています。
GoPro6台で360動画を撮影して貼り合わせる方法(定点撮影)
GoPro6台でジグを利用して動画を撮影し、Kolorを利用してスティッチしてEquireqtangular形式の360動画を作成するまでの流れです
利用した機材・ツール
- GoPro Hero4 Black Adventure × 6台
- GoPro用ジグ
- GoPro用リモートコントローラ(Smart Remote)
- SDカード
- Kolor Autopano Video
手順
撮影
1. GoPro設定
水中ケースからGoProを外して設定を行います
各種設定項目は以下を参照してください
http://freedom360.us/camera-settings/
注意点としては、6台用のジグを利用する場合アスペクト比は4:3でないとうまくスティッチができません
2. Wifiリモコンとのペアリング
GoPro本体側の設定
GoPro用のリモコンであるSmart Remoteとペアリングをします
GoPro左側面にあるボタンを押して、設定画面を表示させます
『Wifi』の項目からペアリングモードを開始できます。
(3分間ペアリング状態になり、3分経ってもペアリングしないと終了します)
リモコン側の設定
この状態でリモコンの赤い丸ボタンを押しながら、電源ボタンを一度押します
リモコンがペアリングモードで起動し、GoPro本体とペアリングが開始します
無事ペアリングが完了すると6CAM/READYという表示がリモコン側に表示されます
3. ジグに装着する
設定の完了したGoProをジグに取り付けます
4. 撮影
リモコンの赤い丸ボタンを押すとペアリングされているGoPro全台で録画が開始します。
ただし一台のリモコンから同時に信号を送ったとしても、各GoProが録画を開始するタイミングには若干のラグがあります。
あとでタイミングを合わせるための目印として、撮影の最初か最後のに手を叩いて音を出しておきます。
撮影が終わったらもう一度赤いボタンを押せば録画終了です。
5. 動画の取り込み
SDカードから、もしくはUSBケーブルをGoPro本体へ接続して撮影したmp4データをPCに取り込みます
貼り合わせ
ここからはkolor社のAutopano Videoというツールを利用し、6台分の映像データを貼り合わせて一つの360動画にしていきます
1. AutoPano Video起動&動画読み込み
AutoPano Videoを起動すると以下のようなウィンドウが表示されます
D&Dで映像ファイルを6つまとめてAutopano Videoに取り込みます
2. 動画のシンクロナイズ
撮影の項目で書きましたが、GoProで撮影した6つの動画ファイルは少しずつ(1秒以下ですが)再生開始時間がずれています。
まずはこのずれを修正します。
1. 下半分の秒数が表示されている項目から、手を叩いたのがおおよそ何秒くらいだったか調べます
2. 次にSychroという項目を選択します
3. Search range around current timeに、上記で調べた手を叩いたおおよその秒数を入力します
4. Use audio to synchronizeをクリックします
(目印となる音がない場合は、隣のUse motion to synchronizeを選択します)
5. autopano videoが指定された秒数の前後から目印となる音を自動で探し出してくれます
6. Nearrest frameにそれぞれのGoProのずれが表示されるので、あまりにも大きな数字がなければ、右下のApplyを選択して、自動で検出した目印を基にシンクロナイズします
3. 簡易スティッチ(貼り合わせ)
次に動画を貼り合わせます
シンクロの隣のStichという項目を選択します
スティッチの設定画面が出てきます
- 一番上の項目(Stitch as)が『GoProHero3+/4』になっていることを確認します
- 中段の項目(Stich at)が『Current position』になっていることを確認
- current position: 現在の再生ポジションのみを参考にスティッチを行う(カメラを固定した定点撮影のときのみ利用)
- current selection: 設定した数だけランダムにframeを抜き出して、それらをもとにスティッチを行う(最大99frame)
スティッチが完了すると上段の一番右にRealtime previewという名前でEquirectangular形式の画像が表示される
5. 確認
作成した360動画をOculusなどのHMDで見る方法はいくつかありますが、同じくkolor社のGoPro VR Playerを使うのが一番簡単かと思います。
Kolor | GoPro VR Player - Watch 360-degree videos and images offline
注意点とか
- AutoPano Videoによる自動スティッチは精度があまり高くありません。きちんとやる場合はAutopano Gigaというツールで手動でスティッチする必要があります
- (ただしこちらは少し使い方が難しく、もう少し詳しくなったらまた別でブログに書きたいと思います)
- 6台で撮影する際は、メインの被写体がカメラとカメラのつなぎ目に位置しないように注意した方がいいです
- (3台のカメラに跨って映っていたりするとスティッチがかなり面倒くさくなります)
- 今回は手を叩いた音でシンクロナイズをしましたが、motionによってシンクロナイズすることも可能です。
Unityをコマンドラインからオプションを指定して起動する
通常Unityは立方体のUnityのアイコンをクリックして立ち上げるが、コンソールから実行するとコマンドライン引数としてオプションを指定することができる
Unity - マニュアル: コマンドライン引数
Windows環境の場合はコマンドプロンプトで以下のように実行する
起動
> cd "\Program Files\Unity\Editor" > Unity.exe
ビルド
> cd "\Program Files\Unity\Editor" > Unity.exe -quit -buildWindows64Player <pathname>
オプションの指定
> cd "\Program Files\Unity\Editor" > Unity.exe <option> > Unity.exe -force-d3d11-no-singlethreaded ### example
ちなみにここで指定したオプションはビルド時には反映されないが、ビルドされたアプリケーションもコマンドラインから起動することで上記のオプションを指定することができる
> ${buildしたアプリ}.exe -force-d3d11-no-singlethreaded
AVProVideo/AVProWIndowsMedia/AVProQuickTime
AVProシリーズはプロダクトが色々あって当初結構混乱したのでまとめ
AVPro QuickTime
- http://renderheads.com/product/av-pro-quicktime/
- すでにUnity AssetStoreからは提供終了
- 以下に置き換えられている
- AVPro Video
- AVPRO Video(iOS)
AVPro Windows Media
- http://renderheads.com/product/av-pro-windows-media/
- すでにUnity AssetStoreからは提供終了
- 以下に置き換えられている
AVPro Video
Unityでmp4の4K動画を再生する方法(AVProWindowsMedia)
AVProWindowsMediaでmp4の4K動画を再生できるようにする方法です
公式のドキュメントに方法があるので、それに沿って説明します。
http://downloads.renderheads.com/docs/UnityAVProWindowsMedia.pdf
Super High Resolution 4K / 8K Playback
ここをざっくり訳すと...
高解像度の再生にはXVidかHapコーデックがいいよ。この二つは早いし、他のコーデックはCPUの負荷が高いからおすすめしないよ。
ただMP4に関してはちょっと別で、そもそも通常H.264は高解像度の動画再生には向かないんだけど、高スペックなマシンなら動くよ。
もしあなたが大人の事情でどうしてもH.264を使用しないといけないんだったら、このReadmeのH.264のセクションを参照してみてね。
軽くここで説明すると、そもそもDirectShowは通常1080p以上のH.264の再生はサポートしてないんだ。だから3rdParyのdecorderをインストールして、Codec Tweakerっていうツールでデフォルトで呼び出すCodecを変更するって流れだよ。
(詳しくはFAQセクションを見てね)
C#でcharをASCIIコードに変換したり戻したりする方法
ASCIIコードにする方法
(int)変換したい文字
ASCIIから戻したい場合
(char)ASCIIコード
例
char foo = 'A'; Debug.Log ((int)foo); // ==> 65 char bar = ((char)65); Debug.Log (bar); // ==> A
C#でファイルの読み書きの方法
Read
StreamWriter writer = new StreamWriter(path); writer.Write(value); writer.Close();
- pathは保存したいファイルのパス
- Unityとかだと『Application.streamingAssetsPath + "/" + filename』みたいな
- valueは保存したいデータ
Write
StreamReader reader = new StreamReader(path); string value = reader.ReadToEnd(); reader.Close();
- 上記と同じ
- ファイルが隠しファイル(Hidden属性をもっている場合)はReadはできるがWriteはできない