Scaling Factor Based on Camera?

Hi all,

This sort of relates to my previous post, but most of those issues have been resolved. I am working on a script that will scale my prim to fit the viewport of a camera generated with a custom focus distance, focal length, and horizontal/vertical apertures. These are the 4 factors I was able to determine affect the perceived size of an object through the viewport, however I am not sure the relationship between these that would allow me to properly scale the object so that it fits properly in the viewport regardless of how I change these features.

Hopefully someone could either refer me to some documentation that explains something similar, or can outright help me.

Thanks!

Hi @Dinonel, I’m afraid we don’t have much documentation on the cameras math, it seems. The best I can do is point you at the implementation of GfCamera, which is where most of the magic happens…

Thanks @spiff ! I ended up figuring it out by brute force, so I’m going to leave the code here if anyone else is interested in doing something similar.

# Get the scene and make it transformable
    scene = UsdGeom.Xform(stage.GetPrimAtPath(scene_path))

    # Get the size of the scene
    bbox = scene.ComputeWorldBound(0, UsdGeom.Tokens.default_)
    bbox_size = bbox.ComputeAlignedBox().GetSize()

    # Translate and scale the scene to be centered in the camera
    horiz = camera.GetHorizontalApertureAttr().Get()
    vert = camera.GetVerticalApertureAttr().Get()
    scale_factor = min(horiz/bbox_size[0], vert/bbox_size[2])

    mid_z = bbox.ComputeAlignedBox().GetMidpoint()[2]

    scene.AddTranslateOp().Set(
        Gf.Vec3f(0, 0, -mid_z*scale_factor))
    scene.AddScaleOp().Set(Gf.Vec3f(scale_factor, scale_factor, scale_factor))

The script assumes that the object will be centered at the origin and that the camera will be placed some distance away along a single axis

1 Like