UE5.7 Cesium tile render for custom camera sensor for robotics

Hello. I am a robotics researcher working on drone simulation. I created a custom camera sensor using a USceneComponent and attached it to my Pawn Blueprint.

The problem is that my custom camera, which is facing downward to capture the terrain, cannot capture the Cesium tiles when the player camera is not looking downward. However, if the player camera is also looking downward, the custom camera works correctly.

I have attached an image below for reference.

Here is the view of my Pawn showing the camera placement. The camera on the far left is the player camera used to control the drone. The two cameras on the right are camera sensors: one is facing forward, and the other is facing downward toward the terrain.

Hi @Jarunyawat, welcome to the community!

Cesium for Unreal drives tile selection based on camera views registered with the CesiumCameraManager. By default only the active player camera (and standalone ASceneCapture2D actors) are picked up automatically. Your custom downward-facing camera is likely not registered, so tiles are only loaded for the region the player camera is looking at. When both cameras happen to point the same direction, it looks like it works, but the player camera is doing the work.

The fix is to register your sensor camera with the CesiumCameraManager so the tile selection algorithm also loads tiles for that view frustum.

The current API uses the AdditionalCameras array on ACesiumCameraManager. Since you’re working in C++, something like this:

// Get the camera manager (e.g. in BeginPlay)
ACesiumCameraManager* CameraManager =
    ACesiumCameraManager::GetDefaultCameraManager(this);

// Add an entry for your sensor camera
FCesiumCamera SensorCamera;
SensorCamera.ParameterSource = ECameraParameterSource::Manual;
SensorCamera.ViewportSize = FVector2D(1920, 1080); // match your render target
SensorCamera.FieldOfViewDegrees = 90.0f; // match your sensor FOV
SensorCamera.Location = DownwardCamera->GetComponentLocation();
SensorCamera.Rotation = DownwardCamera->GetComponentRotation();
CameraManager->AdditionalCameras.Add(SensorCamera);

// Each Tick, update the transform:
if (CameraManager->AdditionalCameras.IsValidIndex(SensorCameraIndex))
{
    CameraManager->AdditionalCameras[SensorCameraIndex].Location =
        DownwardCamera->GetComponentLocation();
    CameraManager->AdditionalCameras[SensorCameraIndex].Rotation =
        DownwardCamera->GetComponentRotation();
}

You’d do this for each sensor camera that needs its own tile coverage (your forward camera and your downward camera).

You should also be able to achieve registering your additional cameras with the Camera Manager through Blueprints.

Let me know if you have trouble getting it working!