テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Cinemachineで作るカメラワーク("対象を中心に回り込む"を表現する3つのアプローチ)

Cinemachineでカメラワーク、対象を回り込むように移動させる方法についてです。

 

 

対象を中心に回り込むように

仮面ライダーの初回変身シーン後やアイドルのダンスシーン、トリガー製のアニメ等で、何かを中心にカメラを回すという表現をよく見る気がします。
f:id:tsubaki_t1:20180817191833g:plain

この表現ですが、カットやカメラワーク同士を繋げて動かすCinemachineでは実は少し面倒な所があります。
この表現を行う方法は幾つかあります。

 

2点間のVirtual Cameraを対象を中心に円を描くように動かす

2つのVirtual Cameraを使用して表現するケースです。
最初と最後のカットに欲しい絵がある場合や、回り込む際に絵を崩したくない(極端にズームするような場所をなくしたい)場合には、このアプローチが良さそうです。
またVirtual Cameraのブレンドが出来るので、回り込みながらズームする的なことも簡単に実現出来ます。
その他、主人公をカメラに写したままパン(カメラ飲む気を変える)する等にも使えそうです。

 

手順を見ていきます。
まず最初に2つのVirtual Cameraを配置します。
この2つをTimeline等でブレンドしていきます。このままだと直線的にカメラをブレンドするので、途中で対象に近づきすぎてしまいます。

f:id:tsubaki_t1:20180817193110j:plain

f:id:tsubaki_t1:20180817193158g:plain

Virtual Cameraの設定です。

2つのVirtual CameraのLook Atに中心にする対処を指定します。今回の場合はユニティちゃんを指定しています。次にTransitionsのBlendHitをCylindrical Positionを指定します。

これで、Y軸を回す感じで対象を中心にカメラが移動します。

f:id:tsubaki_t1:20180817193756j:plain

f:id:tsubaki_t1:20180817193400g:plain

このアプローチの問題は、180度以上の角度を回せないという点です。最短距離で回転してしまうので、欲しい角度が180度以上の場合、上手く回ってくれません。
カメラを回すというよりは回り込ませるための機能です。カメラを回したい場合、180度ずつカメラをブレンドする的なアプローチが必要になります。

 

SphericalPositionとCylindricalPositionの違い

SphericalPositionとの違いは、Y軸だけでなくXZ軸も使用して回す点です。例えば上から円を描いて俯瞰するような場合、Cylindrical PositionだとXZ軸のみで距離を判断するので良い感じに作れません。

f:id:tsubaki_t1:20180817194748g:plain

 

対象の周囲を回るオブジェクトを用意して、ソレに載せる

絵を崩さず回り込むのではなく、とにかく対象の周囲を回りたいという場合には、このアプローチが良いです。グルングルンしたい場合。

ある意味単純なアプローチで、対象の周囲を回るオブジェクトを用意し、ソコにVirtual Cameraを載せるというアプローチもあります。
最終的な欲しい絵にするのは面倒なので、クルクル回した後に別のVirtual Cameraに繋げるとかするのが良いかなという印象です。
なお、回り込む速度やブレンド速度が分離する点に注意が必要です。

f:id:tsubaki_t1:20180817203247g:plain

 

まず親子構造を作ります。親を回せば子が対象の周辺を回る感じに作ればOKです。

f:id:tsubaki_t1:20180817201755j:plain

子(Orbit)の位置とVirtual Cameraの位置を同期します。
Followに動かす対象(Orbit)を設定し、BodyにHardLockToTargetを指定します。これでVirtual Cameraオブジェクトの階層構造を作らなくとも、対象を追跡してくれるようになります。

f:id:tsubaki_t1:20180817202107j:plain

後はオブジェクトを動かします。面倒くさいのでTimelineのアニメーションで親オブジェクトを回すアニメーションを作ってしまいます。場合によってはTween系も良いかもしれませんが、Timelineで確認出来ないと最終的な絵が欲しい物かどうか確認するのが面倒です。

f:id:tsubaki_t1:20180817202422j:plain

このアプローチでは最終的なショットに向けて移動する訳では無いので、その辺りの調整に結構時間が取られるかもしれません。

なおCinemachineCollider(当たり判定にめり込まない)と連携したい場合はHardLookToTargetではなくTransposerで相対距離を(0, 0, 0)とかにします。

f:id:tsubaki_t1:20180818105240g:plain

 

対象の周辺を走るカートを使う

次のアイディアは対象を中心としたカートを作る事です。
用意したレールの上を走らせる考えです。所謂ドリーカートです。
完全に円形ではない場合は、このアプローチが良い感じになります。

f:id:tsubaki_t1:20180817195958j:plain

このアプローチは基本的にチュートリアルで紹介されているような作り方です。
Cinemachine > Create Dolly Camera With TrackでVirtual CameraとDollyTrackを作成、パスを作ります。
後はPath Positionをアニメーション等で動かします。自動的に動いてくれるAuto Dolly設定は今回のケースでは使えません。

f:id:tsubaki_t1:20180817204103j:plain

unity3d.com

もし複数のVirtual Cameraをブレンドしたいような場合は、対象の周囲を回るオブジェクトを用意して、ソレに載せるの応用でCreate Dolly Track With CartにVirtual Cameraを接続すると良いです。