VRChatで360°動画を撮ってYoutubeにアップロードするまで

# ■ゴール
こういうの。
https://www.youtube.com/watch?v=0iTFDZh4rdU
<iframe width="560" height="315" src="https://www.youtube.com/embed/0iTFDZh4rdU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# ■用意するもの
+ 自作アバターをアップロードできるVRChatアカウント
+ VR環境
+ できるだけ解像度の高いディスプレイ(4k以上が理想)
+ スクリーンキャプチャ(GeForce ExperienceのSHADOW PLAYでよい。ないならキャプボとか)
+ VRChat用全天球カメラ (https://booth.pm/ja/items/2147846)
+ Sizer (http://www.brianapps.net/sizer/)
+ Spatial Media Metadata Injector (https://github.com/google/spatial-media/releases/tag/v2.0)
+ Aviutlもしくは適当な動画編集ソフト(任意)

# ■要約
VRChat用全天球カメラがほぼ全部やってくれる。
これはアバターに仕込めるうえ投影法を正距円筒図法に設定できるので、Stream Cameraに送り込んでVRChatの画面をキャプチャするだけで原理的には撮れる。
アスペクト比2:1でやる必要があるので普通のディスプレイだとフルスクリーンモードが使えない。Sizerを使ってウィンドウサイズを正確に調整する。
メタデータが要るのでSpatial Media Metadata Injectorで360°動画として再定義させる。

# ■詳細手順
## アバターに全天球カメラを仕込む
まずアバターに以下のアセットを仕込みます。なんとたったの100円です。
https://booth.pm/ja/items/2147846

そのままだと写真しか撮れないのでいくつか手を加える必要があります。

+ 投影法を正距円筒図法にする

信じられないほど親切なことにシェーダーの設定で切り替えできます。
littlePlanetのチェックを外すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/50dc2ee0-d617-732c-fcfb-a1478d6f542d.png)

+ 変換解像度を撮りたいウィンドウサイズに合わせる

↑の画像のScreenHeightとScreenWidthの部分の数値を自分が撮りたい解像度の数値にします。
この数値とアス比が一致する時にだけ正距円筒図法へのオーバーレイが行われる仕組みっぽいです。

+ カメラ解像度を上げる(任意)

4096×2048などのクソデカ解像度で撮りたい場合、せっかくウィンドウを大きくしてもカメラ解像度が低いと単に拡大しただけになってしまいますのでカメラ解像度を上げるとよいです。
これは全天球カメラのヘルプにある通り単に6つのRender Textureの解像度を上げればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/509f5c52-65dc-0ccf-8a3a-fb56b93ea81e.png)
上げれば上げるほど激ぉもになるので注意してください。カメラ6個使うということは画面6枚を追加でレンダリングするのと同義なのでヤバいです。
多分複数人いる空間の撮影はハチャメチャなつよつよPCが要るんじゃないでしょうか。こわ。

+ ワールド固定オブジェクトとして設定する

Avatars3.0ならConstraintで任意のオブジェクトをワールド固定できるので、ここまでの設定を施したSphereCamをいい感じにワールド固定できるよう適当に設定します。
よくある「手に追従⇔固定」を切り替えできるやつがいいと思います。
わからない人はこのページが詳しいので参照。
https://note.com/berylmoon/n/neb481c4f1f9d

あとBoothに自動設定系ツールが出てるので使ってみてもいいかも。私は試してないです。

## VRChatウィンドウを録画用にセットアップする

### Windowsの拡大表示を100%にする

Windowsの設定で拡大表示をしていると数値通りにならなかったり見た目と違う解像度で撮れたりとろくでもないので100%にしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/a7d3c774-521c-9de0-d437-43975022a44f.png)

### ※2021/09/06 追記　ウィンドウサイズ指定方法について
VRChatがUnity 2019ベースへアプデされたことで、起動時のサイズ指定が起動メニュー方式からコマンドラインオプション方式に変わりました。
数値指定できるようになったのでこの節に書いたSizerを使う方法は不要になりました。
指定方法は公式ドキュメントの通りです。
https://docs.vrchat.com/docs/launch-options

-screen-width 4096 -screen-height 2048 -screen-fullscreen 0
とかやっておけば一発でクソデカウィンドウサイズを数値指定で起動できます。助かる。

古い情報も過去ログとして一応残しておきます↓

### Unity 2018の頃のウィンドウサイズ指定方法 (過去ログ)

Stream Cameraの映像はVRChatのウィンドウにしか送れないので、録画するにはこれを間接的にキャプチャするしかありません。
VRChat.exeを起動する時にShiftキーを押しているとウィンドウサイズが指定できますが、ここにはアスペクト比2:1の選択肢は通常出てきませんので、手動でウィンドウサイズを指定してやる必要があります。

Sizerというフリーソフトが、数値指定でウィンドウサイズを変更できるのでこの用途にピッタリです。
http://www.brianapps.net/sizer/

