Ue4

UE4カメラシステム分析



Ue4 Camera System Analysis



1。カメラのしくみ

ゲームでは、カメラはプレーヤーの目であり、プレーヤーの視点を制御します(POVつまり、PointOfView(以降POVと呼びます)の位置とプレーヤーの視野のサイズFOVすなわち、FieldOfView、以下FOVと呼ぶ)。一言で言えば、カメラは私たちがゲームの世界を観察することを決定します。

一人称のFPSゲーム、三人称のアクションゲーム、全体として見る必要のあるRTSゲームなど、さまざまな種類のゲームがあります。簡単に言えば、一人称はPOVを目の位置に置き、三人目はPOVを人の後ろの一定の距離に置き、RTSはPOVを地面から高い位置に置くことです。ここでのPOVは、カメラよりも正確です。カメラは、すべての人が理解して観察するための単なるエンティティである場合があるためです。実際、その位置は任意ですが、誰もが理解して使用できるようにするために、通常はカメラの位置と視点の位置を使用します。同期します。下の図のカメラ位置はPOV位置であり、紫色のフレームはFOVです。




図1-1値が90のFOV



図1-2値が40のFOV

POVはゲーム内でいつでも変更されるため、Tickでの彼の位置を更新する必要があります。つまり、本質的には、カメラの調整はPOVの位置を常に更新することであり、ゲームの世界をスムーズに観察することもできます。別の視点を切り替えたい場合は、POVを切り替えてください。カメラの動きの特殊効果を実行したい場合は、補間を使用できます アルゴリズム POVの場所に対処するため。視覚的な特殊効果を実行したい場合は、カメラに後処理効果を直接追加できます。つまり、カメラがゲームの世界をどのように観察するかを決定します。



二。 UE4 カメラ関係コーミング


まず、カメラ関連のクラスの図を置きます。


図2-1カメラ関連のクラス図

それでは、各クラスの関係を1つずつ分析していきましょう。

普段は公式文書に行くので、公式文書順に説明します。

2.1カメラコンポーネント そしてCameraActor

CameraComponentコンポーネントは通常、コントロールロールのルートノードに配置され、POV位置(コンポーネント位置)、FOV、観測モード(オルソモードとパースペクティブモードに分割)、アスペクト比などの通常の動作と属性を設定できます。 、後処理効果など。

CameraActorの役割はより単純です。つまり、CameraComponentコンポーネントをアクターにカプセル化して、レベルに直接配置できるようにします。

図2-2カメラをModに配置できます

CameraComponentには、他に2つのコンポーネントが含まれています。1つはUDrawFrustumComponentで、もう1つはUStaticMeshComponentです。 UStaticMeshComponentは、誰もがよく理解しています。 Actorのオブジェクトモデルをレンダリングするために使用され、UDrawFrustumComponentはカメラウィンドウを表示するために使用されます。 (図1-1の紫色のボックスは、エディターでのみ使用できます)。

2.2PlayerCameraManger

名前から、彼をカメラマネージャーと呼ぶことができますが、彼は何を管理していますか?答えはPOVです。 POV位置の実際の計算プロセスはここで実行されます。さまざまな人物の視点のPOV計算プロセスを処理したり、カメラの振動や衝突に対処したり、カメラにレンズ粒子の特殊効果(スプラッシュ効果など)を追加したりすることもできます。

2.1.1 ViewTarget

名前が示すように、観測対象はカメラが追跡したいオブジェクトです。一般的なサードパーソンゲームの場合、カメラは常に制御するキャラクターに向けられます。このキャラクターはViewTargetと考えることができます(ただし、ViewTargetは単なるアクターではありません)。 ViewTargetはPlayerCameraManagerで定義され、Mangerに理想的なPOVを提供する責任があります。 ViewTarget構造には、Actorオブジェクト、Actorに対応するPOV情報、および現在のPlayerStateが含まれています。つまり、通常、ViewTargetに含まれるアクターの位置によってカメラのPOVの位置を計算し、計算結果をViewTargetのPOVに格納します。

図2-3ViewTargetの内部構造

2.3カメラコンポーネント 、CameraActorおよびPlayerCameraManger

