ネイティブのファーストパーソン レンダリングでは、一人称視点カメラのパースペクティブを使用したエクスペリエンスを作成する際によく必要とされる機能をサポートしています。たとえば、シーン全体をレンダリングする視野角とは異なる視野角で特定のオブジェクトのみをレンダリングする機能などです。 キャラクターの手や腕、武器などのレンダリングで、壁に近づいたときにクリッピングする (めり込む) ことがないようにするには、ファースト パーソン レンダリングがうってつけです。
ファースト パーソン レンダリングには次の機能があります。
ファースト パーソン プリミティブをカスタムの視野角 (FOV) でレンダリングします。
ファースト パーソン プリミティブにスケーリング係数を適用して、プリミティブをカメラに向かって効果的に縮小することで、ファースト パーソン ジオメトリがシーンと交差する (多くの場合クリッピングと呼ばれる) 事態を回避できます。 これにより、ファースト パーソン プリミティブが常にシーンの上部にレンダリングされるようになります。
ファースト パーソン ジオメトリがシーンのシャドウを受け取り、自身にシャドウをキャストし、プレイヤーがシーンにキャストされている自分のシャドウを確認できる、完全なシャドウイング ソリューションを備えています。
ハードウェア レイ トレーシング (HWRT) と統合されており、プレイヤーはシーンに自分の姿が反映されているのを確認したり、レイ トレースによるシャドウをキャストしたりできます。
マテリアルとの統合:
ファースト パーソン エフェクトを頂点ごとに制御します。 このオプションの出力により、ワールド空間とファースト パーソン空間とみなされるものとの間の補間が可能になります。 キャラクターの足が地面に接しているなど、ジオメトリの一部をワールド空間に配置してワールドとつなぐ必要がある場合に便利です。
マテリアル グラフを使用して、ファースト パーソン レンダリング パラメータをクエリし、任意の位置をワールド空間からファースト パーソン空間に変換します。
これは、ほとんどのプリミティブ タイプで機能します。 これには、スタティックメッシュ、スキン メッシュ、Niagara パーティクル エフェクトが含まれます。
ファースト パーソン レンダリングの実装
ファーストパーソン ゲームの開発では、通常、プレイヤー カメラがカスタムの視野角を持ち、ワールドと交差しない方法でファースト パーソン ジオメトリをレンダリングする必要があります。 Unreal Engine でのファースト パーソン レンダリングの実装は、カスタム視野角の望ましいエフェクトを達成し、クリッピング防止動作が行われるようにファーストパーソン ジオメトリをモーフィングすることだと考えることができます。 このモーフィングは、ワールド位置オフセットが適用された後、頂点がクリップ空間に投影される前に実行されます。
その結果、技術的に言えばジオメトリはワールド空間に存在しますが、ほとんどの部分が異なる投影マトリックスでレンダリングされているように見えます。 ここで注意してほしいのは、ジオメトリが非常に小さく、わずかに歪んでいることです。 これはカメラの視点からよく見えるようにするために行われるのですが、このようなジオメトリは他の視点には適していません。そのため、このようなジオメトリからシーンにシャドウをキャストしたり、このようなジオメトリをハードウェア レイ トレーシングの反射で見えるようにしたりするべきではなく、そのような挙動は仕様により起こらないようになっています。
この方法でファースト パーソン レンダリングを実装するメリットは、ファースト パーソン プリミティブを他のプリミティブと同じパスでレンダリングできるため、メモリやパフォーマンスに影響を及ぼす追加のレンダリング パスの必要性や、その複雑さを回避できることです。
ファースト パーソン プリミティブの設定
コンポーネントには、[First Person Primitive Type (ファースト パーソン プリミティブ タイプ)] が [First Person (ファースト パーソン)] または [World Space Representation (ワールド空間表現)] に設定されている場合に一人称視点カメラでどのようにレンダリングされるかを決定する設定が含まれています。
この設定には次の選択項目が含まれています。
None (なし):このプリミティブはファーストパーソン レンダリングとやり取りしません。
First Person (ファースト パーソン):このプリミティブはファースト パーソンとしてレンダリングされ、カメラの [First Person Field of View (一人称視点視野角)] と [First Person Scale (一人称視点スケール)] のファースト パーソン プロパティの影響を受けます。これらのプロパティは、シーンのクリップを避けられるように、異なる視野角および小さい深度範囲でコンポーネントをレンダリングするために使用します。 プリミティブはシーンにシャドウをキャストせず、レイトレーシング ワールドにも表示されません。
World Space Representation (ワールド空間表現):このプリミティブはワールド空間でのファースト パーソン プリミティブを表します。 これは、他のプレイヤーが見るプリミティブであり、特に、地面へのシャドウのキャストや、ハードウェア レイ トレーシングの反射に使用されます。 これは所有している一人称視点カメラには表示されません。 これにより、バックグラウンドで暗黙的に [Cast Hidden Shadow (非表示キャスト シャドウ)] が false に、[Owner No See (オーナーには見えない)] が true に設定されます。この設定は、ファースト パーソン シャドウが仮想シャドウ マップと正しく連携するために必要です。
ファースト パーソン シャドウ
ファースト パーソン レンダリングを使用するプレイヤー キャラクターをセットアップする際には、シャドウイングに関する考慮事項が 2 つあります。
ファースト パーソンに設定したプリミティブでシャドウをキャストできるように、ライトでシャドウのキャストを有効にします。
シーンのシャドウと反射用のファースト パーソン プリミティブのワールド空間表現であるコンポーネントを設定します。
ファースト パーソン セルフシャドウ
ファースト パーソン セルフシャドウイングは、一人称視点でレンダリングされるプリミティブに特化したシャドウイング ソリューションです。 これを使用すると、ファースト パーソン プリミティブのシャドウは自身にキャストされるようになります。たとえば、武器のシャドウは自身とプレイヤーの腕にキャストされますが、シーンにはキャストされません。 これにより、ファースト パーソンのカメラ視点にモーフィングして歪んだジオメトリがシーンのシャドウに表示されないようになります。
現在、ファースト パーソン セルフシャドウイングはスクリーン空間トレーシングを使用して実装されています。 この方法は負荷が低いものの、画面上のシャドウ キャスターのみに限定されます。 通常、関連するシャドウ キャスターはすべて画面上にあるため、ほとんどのファースト パーソン セットアップではこれが問題になることはありません。 単一レイヤー深度バッファ (レイがジオメトリの背後に到達できる) など、スクリーン空間のレンダリングの他の一般的な制限事項はファースト パーソン レンダリングにも適用されることを覚えておいてください。
以下は、ファースト パーソン セルフシャドウが有効になっているディレクショナル ライトの例です。
ファーストパーソン セルフシャドウは現在 (5.6 の時点では)、コンソール変数で制御します。 これは、多数のライトを含むマップでのエフェクトの制御を容易にするためです。 このエフェクトでパフォーマンスの負荷が発生するのは、ライトがファースト パーソン ジオメトリとオーバーラップしている場合のみであるため、オーバーラップするライトがほとんどないか、まったくないと考えて、ローカル ライトすべてでこの機能を有効にしても問題ありません。 ただし、この機能の制御方法は、将来的に変更される可能性があります。ファースト パーソン セルフ シャドウを設定するには、次の手順に従います。
r.FirstPerson.SelfShadowを1に設定します。 これにより、次のコンソール変数で決まるシャドウをキャストするライトの機能 (動的シャドウをキャスト) が有効になります。r.FirstPerson.SelfShadow.LightTypesを設定します。設定値は次のとおりです。0:ファースト パーソン セルフシャドウをディレクショナル ライトでのみ有効にします。1:ローカル ライトのみで有効にします。2:すべてのライト (ローカルとディレクショナル) で有効にします。
ファースト パーソン セルフシャドウを有効にすると、パフォーマンスに多少の影響があります。 多くのライトがオーバーラップしている状況でこの設定を有効にすると、パフォーマンスにマイナスの影響を及ぼす可能性があります。 これを有効にする光源に注意してください。 この機能の制限事項の詳細については、以下の 「制限事項」 セクションを参照してください。
ファースト パーソン ワールド空間表現シャドウ
プロパティ [First Person Primitive Type] を [First Person] に設定したファースト パーソン プレイヤー キャラクターがある場合、そのコンポーネントからシーンにシャドウがキャストされることはありません。 シャドウをキャストするためには、ワールドおよび他のプレイヤーから見えるメッシュが必要であり、そのプリミティブ タイプを [World Space Representation] に設定する必要があります。 設定すると、そのメッシュはシーンにシャドウをキャストし、ハードウェア レイ トレースされた反射でこのプリミティブを表示します。
一人称視点カメラをセットアップする
ファースト パーソン レンダリングのカメラをセットアップする際の複雑さは、構築しているゲームやエクスペリエンスの種類によって異なります。 以下の基本的なセットアップに従って、一人称プレイヤー キャラクターを開始できます。 高度なセットアップでは、ワールドに表示されたり、マルチプレイヤー ゲームで他のプレイヤーに表示されたりするキャラクターのパーツを設定するためのガイダンスを提供します。
たとえば、基本的なセットアップでは、一人称視点で見えるコンポーネントのみを備えたキャラクターをセットアップします。 武器を持つための腕のみを備えたスケルタルメッシュがその例です。 高度なセットアップでは、上記に加えて、一人称視点で見える脚と完全なキャラクター メッシュを追加します。完全なキャラクター メッシュは、シャドウのキャストや反射でワールドに表示されます。
一人称視点カメラの基本的なセットアップ
一人称視点カメラのセットアップを作成するプロセスは非常に簡単です。プリミティブはファースト パーソンとしてタグ付けし、カメラは、シーンのレンダリングとは別に、これらのアセットにカスタムの視野角とスケーリングを適用するように設定します。
これを行う手順は次の 2 つのカテゴリに分けることができます。
コンポーネントとその初期設定をセットアップする。
プリミティブとファースト パーソン ゲームの見た目に合うようにコンポーネントのプロパティを構成する。
カメラと一人称視点コンポーネントをセットアップする
次の手順に従って、カメラと一人称視点コンポーネントをセットアップします。
新しいカメラ アクタを作成します。
[Details (詳細)] パネルで [Add (追加)] をクリックし、必要なプリミティブ コンポーネント (スタティックメッシュ、スケルタルメッシュ、パーティクル システムなど) を選択してこのアクタに追加します。
この作業は必須ではありませんが、カメラがファースト パーソン プリミティブのオーナーであることを保証できるので、実行することをお勧めします。これは高度なセットアップでは重要なプロパティです。[Owner No See] と [Only Owner See (オーナーだけに見える)] のフラグが必須だからです。
プリミティブ コンポーネントを選択した状態で [Details] パネルを使用して、[Rendering (レンダリング)] > [Advanced (高度)] プロパティの下にあるプロパティ [First Person Primitive Type] を探します。 ドロップダウン選択項目を使用して [First Person] に設定します。
[Details] パネルで [Camera Component (カメラ コンポーネント)] をクリックし、[Camera Options (カメラ オプション)] プロパティにある [Enable First Person Field Of View (一人称視点視野角を有効にする)] と [Enable First Person Scale (一人称視点のスケールを有効にする)] の横にあるボックスをオンにします。
[Camera Component] を選択している状態では、エディタ ビューポートの右下にあるカメラ プレビュー ウィンドウで結果を観察できます。
[First Person Field of View] と [First Person Scale] を設定する
カメラ コンポーネントのプロパティで[Enable First Person Field of View] と [Enable First Person Scale] を有効にするときに、[Camera Settings (カメラ セッティング)] カテゴリの下にある似たような名前の設定を使用して調整ができます。
これらの設定がカメラで機能するのは、カメラが付いているプリミティブで [First Person Primitive Type] が [First Person] に設定されている場合です。 プリミティブで上記の設定がされていない場合は、プリミティブがワールド空間でカメラに映ります。 変化を調べるには、ビューポートのカメラ プレビュー ウィンドウを使用します。 エディタ ビューポートでは依然、ファースト パーソン プリミティブが変更されていないものとして表示されます。 これは、ビューポートに使用されている暗黙的なカメラにファースト パーソン プロパティが設定されていないためです。
この一人称視点カメラでレンダリングされるプリミティブの水平方向の視野角 (度単位) を変更するには、[First Person Field of View] の値を調整します。 視野角スライダーを調整するときに、カメラ プレビュー ウィンドウでプリミティブの視野角が変化するのを観察できます。
この一人称視点カメラで「ファースト パーソン」プリミティブがシーンと交差しないように十分小さくなるようプリミティブをカメラに向かってスケールダウンするには、[First Person Scale] の値を調整します。 カメラの視点からは、プリミティブが小さくなっているにもかかわらず、まったく同じように見えるはずです。 スケール値を小さくしすぎると、プリミティブが表示されなくなります。 これは、近距離クリッピング平面と交差するほど小さくスケーリングされるためです。
カメラとプリミティブが適切なセットアップになるようスケール値を調整する際は、シーンとのクリッピングが発生しない程度には小さく、近距離クリッピング平面によって消えない程度には大きいスケール値を見つける必要があります。 実際は、ファースト パーソン ジオメトリをプレイヤー境界に含めるのに必要なだけ縮小すれば十分なことがよくあります。
コンテンツとセットアップによっては、エディタの近距離クリッピング平面のデフォルト値の調整が必要な可能性があります。 この調整はプロジェクト設定で [Engine (エンジン)] > [General (一般)] 設定に移動して [Near Clip Plane (平面近傍のクリップ)] で行いますが、この操作ではプロジェクト全体でグローバルな調整が行われます。
一人称視点カメラとコンポーネントの高度なセットアップは、上記で説明した基本的なセットアップを使用してこのビューをセットアップする方法と似ています。 以下の高度なセットアップを使用する際は、キャラクターがマルチプレイヤー ゲームのワールド内でどのように表現されるかや、ハードウェア レイ トレーシング機能を使用してゲーム シーンでどのように表現されるかを考慮する必要があります。 これにより、周囲のワールドで (または他のプレイヤーからの) プレイヤーの見え方の一貫性が確保されます。 これは、プレイヤーの目にシャドウや反射の中の自分のキャラクターがどのように見えるかにも影響します。
高度なファースト パーソン ワークフローを使用する場合は、次の点を考慮してください。
ワールドにシャドウをキャストするためのワールド空間表現プリミティブを追加する。
キャラクターの足がファースト パーソンであり、その足がプレイヤーから地面にキャストされているシャドウにつながっている。
ハードウェア レイ トレーシングによる反射でプレイヤーが自身を見るときのプレイヤーの反射。
これらの機能すべてで、ワールド内のファースト パーソン プリミティブに適した表現が必要となります。 この表現は、マルチプレイヤー ゲームで他のプレイヤーがこのプレイヤーを見たときに目にするものです。 あるいは、これをプレイヤー キャラクターの三人称視点バージョンと考えることができます。 Unreal Engine では、これをファースト パーソン ワールド空間表現と呼びます。 これはシーンにシャドウをキャストするために使用され、レイトレーシング シーンでプレイヤーが表現される方法です。
ファースト パーソン ジオメトリ
ファースト パーソン ジオメトリには、下半身と脚のメッシュが含まれている必要があります。 このメッシュは、完全にワールド空間に配置することも、マテリアルで補間勾配を使用して、足は完全にワールド空間に配置し、残りの体をファースト パーソン空間に配置することもできます (以下の 「マテリアルとの統合」セクションを参照してください)。
このセットアップだけで、一人称視点でプレイヤーが下を向くと自分の脚が見えるようになるため、リアリティが高まります。
ファースト パーソン コンポーネントとそのワールド空間表現をセットアップする
「一人称視点カメラの基本的なセットアップ」 では、一人称視点カメラのみで表示するコンポーネントは、そのコンポーネントの [First Person Primitive Type] を [First Person] に設定しました。 ワールド空間内でハードウェア レイトレースによる反射を行いたいジオメトリや、マルチプレイヤー ゲームで他のプレイヤーに見せたいジオメトリでは、プリミティブ タイプを [World Space Representation] に設定します。これにより、ワールドにシャドウをキャストしたり、レイトレーシングされた反射にプレイヤー表現を含めたりできます。
以下のシーンでは、コンポーネントを [World Space Representation] に設定する際にまず気付くことが 2 つあります。
カメラ プレビュー ウィンドウの一人称視点カメラにコンポーネントが表示されていない。
コンポーネントがワールドにシャドウをキャストしている。
この [World Space Representation] オプションはバックグラウンドで [Owner No See] 機能を使用してジオメトリがカメラに表示されないようにしています。ただし、それにはプリミティブをカメラ アクタの子コンポーネントにして、プリミティブがカメラに所有された状態である必要があります。
ファースト パーソン メッシュ プリミティブとワールド表現メッシュ プリミティブを使用してキャラクターをセットアップしたら、ファースト パーソン メッシュの足がそのワールド表現と一致します。 以下に掲載しているこのセットアップ例は、一方はファースト パーソン プリミティブのみを見ており、もう一方はファースト パーソンとワールド表現プリミティブを組み合わせてシーンにシャドウをキャストし、キャラクターの足でシャドウを「接続」しています。
[First Person] に設定されているファースト パーソン メッシュ プリミティブのみが表示されている。 このメッシュはシーンにシャドウをキャストしません。 | [First Person] に設定されているファースト パーソン メッシュ プリミティブとワールド表現の両方が一緒に表示されている。 ワールド表現メッシュは一人称視点カメラでは見えないが、ワールドにシャドウをキャストしている。 シャドウはファースト パーソン プリミティブ メッシュと揃っている。 |
ワールドに対して、またはマルチプレイヤー セットアップにおける他のプレイヤーに対しては、キャラクターのメッシュとコンポーネントを [World Space Representation] に設定する必要があります。
以下のデモでは、「ワールド」カメラで鏡のようなサーフェスに反射した一人称キャラクターを見ています。 一人称視点カメラの表示と共に、[None]、[First Person]、[World Space Representation] それぞれに設定を変更した場合のワールド表現メッシュの表示され方や、シーンにキャストされるシャドウと一人称視点カメラでのレンダリングに各設定が与える影響も確認できます。
マテリアルと統合する
マテリアル グラフには、ファースト パーソン レンダリング構成をサポートする次のノードがあります。
First Person Output ノード
First Person Output ノードは、アルファ値でワールド空間とファースト パーソン空間の間を補間します。値は、頂点ごとの頻度で 0 から 1 を使用します。 これは、ファースト パーソン ジオメトリをシーンの他の部分につなげる必要がある場合に非常に役立ちます。 その一例として、一人称キャラクターのジオメトリの足メッシュを地面に接続させることが挙げられます。 ファースト パーソン プリミティブとして設定される脚の長さに沿って、0.0 (ワールド空間) から 1.0 (ファースト パーソン空間) までのグラデーションを適用することで、これを実現できます。
別の方法として、Set Material Attributes を使用すると、First Person Output ノードをマテリアルに追加することなく同じプロパティを設定することができます。 この方法は、マテリアル関数から値を設定する必要がある場合に便利です。マテリアル関数ではカスタム出力ノードの使用が許可されていないからです。
Transform Position ノード
Transform Position ノードは、任意の位置をファースト パーソン空間に変換できます。 これは、特定のポイントがファースト パーソンとしてレンダリングされる場合に、それが画面上のどこに配置されるかを計算するうえで役立ちます。
このノードを選択した状態で [Details] パネルで以下を設定します。
Source (ソース):Camera Relative World Space (カメラの相対的ワールド空間)
変形される位置のソース形状です。
Destination (目的地):First Person Space (Camera Relative World Space) (ファーストパーソン空間 (カメラの相対的ワールド空間))
入力式に適用する変形タイプです。
(任意) First Person Interpolation Alpha (ファーストパーソン補間アルファ):0 ~ 1
平行移動されたワールド空間とファースト パーソン空間を補間します。0 はワールド空間で 1 はファースト パーソン空間を表します。 このノードは、ポスト プロセス マテリアルを含むあらゆるマテリアルで使用して、任意の位置をファースト パーソンに変換できます。そのため、First Person Output ノードの値はわかりません。 この値はユーザーがゲームに合わせて指定しますが、ほとんどの場合、デフォルト値のままにすることが合理的です。
このノードを使用すべきタイミングの例として、スコープ付き武器のポスト プロセス マテリアルなどで、ファースト パーソンでのレティクルの位置を計算する場合があります。 この場合、考慮する必要のあるすべての位置 (銃とスコープのポイント) は完全に一人称視点であると想定できます。
Is First Person ノード
Is First Person ノードを使用すると、[First Person Primitive Type] を [First Person] に設定して現在のプリミティブがレンダリングされているかどうかに応じて、マテリアルに異なるエフェクトを適用できます。
以下のマテリアル グラフは、IsFirstPerson ノードを使用してジオメトリの色を設定するシンプルなセットアップです。ジオメトリはワールド空間 (赤色) とファースト パーソン空間 (緑色) に分けてレンダリングされます。
以下のシーンは、Is First Person ノードを設定したこのマテリアルを使用して、ワールド空間表現と一人称視点でライフルの色を操作している様子を示しています。 ファースト パーソン ライフル プリミティブ (緑) がプレイヤー カメラ (右下) に表示され、カメラのファースト パーソン パラメータを使ってレンダリングされています。 ワールド空間表現ライフル (赤) はプレイヤー カメラには表示されていませんが、地面にシャドウをキャストするために使用されています。また、レイトレーシング ワールドではハードウェアのレイ トレーシングによる反射とシャドウを確認できます。
View Property ノード
View Property ノードを使用すると、現在のビューの一人称視点視野角と一人称視点スケールをクエリできます。
First Person Field of View は、水平と垂直の一人称視点視野角をラジアン単位で返します。
First Person Scale は、シーンで交差が発生しないようにファースト パーソン プリミティブに適用されているスケーリング係数を返します。
このノードを選択した状態で [Details] パネルで [View Property (表示プロパティ)] ドロップダウン リストをクエリしたい表示に設定します。
Scene Texture ノード
Scene Texture ノードは、GBuffer をサンプリングして、特定のピクセルが不透明なマテリアルを使用するファーストパーソン プリミティブによって描画されたかどうかを伝えることができます。
このノードを選択した状態で、[Details] パネルで [Scene Texture Id (シーン テクスチャ ID)] ドロップダウン リスト使用してシーン テクスチャを [IsFirstPerson] に設定します。
詳細は、以下の 「制限事項」 セクションを参照してください。
制限事項と注記
カスタムの一人称視点視野角 (FOV)、クリッピング防止スケーリング、頂点ごとの補間コントロール、およびほとんどのマテリアル グラフの統合機能は、すべてのプラットフォーム、すべての構成で機能します。
ファースト パーソン GBuffer ビット
一部の高度なファースト パーソン レンダリング機能では、ファースト パーソン ピクセルが GBuffer のビットでマークされている必要があります。
そこから導かれる結論はまず、これらの機能はモバイル レンダラやフォワード レンダリングでは機能しないことです。
また、プロジェクト設定で [Allow Static Lighting (静的ライティングを許可)] を無効にする必要があることもそうです。 プロジェクトの静的ライティングを無効にすることで、一部の GBuffer ビットがファースト パーソン レンダリングで使用できるように解放されます。
将来的に変わる可能性はありますが、5.6 の時点では必要なトレードオフです。 代わりの方法として、上級ユーザーは、Unreal Engine の使用バージョンにローカルな変更を加え、プロジェクトに必要のない GBuffer の別の機能を犠牲にすることもできます。
影響を受ける機能は次のとおりです。
ファースト パーソン セルフシャドウ
シーンにシャドウをキャストするためのワールド空間表現プリミティブの使用。
シーンに反射されたワールド空間表現プリミティブの表示。
特定のピクセルがファースト パーソンかどうかを判断するための Scene Texture ノードの使用。
これらの機能すべてで、ファースト パーソン GBuffer ビットが利用できない場合に適切なフォールバックが行われます。その場合、シャドウと反射は単に存在せず、Scene Texture ノードは常に 0.0 (False) を返します。
一般機能サポート
仮想シャドウ マップ (またはレイ トレーシングによるシャドウ) を使用しないと、地面にファースト パーソン シャドウは現れません。
グルームとストランドベースのヘアは、現在サポートされていません。
その他のリソース
First Person (ファースト パーソン) テンプレート
ファースト パーソン テンプレートは、ネイティブのファースト パーソン レンダリングを使用するように設定されています。 ファースト パーソン テンプレートを作成する際にファースト パーソン シューター バリアントを調査すると、この機能の動作を確認できます。
このテンプレートについての詳細は、「ファースト パーソン テンプレート」を参照してください。