Cinemachine使って遊んでみる
概要
AssetStore見てたらついにリリースされていた、Unity用のカメラを制御するっぽいAsset
Cinemachine
https://www.assetstore.unity3d.com/jp/#!/content/60946
有償(5月中はearlybird的なセールで$79)。
さてどうやって使うんだこれ。っていうことで使いながらドキュメント読んでみた。すげえぞこれ。
略式紹介
カメラのコントロールをするAsset。
スクリーンのどのへんに被写体が写ってほしいかから逆算してカメラをコントロールすることができる。
すげえ。センスいい。
ドキュメント
オンラインにあるのが全てっぽい。
base-rigについて
http://www.cinemachineimagery.com/base-rig/
サクッと把握したかったので、特に Base-rigについて のみを以下に訳している。以下。[]の中のは自分のコメント。
流し読み + 使いながら訳してるんで、なんかミス見つけたら教えて。
Base Rig:
Cinemachineの基礎で、いろんなモジュール含んでる。
Cinemachineは統合されたカメラ制御のシステムなんだが、既存のカメラとも併用できる。
すでに大量のカメラがあるようなゲームでも、Cinemachineをカットシーン用のカメラとして問題なく導入できる。
ただ、Cinemachineを使ってゲーム全体のカメラを構成すると、プレイ->カットシーン->プレイに戻る、とかがシームレスに作れる。
Base Rigに含まれてるコンポーネント:
• CinemachineVirtualCamera
カメラ。次のような機構を含んでいる。
• Priority
優先度、一番高いカメラが使用される。Important指定をしたカメラはその限りではない?
• Noise
パーリンノイズによる手ぶれ。シェイクとか振動とかもある。
• Composer
動的に被写体追跡する機構。
• Transposer
特定の物体にカメラをマウントするための機構。
• AUTOGEN_CinemachineRuntime
動作時に生成される、Cinemachineのエンジン。次のような機構を含んでいる。
• Blend Settings
複数のカメラをブレンドする機構。たとえばCameraAとCameraBを4秒間で移り変わり、1秒でCameraAに戻る、みたいなのを作る時、便利。
特に複数のカメラ間でブレンド方法が指定されてない場合、デフォルトのブレンド方法を適応する。
• Debug
現在アクティブなカメラや、ブレンド中のカメラの情報をみるのに便利。PreferencesからOnにできる。
• Preferences
Unity > Preferences > Cinemachine で開ける。デバッグモードをOnにしたり、Composerのコンポーネントに色付けしたりターゲットアイコンのサイズをセットできる。
CinemachineVirtualCameraについて:
CinemachineVirtualCameraにはモジュールをセットすることができる。(UnityのComponentとして。)
Noise、Composer、Transposer モジュールによって、手ぶれを追加したり、カメラのコンポーズを動的に行ったり、対象を追跡するようなことができる。
これらはめっちゃ強力で、相互に連携可能。最高のカメラコントロールのために頑張ってある。
Unityでは、activeなカメラが同時に一つしか存在できないんで、効果的なカメラブレンディングには無理があった。
Cinemachineはまさにそれを克服するために作られてる。
具体的に言うと、無限にvirtualなカメラをセットでき、それらをブレンドし、Unity内でのたった一つのカメラとして振る舞うことができる。全て自動的にね。
CinemachineVirtualCamera オブジェクトと、そこに含まれるCinemachineVirtualCameraコンポーネントについて:
(Unity上でのvirtualCameraの作り出し方は、Cinemachineインストール済みの状態でHierarchy上で右クリック > Cinemachine > Virtual Camera)
CinemachineVirtualCameraコンポーネント パラメータの詳細:
Auto Add To Priority Stack
チェック入れると、自動的にオンになり、ブレンドにも使用される。(カットも自動的にされる。) チェックがない場合は、コードから動的に動かす必要がある。
Priority
Targets:
GameObjectをTransposer target枠に放り込むと、このカメラはその対象にマウントされた感じで動くようになる。(詳しくはTransposerの項をみよう)
Offsets
それぞれのオフセット。
Field Of View Offset
基本的にここでは放置しとくといいパラメータ。Composerモジュール内でセットすると良い。Composerモジュールを使わない場合はここでセットする。
Dutch Offset
カメラの傾き、チルト。
Noise Amplitude Scalar
Noise Speed Scalar
Settings
[Cinemachineでは、モジュールごとに自由に名前をつけて設定ファイルを出力しているみたいだ。設定はそこに保存される。
virtualCameraごとに、その設定を使うことができる。あと、Play中にもパラメータを保存できるっていうのがあって、すごくイイ。]
Show Camera Guides
[Composer モジュールがセットされてるときだけ表示される。]カメラのブレンド用のガイドが表示される。詳しくはComposerモジュールの解説をみよう。
Noise Module
Noise モジュールは多層的なパーリンノイズを使った手ぶれ生成機構で、揺れはComposer モジュールの処理が終わった後に加算される。
カメラのポジションと回転の制御をする。好きなだけパラメータ追加できるっぽいぞ。
[確かに好きなだけ追加できた。オェエ]
手ぶれ生成をリアルにやるのしんどいんだけど、うまくやるとなんか映像に説得力みたいなものが出る。
[この項の続きはそのうちちゃんと訳す。]
Composer Module
このモジュールの凄さみたいなのの例が一杯ある。このモジュールは、オブジェクトを動的に追跡する。
キャラクターのボーンを追跡したり、複数のカメラをブレンドしたりできる。
被写体がどんな動きをしてようと、対象をcompositional settingsに基づいてカメラに捉えることができる。
正確に追跡したり、カメラの追尾に減衰率(ようはディレイ)をもたせたりとかできる。
Composerモジュールは、被写体がどんなところにあろうと、現実世界で実際に撮影したかのように(イイ感じに追っかけて)3D空間を2Dスクリーンに落とし込む。
縦の追跡ディレイ、横の追跡ディレイとか、個別に、好きにコントロールできるぞ。
内側の四角形(soft regions)に被写体が入っているうちは、Composerモジュールによって微細な動きは無視される。
被写体が内側の四角形を出た場合、跳ね返るように被写体を追跡する。
さておき、[ここからDeserts of Kharakの苦労話なので中略 Homeworld: Deserts of Kharak]
Composer モジュールは次のようにはたらく。
まず、撮影する対象(GameObject)を、CinemachineVirtualCameraのインスペクタ上の Composer Camera Target にセットする。
UnityのGameObjectならなんでもイイ。複数のキャラクターからできてる集団の中心とかでもいい。
カメラが追跡する対象になる。
次に、そのオブジェクトがスクリーンのどのへんに写っていてほしいかを設定する。
[インスペクター上から「カメラが被写体をスクリーン上のどのへんに写すか」パラメータをセットし、Gameビューでそのプレビューができる。]
赤い'Hard'フィールドは、被写体がこのゾーンに絶対に入らないという意味で設定できる。フレームの淵とかに被写体が出ないようにセットするのがよくあるパターン。
青い'Soft'フィールドは、被写体がそこに入り込んだ場合はゆっくりと被写体を中心へと追いやるようにできている。
[中略、細かい挙動の話]
被写体が中心の透明な'the dead zone'フィールドに来ている場合、カメラは被写体の細かい動きを無視する。
アニメーションによるキャラクターの中心位置の移動とか、移動物理エンジンの微細な振動を無視したりとかするのに使うといいと思う。
被写体をスクリーン上の指定した位置へと押し出す力[原文だとHorizontal/Vertical Soft Dampening]は、長年の経験でこういうデザインになってるよ!
[ここからちょっと訳し中。カメラのブレンド=被写体をスクリーンのどこに置くかみたいなのの設定をいっぱい作ってそれらの遷移とかの話がここから先。]
Transposer Module
Transposer モジュールは、カメラ自体の位置を動的に変化させる。カメラの位置のみに関連している。
カメラの回転に関してはComposerモジュールで行い、移動に関してはTransposer モジュールに担当させるととてもいい感じになる。
[中略、画像があってComposer Camera Targetには被写体、Transposer Camera Targetにはカメラの乗り物としてのオブジェクトを定義するといいぞみたいな話]
Transposerでは、Transposer Camera Targetにセットしたオブジェクトからのローカル座標でのオフセットを軸ごとに指定することができる。
また、各軸に対してDampening[ここでのDampeningはTransposerにセットしたオブジェクトをどれだけ熱心に即座に追うか、というパラメータ]をセットできる。
Transposer モジュールにはとてもパワフルな複数のモードがある。
Local Space on Target Assignment:
Transposer Camera Targetにセットされたオブジェクトに合わせてカメラの位置を動かす。
Local Space Locked Up Vector:
Composerでz-rollをセットするとかしない限り、カメラの上方向を固定する。
[オフセットを設定してたりすると、オブジェクトの横回転に際してオフセットもオブジェクトを中心に回転したりする。
結果としてカメラが回ったみたいに感じるが、実際回っているのはカメラをセットしたオブジェクト、っていう。ややこしい。]
Local Space Locked To Target:
Transpose Camera Targetにセットされたオブジェクトのforwardの向き、位置にカメラをセットする。
[より具体的に言うと、オブジェクトが回転すればカメラも回転する。Transposer使ってて意図しない挙動してる場合、このへんが原因なことが多い気がする。]
World Space:
Transpose Camera Targetにセットされたオブジェクトの位置(というか実際にはそこからオフセット分移動した位置)にカメラをセットする。
まとめ
可能性は無限っすわ。[なんかカメラを車Aに乗っけて云々するだけで車Bがめっちゃ綺麗に撮影できるんですよみたいな例]
さ~やってみよう~みたいな話。
訳はここまで。
所感
Transposerだけを使って、自撮りカメラみたいなのをセットしてみたんだけど、次のような設定が瞬殺でできた。
・被写体オブジェクトから一定の位置に、そのオブジェクトを撮影するカメラをセットする
・カメラは固定ではなく、被写体の移動に伴い、若干遅れて被写体を追ったりする
・x-z平面上のオブジェクトの移動に伴うカメラ追従は比較的素早く、y軸上のカメラ追従速度はめっちゃゆっくり、、とかが個別にできた。楽かよ、、
・手ぶれ機能みたいなのを使ってほんのすこーしゆらゆらさせてみたところ、絵のクオリティが上がったので震えていた。ドキュメントにもそのへん熱烈に書いてあった。
カメラの動きに関しての具体的な例は、http://www.cinemachineimagery.com/examples/ にいっぱい載ってる。
スクリーン上でのConstraintのかけ方がうまい。絵面で思いついても実装まで考えると頭痛くなりそうなもんなんだが。この人たちは実現してる。えらい。
もう俺がMain Cameraを制御するコードを自分で書くことはないと思う。