前回の紹介の後、PlayerCameraManagerはViewTargetをバインドすることによってPOVの位置を計算することがわかりました。一般的に、CameraComponentを配置するアクターは理想的なViewTargetです。同様に、CameraComponentを所有するCameraActorもViewTargetです。

PlayerCameraManagerには通常、以下に示すように、いくつかのカメラモード(CameraStyle)があります。


彼のデフォルトモードは別のものです

デフォルトモードでは、PlayerCameraManagerは、POVを更新するときにActorのCalcCameraを呼び出します。 CalcCameraは、最初にCameraComponentがあるかどうか、およびbFindCameraComponentWhenViewTargetがtrueであるかどうかを判断します。trueの場合、CameraComponentの位置と方向を取得します。そうでない場合は、VIewTargetのアクターの座標と方向を取得して、視点のPOV情報を更新します。 。

他のモードでは、プレイヤーはさらに詳細な計算を行う必要があります。

現在のViewTargetがCameraActorの場合、PlayerCameraManagerはCameraComponentの位置と方向を直接取得して、POVを更新します。

2.4 PlayerController PlayerCameraMangerを使用

UE4では、すべてのポーンに対応するコントローラーがあることがわかっています。当然のことながら、コントローラーに回転を制御する機能を持たせたいと考えています(場所はViewtargetに従うため、場所を制御しないのはなぜですか。わかりました)。それで、これが方向を制御するためのUpdateRotation関数です。では、PlayerCameraManagerの視点の計算にどのように影響しますか?

図2-1を振り返ることができます。観察すると、PlayerControllerにPlayerCameraManagerプロパティがあることがわかります。マウスを回転させると、このオフセットはAddControllerYawInputとAddControllerPitchInputを介してRotationInputに渡されます。 PlayerControllerがUpdateRotationを実行すると、PlayerCameraManagerが取得され、ProcessViewRotationを介して移動後の回転が計算され(つまり、RotationInputが計算され)、この回転がControllerRotationとControllerによって制御されるPawn(彼のCameraComponentコンポーネントを含む)に割り当てられます。体)。

図2-4マウス回転プロセスを受信するコントローラー

最後に、上記のプロセスの後、CameraComponentの向きが変更されました。 PlayerCameraManagerは、POVの回転を更新するときに、CameraComponentの方向を取得できます。 (これはデフォルトでUE4のカメラ処理フローです)

CameraComponentコンポーネントがないとしますか?これは実際には非常に簡単です。図2-1では、PlayerCameraManagerクラスにPlayerControllerプロパティがあることがわかります。これにより、PlayerCameraManagerは、現在のViewTargetに対応するPlayerControllerをいつでも取得できます。また、図2-4のプロセスでSerControlRotationを介して現在のカメラの計算された向きを実際に取得したため、PlayerCameraManagerがPOVの向きを更新すると、コントローラーのControlRotationを取得できます。このように、POVの向きを更新するときに、CameraComponentまたはCameraActorを使用せずに、CameraComponentの向きを取得する必要はありません。

注:画像が表示されます2.4最後の2つのステップは、キャラクターの向きを処理することです。この写真の処理後、カメラが回転するとプレーヤーが回転します。ただし、現在、多くの人気のあるゲームでは、プレーヤーの矢印キーを使用して方向を制御しています。

三。まとめとコーミング

以上の紹介により、基本的にカメラ関連のクラス間の関係を理解することができます。ここで再編成しましょう、

カメラを制御したい場合、2つの基本的な解決策があります。

オプション1、UE4の公式チュートリアルでは、ターゲットを制御するボディにCameraComponentを配置します。次に、カメラコンポーネントの位置と方向を取得して、POVを更新します。

オプション2、コントロールターゲットは任意で、ViewtargetにCameraComponentはありません。 PlayercameraManagerは、ViewTargetの位置+特定のオフセットを取得することによってPOVの位置を決定します(PlayerCameraManagerにはTPVCameraOffsetとFreeCamOffsetがあります)。オリエンテーションについては、PlayerCameraManagerはPlayerControllerのControlRotationを取得できます。

