📝

[UE5].e57の点群で色が変になることの対応策

2023/08/30に公開

発生している問題

UE5.2.1時点で、.e57の拡張子の点群を読み込んだ時に、色情報のRとBの値が逆になる問題が発生しています。
(赤いものが青色になり、青いものが赤色に表示される。)

バグチケット:
LiDAR not importing colors correctly for .E57 Point Clouds

対応策

結論から言うと、マテリアルでRとBの値を入れ替えて対応しました。
きちんと対応するならプラグイン自体を修正するべきところですが、今回は手っ取り早くマテリアルとブループリントのみの対応にしました。

マテリアルの改造

点群のマテリアルの設定はこちらで定義されていました。

\Engine\Plugins\Enterprise\LidarPointCloud\Source\LidarPointCloudRuntime\Private\LidarPointCloudComponent.cpp
static ConstructorHelpers::FObjectFinder<UMaterial> M_PointCloud(TEXT("/LidarPointCloud/Materials/M_LidarPointCloud"));
BaseMaterial = M_PointCloud.Object;

static ConstructorHelpers::FObjectFinder<UMaterial> M_PointCloud_Masked(TEXT("/LidarPointCloud/Materials/M_LidarPointCloud_Masked"));
BaseMaterialMasked = M_PointCloud_Masked.Object;

2つマテリアルがあるうちのM_PointCloudが四角い点(Square)で点群を表示しているとき、M_PointCloud_Maskedが丸い点(Circle)で点群を表示しているときのマテリアルと思われます。

この2つのマテリアルをプロジェクト内に複製します。
複製したマテリアルを開き、下記のようにVertexColorから伸びる線をRGBに分解、RとBを入れ替えてFloat3にまとめ、元々繋いであった場所に繋ぎなおしました。

M_PointCloud

M_PointCloud_Masked

改造したマテリアルを適用

LidarPointCloudActor(PointCloudComponent)のCustomMaterial(デフォルトの状態だと何もマテリアルは適用されていない)に上記で改造したマテリアルを適用することで、RとBの値が正しい状態で表示することができます。
PointShapeの設定によって適用するマテリアルが異なります。
Squareの時はM_PointCloud、Circleの時はM_PointCloud_Maskedを改造したものをそれぞれ適用すると、正しい点の形で表示できます。

BPでマテリアルを適用するときは下記のようにすればできました。
PointShapeの設定に応じて、適用するマテリアルを変えています。

注意点として、マテリアル変更以降、LidarPointCloudActorのPointShapeの変更だけでは点の形状が変わってくれないので、上記イベントも併せて呼び出す必要があります。

Discussion