class_docstr: Base class for 3D cameras supporting orthographic and
  perspective projections.
  
  Parameters
  ----------
  fov : float
      Field of view. Default 60.0.
  scale_factor : scalar
      A measure for the scale/range of the scene that the camera
      should show. The exact meaning differs per camera type.
  **kwargs : dict
      Keyword arguments to pass to `BaseCamera`.
code: def _update_transform(self, event=None):
      # Do we have a viewbox
      if self._viewbox is None:
          return
  
      # Calculate viewing range for x and y
      fx = fy = self._scale_factor
  
      # Correct for window size
      w, h = self._viewbox.size
  
      if (w == 0) or (h == 0):
          return
  
      if w / h > 1:
          fx *= w / h
      else:
          fy *= h / w
  
      self._update_projection_transform(fx, fy)
  
      # assemble complete transform mapping to viewbox bounds
      unit = [[-1, 1], [1, -1]]
      vrect = [[0, 0], self._viewbox.size]
      self._viewbox_tr.set_mapping(unit, vrect)
      transforms = [
          n.transform
          for n in self._viewbox.scene.node_path_to_child(self)[1:]
      ]
      camera_tr = self._transform_cache.get(transforms).inverse
      full_tr = self._transform_cache.get(
          [self._viewbox_tr, self._projection, camera_tr]
      )
      self._transform_cache.roll()
      self._set_scene_transform(full_tr)
  
imports: from __future__ import division
  import math
  import numpy
  from .base_camera import BaseCamera
  from ...util import keys, transforms
  from ...visuals.transforms import MatrixTransform
label_desc: Use image node_id 8 for calling the PerspectiveCamera obj's underlying member method code with example usage: obj._update_transform(event) without return types