ここでのPlayerCameraManagerの計算は、実際にはもっと低レベルであることを知っておく必要があります。ここで計算を変更する必要がない場合もありますが、回転角制限、POV方向のカスタム計算など、一部のカメラ設定を処理することもできます。これは、PlayerControllerのCalcCameraで記述し、UpdateCameraRotationで呼び出すことができます。全体として、私たちが理解する必要があるのは、視点POVの位置と方向がどのように計算されるかです。

最後に、要約すると、カメラのPOV計算には2つの主要なポイントがあります。

1.計算プロセスが更新で実行されていることを確認する必要があります

2. PlayercameraManagerがPOVを計算するときに、更新された位置と回転を取得する必要があります

上記の2つの条件により、POVの位置と向きをスムーズに更新できます。

注:この時点で、2つ見つかりましたCalcCamera、1つ俳優内部は、取得するために使用されます俳優または彼にカメラコンポーネントコンポーネントの位置と向き。もう1つはPlayerController内部、カメラをカスタマイズするために使用POVデフォルトでは、処理計算は呼び出されません。

図3-1カメラ更新視点のPOVプロセス


4つのカメラの使用法の詳細

4.1カメラ位置処理

セクション2.4では、カメラの使用プロセスについて簡単に説明しました。ゲームが初期化されると、PlayerCameraManagerはプレイヤーキャラクターのポーンをViewTargetに設定し、ViewTargetの座標を基本値として取得します。基本値がプレーヤーのCameraOffsetに追加され、視点POVの位置が取得されます。ただし、ここでのCameraOffsetは、ViewTargetのローカル座標系に対するオフセットであり、現在のキャラクターの向きとマルチプライヤーに従ってさらに処理を行う必要があります。

プレーヤーにさまざまな状態でさまざまな視点を調整させたい場合は、複数のCameraOffsetを追加できます(CameraOffsetを撮影する場合)。次に、さまざまな状態でさまざまなCameraOffsetに切り替えます。

4.1カメラのFOV処理

多くのゲームでは、弓や矢などの武器を使用すれば、狙うことができます。照準方法は、カメラのFOVを変更することです。武器にOverrideFOV属性を設定でき、照準時に現在のFOVを更新することで照準効果を実現できます。

5.特別なカメラ処理




5.1 手ぶれ

図5-1カメラ調整関連のクラス図

ここでは、カメラ関連のクラス図を取り出して見ていきます。 UObjectから継承されたUCameraModiferクラスがあることに注意してください。その役割は、カメラを調整することです。ここでは、UCameraModiferから継承するModifyタイプを定義しますが、実際に最も一般的に使用されるのはUCameraModifier_CameraShake(カメラシェイク)です。カメラの調整を実際に行うのはクラスです。

PlayerCameraManagerがPOV情報を更新するとき、または条件に従ってCamraModifierを呼び出すかどうかを判断するとき、このクラスに1つあります。TArray<クラスUCameraModifier*>ModifierList現在のすべての修飾子を保存します。トラバース時にモディファイアが見つかった場合、対応するモディファイアが実行されます。

同時に、UCameraShakeクラスも表示されます。このクラスは、振動時間や振幅などのカメラの振動パラメータを設定するために使用されます。たとえば、UGameplayStatics:::PlayWorldCameraShake内部。私たちは1つを渡す必要がありますTSubclassOf<クラスUCameraShake>>シェイクパラメータ。 PlayerControllerには、クライアントが呼び出すClientPlayCameraShakeメソッドもあります。これもUCameraShakeタイプを渡す必要があります。実際、手ぶれを実行する基本原則は、入力されるUCameraShakeパラメーターに従って手ぶれを追加することです。UCameraModifier_CameraShake

ゲームでは、手ぶれの状況(および実装方法)を呼び出すことがあります。

1.大規模なNPCの近く(クライアントに実行を通知するには、NPCのアニメーション設計図に通知を追加します)

2.撃つ(UCameraShakeを武器にバインドする)

3.プレーヤーが負傷している

4.武器を振ってターゲットを攻撃する場合(UCameraShakeを武器にバインドします)

