How to Fit Camera to Object

Given an object being viewed and the camera position they have chosen how do I compute the final camera position to "best fit" the object on screen?

If the camera positions are used "as is" on some screen's the objects bleed over the edge of the viewport whilst in others they appear smaller. 

Setup

  • A scene containing several Object3D instances
  • Several predefined camera Vector3 positions
  • A dynamic width/height of the canvas if the screen resizes
  • A user can select an object (from above)
  • A user can select a camera position (from above)


Step-by-step guide

You can set the camera's position, field-of-view, or both.

The following calculation is exact for an object that is a cube, so think in terms of the object's bounding box, aligned to face the camera.

If the camera is centered and viewing the cube head-on, define

dist = distance from the camera to the _closest face_ of the cube

and

height = height of the cube.

If you set the camera field-of-view as follows:

fov = 2 * Math.atan( height / ( 2 * dist ) ) * ( 180 / Math.PI );

Then the cube height will match the visible height.

At this point, you can back the camera up a bit, or increase the field-of-view a bit.

If the field-of-view is fixed, then use the above equation to solve for the distance.

Source