How does the ThumbnailGenerator service set the camera's position/angle relative to a model's size?

Hi! I’m trying to replicate Roblox’s ThumbnailGenerator service in a game I’m working on, particularly to show a preview of the player’s avatar on the title screen similarly to RetroStudio or AWM.

I’ve been doing some tests using the March 2007 build provided by MaximumADHD, and so far this is what I’ve discovered:

  • The camera angle is always either (-23.927, 26.341, 0) or (-23.927, -153.659, 0), both angles are pretty much the same but rotated 180 degrees from each other on the Y axis.
  • The “Focus” CFrame is positioned directly at the center of the objects being captured, with the orientation being (0, 0, 0)

However, I can’t seem to figure out how the camera’s position works. I’ve tried a couple different things such as getting the magnitude of the object’s size or using rays to find the distance between the camera and the nearest surface, but nothing I tried seemed to give the same results as the ThumbnailGenerator’s output camera position.

Here’s some notes from a couple experiments I did using differently-sized parts:

Input Part 1:
Size: 4, 1.2, 2
Position: 0, 0, 0

Output Camera 1:
CFrame Position: -1.801, 1.801, -3.637
CFrame Orientation: -23.927, -153.659, 0
Focus Position: 0, 0, 0
Position Magnitude: 4.44015


Input Part 2:
Size: 4, 3.6, 4
Position: 0, 2, 0

Output Camera 2:
CFrame Position: -2.727, 4.727, -5.508
CFrame Orientation: -23.927, -153.659, 0
Focus Position: 0, 2, 0
Position Magnitude: 7.75365
Position Magnitude (With Y adjusted to 0): 6.72392

I rarely post here to ask for help since I either end up finding some sort of guide on the web or figure it out by myself, but I can’t seem to find anything this time around.

3 Likes

Did you ever figure this out? I’ve been trying to replicate it aswell.

OKAY I’ve figured it out! And I’ve created these renders using viewport frames!

Screenshot 2025-04-03 171431

So how does ThumbnailGenerator:Click work?
Based on the object’s CFrame.LookVector, the orientation is set to either (-23.927, 26.341, 0) or (-23.927, -153.659, 0)
workspace:ZoomToExtents() is then called with the object selected.
This is the same as selecting an object in studio and pressing “F”
This cannot be used however, since you won’t be able to select the object in-game.

Here is the same exact function in Luau:

Annnd that’s pretty much it!

2 Likes

Finally solved after an entire year & a month lol.