プロジェクトの要件に応じて、多くの状況があります


5.2 カメラレンズのパーティクルエフェクト

PlayerCameraManagerクラス定義では、カメラの前でパーティクルの特殊効果をバインドすることにより、血の滴りやその他の効果を実現するこのような属性を確認できます。 ClientSpawnCameraLensEffect_Implementationを介して使用できます。効果は以下の通りです

図5-3CameraLensEffectの実装効果

5.3 カメラの衝突

カメラの衝突ロジックは、PlayerCameraManagerのUpdateViewTarget(つまり、視点のPOV情報が更新される場所)に記述でき、最後にボックスタイプの衝突検出を行う必要があります。チャネル条件のあるオブジェクトに一致すると、視点の座標が更新されます。


5.4 カメラモードスイッチ

前述のように、UE4は、開発者が使用できるようにデフォルトでいくつかのカメラモードを提供します。一般的に使用されるものは、無料カメラ、一人称、第三者などです。バイスタンダーモードは無料カメラモードに似ています。

PlayerCameraManagerは、POVを更新するときに現在のカメラスタイルを判断し、さまざまな計算を実行します。たとえば、三人称視点から一人称視点に切り替えると、プレイヤーに対する視点の位置が変わります(後ろから目の近くになります)。

注意すべき点の1つは、カメラごとに衝突検出チャネルが異なる場合があることです。


5.5 カメラの後処理

UE4での後処理は、2つの方法で実行できます(他のブログでは、後処理について簡単に紹介しています。 UE4後処理の簡単な説明 。 )。 1つ目は、PostProcessVolumeをシーンに追加することです。次に、カメラをこのボリュームに配置して、エフェクトを生成します。 2つ目は、カメラコンポーネントを追加して設定することです。これにより、カメラを特別な位置に配置する必要がなくなります。上の図4-3の最初の画像は、ガウスぼかしと混色の後の後処理効果です。

5.6カメラのスムージングと遅延ラグ

ほとんどのゲームでは、より良いゲーム体験を得るために、カメラはスムーズに動きます。カメラはフレームごとに更新されるため、ViewTargetから一定の距離を保っている限り、スムーズな効果を得ることができます。

ただし、現在のカメラから別のカメラ位置にすぐに切り替えたい場合、またはViewTargetがテレポートされている場合、この時点で何もしなければ、カメラは突然切り替わります(このようにしてもかまいません)。 。この切り替えが少し突然であると感じた場合は、簡単に対処する必要があります。現在位置を目標位置に徐々に補間するように補間を設定します。 ((FMath :: VInterpTo(現在位置ターゲットの位置、DeltaTime、速度)。)。

同様に、カメラの遅延効果を作成する場合(つまり、プレーヤーがスキルを使用して突然長距離から移動する場合があります。効果を反映するために、カメラがプレーヤーにゆっくりと追いつくようにします)。同様の方法を使用して達成することもできます。

興味がある場合は、UE4サードパーソン公式ルーチンを参照してから、スプリングコンポーネントを見つけ、EnableCameraLagプロパティを検索して、効果を試すことができます。もちろん、コードに移動して、彼の実装の詳細を確認することもできます。


シックス。その他

1. UE4のDoUpdateCameraは、カメラのviewTargetスイッチングを処理します。現在のカメラが別のカメラに切り替えたい場合は、ここで補間とブレンディングを処理します。この時点では、UpdateViewTargetを呼び出さないでください。切り替えられるオブジェクトはPendingViewTargetであり、blendパラメーターはBlendParamsです。

2. PlayerCameraManagerは、void APlayerController :: SpawnPlayerCameraManager()によって生成されます。

3.CameraManagerの位置と回転を視点と同期させます。このようにして、カメラのマネージャーを介して視点に関する情報を取得することもできます。同様に、PlayerControllerの向きを視点と同期させることで、PlayerControllerの向きを取得して視点の向きを取得することもできます。

4.次のフローチャートは、PlayerCameraMangerによってキャラクターがViewTargetに設定される方法を示しています。

図6-1プレーヤーが制御するポーンをViewTargetとして設定するフローチャート