[UE5][Tips] マテリアルでメッシュの頂点を動かすときはBoundsScaleに気を付けよう
ここでは、マテリアルでメッシュの頂点を動かした場合に気を付けるべきことについて述べます。
前提となる「マテリアルでメッシュの頂点を動かす」については、↓のページで解説しております。
問題:ドロップシャドウが何かおかしい
↓のGIF動画は「Yaw回転するマテリアル」をCubeに適用してみたものです。
そのドロップシャドウを見ると、一部が欠けたような、途切れているような感じになる現象が度々見られました。
ドロップシャドウが欠けてしまっている様子
別のメッシュで見てみると、その現象はより顕著でした。
ドロップシャドウが途中で途切れていたり、更新されず残ったままになっていたりしています。
ドロップシャドウが途中で途切れていたり、更新されず残ったままになっていたりする様子
解消:BoundsScaleを調整する
結論から述べると、これは、StaticMeshComponentの「Rendering」カテゴリにある「Bounds Scale」プロパティを調整すれば直ります。
手順1:Boundsの可視化
まずは現在のBoundsの大きさを確認します。
↓のように、ViewPortの左上にある「Show」ボタンを押して、開いたコンテキストメニューの「Advanced」内にある「Bounds」のチェックをオンにします。
すると、↓のように、選択したオブジェクトに、バウンディングボリューム(赤いボックスと黄色いスフィア)が表示されます。
オブジェクトに回転に対し、バウンディングボックスは追従していないので、オブジェクトがバウンディングボックスからはみ出してしまっています。これがドロップシャドウがおかしくなってしまう原因です。
手順2:BoundsScaleを拡大してバウンディングボックスでオブジェクトを覆う
次に、「BoundsScale」を調整します。
対象のオブジェクトのStaticMeshComponentにそのプロパティがあります。(「Rendering」カテゴリの「Advanced」内にあります。)
(SkeletalMeshComponentにも同様のプロパティがあります。)
この値は前述のバウンディングボリュームの倍率になっており、値を大きくするとバウンディングボックスも大きくなります。この値を変更してバウンディングボックスが対象のオブジェクトを不足なく覆うように調整します。
これで、ドロップシャドウの不具合が解消されます。
ドロップシャドウの不具合が解消された様子
BoundsScaleの意味
ところで、この「BoundsScale」はどういったものなのでしょうか?
「BoundsScale」プロパティは、UStaticMeshComponentの親(の親)クラスである、UPrimitiveComponentクラスにその宣言がありました。
/**
* Scales the bounds of the object.
* This is useful when using World Position Offset to animate the vertices of the object outside of its bounds.
* Warning: Increasing the bounds of an object will reduce performance and shadow quality!
* Currently only used by StaticMeshComponent and SkeletalMeshComponent.
*/
UPROPERTY(EditAnywhere, AdvancedDisplay, Category=Rendering, meta=(UIMin = "1", UIMax = "10.0"))
float BoundsScale;
コメント曰く、
オブジェクトの境界をスケーリングします。
これは World Position Offset を使ってオブジェクトの頂点をその境界の外にアニメーションさせるときに便利です。
警告:オブジェクトの境界を拡大すると、パフォーマンスとシャドウの品質が低下します!
現在、StaticMeshComponent と SkeletalMeshComponent でのみ使用されています。
このことより、マテリアルでオブジェクトを動かすようなときに調整する、という使途は間違っていないようです。
もう少し言うと、前述のバウンディングボリュームはレンダリングやコリジョンの計算を効率化するために用いられます。大きすぎると効率が下がって計算に無駄が生じたり精度が下がったりしますが、小さすぎても今回のようにドロップシャドウの描画に不具合が生じたりします。ですので、ここはパフォーマンスを気にしつつ、見た目や挙動的にも許容できる範囲を見極めて設定してあげる必要があります。
アセット側のBounds設定
今回の解消法は、レベルに置かれたStaticMeshComponent(またはSkeletalMeshComponent)側のプロパティを調整する、というものでした。
では、元々のバウンディングボリュームの設定はどこにあるのかというと、それは各StaticMeshアセットやSkeletalMeshアセットの方にあります。
StaticMeshアセットの場合は、「Show」ボタンで開くコンテキストメニューの中に「Bounds」チェックボックスがあり、オンにするとバウンディングボリュームが表示されます。また、詳細ビューの方に「Positive Bounds Extension」と「Negative Bounds Extension」というプロパティがあり、これでバウンディングボリュームのサイズを調整できます。
SkeletalMeshアセットの場合は、「Character」ボタンで開くコンテキストメニューの中の「Mesh」内に「Bounds」チェックボックスがあります。同様に、アセット詳細ビューの方に「Positive Bounds Extension」と「Negative Bounds Extension」プロパティがあります。
以上のようにして元々のサイズを調整することができますが、前述したようにバウンディングボリュームはパフォーマンスに影響を及ぼす部分ですので、ここでの調整は(するかしないかも含めて)慎重に検討する必要があります。
関連ページ
historiaさんの↓のページに、影が残ってしまう現象についての有益な情報が載っていますので、こちらもぜひご覧ください。
Discussion