この記事では、UE 4.26 ActionRPG サンプル プロジェクトを使用して、境界について学び、要約します。
1. 境界は何ですか?何に使用されますか?
最終的に画面上にエフェクトを表示するゲーム エンジンは、3 次元の世界空間から画面のピクセル空間への多くの変換と計算を経て初めてプレイヤーに見えるようになります。このプロセスでは、カメラの位置、FOV、位置が決まります。 、オブジェクトの透明度、深度値などの情報は、最終画面上のオブジェクトの位置とサイズに影響を与える可能性があり、各オブジェクトのすべての点を計算する必要がある場合、計算量が膨大になるため、各オブジェクトは性的排除を使用すると、完全に目に見えないオブジェクトをプロセスの非常に早い段階で破棄できるため、多くの計算が削減されます。境界は可視性カリング
に使用されます。境界がカメラの錐台内にないオブジェクトは直接描画されません。 UE の境界はすべて AABB (Axis-Aligned Bounding Box) であり、これは軸に平行な境界ボックスであり、そのタイプは です。リアルタイムで計算する場合でも、固定で計算する場合でも、回転によって変化するため、常にワールドの XYZ 軸と平行になります。FBoxSphereBounds
上の図でわかるように、青い長方形のワイヤー フレームは、実際に計算に使用される AABB 境界です。黄色の球形のワイヤー フレームは、オブジェクトが削除されたかどうかを示すために使用されます。黄色のワイヤー フレームが見えない場合、オブジェクトは削除されました。したがって、青いワイヤー フレームが見えなくなる位置までカメラが回転すると、黄色のワイヤー フレームが消え、オブジェクトのメッシュが描画されなくなることがわかります。Bounds に関して最も重要なのは、上の GIF です (武器は主人公とは別の 2 つのアクタであるため、武器は消えません。また、異なる Bounds 計算を使用して削除されます)。
2. Bounds の一部の設定とコード
2.1 境界表示コマンド
-
プレビューモードで
-
Playを実行し
た後 、コマンド ライン ウィンドウに と入力して、Show Bounds
すべての境界を表示します。
アクタにメッシュがない場合、空のアクタには境界がありません。メッシュを持つデフォルトのキャラクタ (メッシュは空です) にも境界はありません。
アクタが実行されていない場合、アクタを選択すると青と黄色のボックスが表示されますが、実際に実行しているときは表示されません。これは、プレビューにデフォルトで Sphere が表示されているためです。境界。
剣などの MeshComponent に SkeletalMesh を追加すると、Bounds がそこに表示されます:
Bounds と実際に表示される部分が必ずしも一致しているわけではないこともここでわかります。ほとんどの場合、Bounds は表示されている部分を完全にカバーできます。は問題ありません (Bounds が大きすぎると、シーン内でカメラをどのように回転させてもオブジェクトを削除できず、無駄な計算量が増加します)。しかし、Bounds が小さいと、削除できると思われるものが表示されます。見たところ、カメラが少し回転した後に突然視界を失う状況は、(3.Bounds に関するいくつかの問題) に記録されています。
2.2 境界設定
主に SkeletalMeshComponent の設定と Component の設定を記録します (これらのパラメータは実行時に調整可能です! 効果を簡単に確認できます!! ):
1. Bounds Scale
- Bounds 倍率
- カテゴリー:
UPrimitiveComponent
- 目的:
CapsuleComponent で設定できますが、実際には効果がありません。SkeletalMeshComponent に設定されている場合にのみ効果があります。文字通り、境界の拡大を意味します。次の図は、4 に設定した場合の効果を示しています。
2. Use Attach Parent Bounds
- 親ノードの境界を使用する
- カテゴリー:
USceneComponent
- 目的:
チェックすると、このコンポーネントの境界はそれ自体では計算されませんが、その親によって直接使用されます。コメントからわかるように、このオプションを選択すると、以下の多くのコンポーネントの効率が大幅に向上します。一人の親。
最も一般的なのは、主人公の頭、上半身、腕、下半身、脚が別個の SkeletalMeshComponents であり、すべてが一般的なコンポーネントの下にぶら下がっていることです。チェックされている場合とチェックされていない場合の比較は次のとおりです (左の図は、すべてのメッシュが右図の5つのサブメッシュとメインメッシュはすべてParentを選択して使用することを選択していますが、計算量が大幅に削減されていることがわかります。が空の場合、すべての境界のサイズが正しくありません):
3.Include Component Location Into Bounds
つまり、
ではUSkeletalMeshComponent::CalcBounds
、チェックされているかどうかが判断され、チェックされている場合は、ComponentLocation に基づいて Bounds が再計算されます。
FBoxSphereBounds NewBounds = CalcMeshBound(RootBoneOffset, bHasValidBodies, LocalToWorld);
if (bIncludeComponentLocationIntoBounds)
{
const FVector ComponentLocation = GetComponentLocation();
NewBounds = NewBounds + FBoxSphereBounds(ComponentLocation, FVector(1.0f), 1.0f);
}
Include Component Location Into Bounds
すべての境界をオフにして、最初の境界だけを残します。以下の左と右の図は、それぞれチェックを外した場合とチェックを入れた場合 の効果を示しています。
4.Use Bounds from Master Pose omponent
コード内USkinnedMeshComponent::CalcMeshBound(...)
:
// Use MasterPoseComponent's PhysicsAsset if told to
else if (MasterPoseComponentInst && bCanUsePhysicsAsset && bUseBoundsFromMasterPoseComponent)
{
NewBounds = MasterPoseComponentInst->Bounds;
}
まだ使用していないので、効果の実証はありません。
5.Skip Bounds Update When Interpolating
使用される場合、補間は更新されません。
void USkeletalMeshComponent::FinalizeAnimationUpdate()
{
// ...
// update bounds
if(bSkipBoundsUpdateWhenInterpolating)
{
if(AnimEvaluationContext.bDoEvaluation)
{
// Cached local bounds are now out of date
InvalidateCachedBounds();
UpdateBounds();
}
}
else
{
// Cached local bounds are now out of date
InvalidateCachedBounds();
UpdateBounds();
}
}
6. Component Use Fixed Skel Bounds
- 固定境界を使用する
上の図の左右の 2 つの BP ディスプレイスメントの違いは、左側ではメッシュがオンになっており、右側ではメッシュがチェックされていないことですComponent Use Fixed Skel Bounds
。次の 2 つの違いがあることがわかります。
- 名前が示すように、固定境界を使用すると、メッシュ ポーズの変更に従って境界が更新されなくなり、多くの計算が削減されます。
- 固定が使用されているため、メッシュをラップするために、デフォルト値は自動的に計算される値よりも大きくなります (デフォルトのメッシュの境界が使用されます)。
実際、キャラクターのメッシュ インターフェイスでは、元の境界はキャラクターよりも 1 つ大きい円 (上の GIF の左側にあるものなど) で、適切にフィットしません (アセットの境界設定で調整できます)。詳細は左側にあります。正は XYZ 拡張の正の方向を意味します。単位は cm、UE の通常の長さの単位は cm)、これを有効にするには固定境界を使用する必要があります(ただし、これをより小さい値に変更した場合は注意してください)サイズが異なる場合、メッシュは境界によってラップされない場合があります)。
知らせ:
- [固定] が使用され、境界がメッシュを完全にラップしていない場合 (たとえば、メッシュ アニメーションが再生される場合)、記事の冒頭のような、カメラを特定の角度に向けた直後にメッシュが消える状況が発生します。
7. Consider All Bodies for Bounds
- すべての領域を考慮する
2.4 境界関連のコードと計算方法
すべての境界は AABB 軸に平行な境界ボックスであるため、最初の図に示すように、コードの計算部分は次のようになります。
削除に使用される実際のコードの詳細は次のとおりです。USkinnedMeshComponent::CalcMeshBound
スタックはブレークポイントを通じて確認できます。
- 平行軸 軸
は常に平行である必要があるため、メッシュは移動していないように見えるかもしれませんが、デフォルトの配置アクタのボールなど、境界が変更されています (これは、ローカル座標系の軸に平行な境界が変更されているためです)ワールド座標系の軸平行境界に移動するために使用されます):
より明確に表示するには、ボックスを使用します。
3. 境界に関連するいくつかの問題
境界はオブジェクトが表示されるかどうかに直接影響するため、境界の設定に問題がある場合、オブジェクトが表示されるべきときに表示されなくなる可能性があります。
3.1 境界が長すぎる問題
Bounds が小さすぎる場合は、距離が遠すぎる可能性があります。Bounds 全体は画面上の点にすぎません。このとき、オブジェクト全体は見えません (このような状況はまれであり、問題はありません)。は見えません)。
もう 1 つ注意すべき点は、境界 XYZ の値の特殊効果が小さい場合 (たとえば、Z が非常に小さい場合、境界は非常に平坦になる)、レンズの正の方向が境界の XY 平面と正確に平行である場合です。 、計算による精度誤差が発生し (Bounds の直方体は画面上の単なる線です)、オブジェクト全体が見えなくなります。P_Skill_03
以下の図に示すように ( ActionRPG の特殊効果は、使用時にわずかに変更されました):
この問題の理由の 1 つは、MeshRotation が更新されるときに ParticleSystem 特殊効果の境界が更新されないことです (エンジンのバグなのか設計のバグなのかはわかりません)。そのため、使用されているメッシュがフレーク形状である場合、 (上の図に示すように)、デフォルトの境界は非常に平坦です。上の図に示す効果までメッシュを回転すると、境界はメッシュをまったく覆うことができません。
解決策は、ActionRPG のような固定境界を使用することです。
- ヒント: 特殊効果の範囲は、特定の送信機ではなく、特殊効果全体の設定です。送信機の設定詳細から特殊効果全体の設定に戻りたい場合は、オフにする必要はありません右端の黒い空白部分をクリックしてください~ ~~
3.2 大きすぎる境界の問題
Bounds では、上記のカメラを少し動かすとすぐに見えなくなるというバグは発生しませんが、パーティクル エフェクトなどの計算量が増加します。放出されるパーティクルはランダムであり、Bounds の計算は自動で行われます。速度などの情報に基づいていますが、この計算では、結果として得られる境界が非常に大きくなる可能性があり (下の図に示すように、パーティクルは実際にはそれほど遠くまで飛ぶことができません)、境界は常に変化しており、多くの計算が必要になります。適切なサイズの固定境界を使用して解決することもできます。
3.3 メッシュが境界で包まれていない場合の状況
[固定境界] をチェックした後、メッシュがアニメーションを再生するときにメッシュが境界から外れる可能性が非常に高くなります。記事冒頭のGIFのように、カメラが回転しメッシュが突然消えます。
この問題は、頭、上肢、下肢が別々のメッシュ コンポーネントである場合にもよく発生します。キャラクターにはアニメーションとレンズ アニメーションがあります。レンズでは、キャラクターの頭が欠けている、上半身が欠けている、または下半身が欠けています。手足がありません。待って、これが問題です。