起動するとタスクバーの通知領域にSizerのアイコンが出るので、VRChatのウィンドウがアクティブなときに右クリックすると設定可能なウィンドウサイズの一覧が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/bbf3c137-9996-7a9a-9eab-1b2279bed5b2.png)
「Configure Sizer...」からこの一覧を編集できるので、360度用の解像度を追加します。
注意事項として、描画エリアのサイズではなくあくまでウィンドウサイズなので、タイトルバーとかウィンドウの枠の部分のサイズを加味してやる必要があります。
とりあえず撮りたい通りの数値を入れて撮ってみて、足りない分だけ足した設定を作ればいいと思います。
ヨドコロちゃんの場合4096×2048の描画エリアを得るのに4112×2088のウィンドウサイズが必要でした。Windowsのテーマとかによって違うかもなので各自でやってください。

### 全天球カメラの動作確認

設定可能なウィンドウサイズはディスプレイ解像度に依存するため、普通の16:9とか16:10のディスプレイを使っている場合は横幅MAXにして縦をその半分にしたサイズが限界になります。
4Kなら3840×1920ですね。
4KのディスプレイとFHDのディスプレイを横に2枚繋げると4096×2048が確保できるので今回はこれで撮りました。

ウィンドウサイズを合わせたら、アバターから全天球カメラを出して設置しましょう。
そしてStream Cameraも出して全天球カメラの近くに置きます。
ウィンドウの描画領域が全天球カメラの映像になれば成功です。

※理論上ピッタリサイズのはずなのに、なぜか全天球カメラの映像にならないことがあります。原因不明です。
ただなんかウィンドウサイズの上下を微妙にドラッグすると映ります。録画してみると正しい解像度で撮れてる。何だろう……。
※後から編集する前提の場合、普通にフルスクリーンで撮ってから編集段階で縦に縮小して2:1にする方が楽かも。ウィンドウサイズを正しくする方法はこのままOBSとかに送って配信でも使えるようにする想定。
その場合メタデータとかがどうなるのかはまだ調べてない。そのうちやる……たぶん。

## 録画を実行する
ここまで来たらいよいよ撮影です。正距円筒図法状態になっているVRChatのウィンドウをキャプチャして動画を作ります。
![VRChat 2021.03.23 - 20.13.47.01_Moment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/90796130-a99a-81ed-94f6-0a6a87393354.jpeg)
↑「正距円筒図法状態」の例。画角が360度に広がり画面の右端と左端が繋がっています。上下端は薄く伸び広がっています。

GeForce ExperienceというフリーソフトにSHADOW PLAYという素晴らしい機能があり、インストールしておくだけでAlt+Z、Alt+F9のショートカットキーから即録画開始できます。FPSや画質も詳細に設定できるので最高。
https://www.nvidia.com/ja-jp/geforce/geforce-experience/

名前の通りGeForceのグラボがないと使えないのでRadeon民はキャプボなり他の手段を検討してください。
ちなみにWinキー+GでアクセスできるWindows標準のキャプチャ機能(ゲームバー)でも代用できなくはないですが1920×1080までしか録画できないので360°動画用途としては解像度が低すぎです。ガビガビでいいならまあ……。

詳しい設定とかはSHADOW PLAYのヘルプを見てください。まあ一目瞭然です。
60FPSで録画するようにしておくと動きがぬるぬるになってよいです。

## 編集する

動画が撮れたらAviutlなりAdobe Premiereなりお好みのソフトで編集します。
この時はまだ360度動画として設定されていないので正距円筒図法で歪んだ画像のままやることになります。
動画編集の方法についてはここでする話ではないので省略しますが、とにかくこの時点ではまだ360度動画として認識されていなくても大丈夫です。
ただなんかWindows付属の「映画＆テレビ」とかいうプレイヤーはメタデータではなくアス比かなんかで判定しているようで、撮りおろしの段階でも360°ボタンを押すと360度動画として動画を視聴できます。やったぜ。

エクスポートする推奨形式は通常の動画と同様です。公式に全部書いてあるので参照。H.264のMP4です。
https://support.google.com/youtube/answer/6178631?hl=ja

## メタデータを付与する

編集が終わったら最後の仕上げとしてメタデータを付与します。
公式がSpatial Media Metadata Injectorを使ってくださいと言っているのでこれを使います。
https://github.com/google/spatial-media/releases/tag/v2.0

解凍して起動するとこんな感じの小さいウィンドウが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/05204ca1-bafc-91c9-620c-0b196a14c025.png)
Openを押して編集済みの動画を開きます。
すると「My video is spherical」のチェックをONにできるようになるのでONにします。
Inject metadataを押して変換後のファイル名を指定します。実行すると数秒で処理が完了します。
完成！

## Youtubeにアップロードする

あとはもう普通の動画と同じです。Youtube studioから完成した動画をアップロードします。
メタデータが正しく付与されていれば、Youtubeのエンコーダが360度動画であると認識し、自動的にそのようなプレイヤーで再生してくれるようになります。
ただなんか1分弱の動画でエンコードに数時間待たされました。サーバーの混雑度次第かもしれませんが公開予定日が決まっている場合は余裕をみたほうが良さそうです。

エンコードが完了したら公開するだけです。お疲れ様でした。

# ■補足
+ 全天球カメラはデフォルトで全方位固定になってます。正面の向きを変えたい場合はRotationCancelerというGameObjectにRotation Constraintが入ってるのでYだけ外せばよいと思います。まだ試してない。
+ 当たり前だけど、各アセットやサービスの規約は守ろうね。VRChatをスタジオとして使う場合、へっちなコンテンツは作ってはいけませんよ。
あ～清楚清楚。