class_docstr: The fly camera provides a way to explore 3D data using an
  interaction style that resembles a flight simulator.
  
  For this camera, the ``scale_factor`` indicates the speed of the
  camera in units per second, and the ``center`` indicates the
  position of the camera.
  
  Parameters
  ----------
  fov : float
      Field of view. Default 60.0.
  rotation : float | None
      Rotation to use.
  **kwargs : dict
      Keyword arguments to pass to `BaseCamera`.
  
  Notes
  -----
  Interacting with this camera might need a bit of practice.
  The reaction to key presses can be customized by modifying the
  keymap property.
  
  Moving:
  
    * arrow keys, or WASD to move forward, backward, left and right
    * F and C keys move up and down
    * Space bar to brake
  
  Viewing:
  
    * Use the mouse while holding down LMB to control the pitch and yaw.
    * Alternatively, the pitch and yaw can be changed using the keys
      IKJL
    * The camera auto-rotates to make the bottom point down, manual
      rolling can be performed using Q and E.
docstr: A dictionary that maps keys to thruster directions
  
  The keys in this dictionary are vispy key descriptions (from
  vispy.keys) or characters that represent keys. These are matched
  to the "key" attribute of key-press and key-release events.
  
  The values are tuples, in which the first element specifies the
  magnitude of the acceleration, using negative values for
  "backward" thrust. A value of zero means to brake. The remaining
  elements specify the dimension to which the acceleration should
  be applied. These are 1, 2, 3 for forward/backward, left/right,
  up/down, and 4, 5, 6 for pitch, yaw, roll.
docstr_tok: ["A","dictionary","that","maps","keys","to","thruster","directions","The","keys","in","this","dictionary","are","vispy","key","descriptions","(","from","vispy.keys",")","or","characters","that","represent","keys",".","These","are","matched","to","the","``","key","''","attribute","of","key-press","and","key-release","events",".","The","values","are","tuples",",","in","which","the","first","element","specifies","the","magnitude","of","the","acceleration",",","using","negative","values","for","''","backward","''","thrust",".","A","value","of","zero","means","to","brake",".","The","remaining","elements","specify","the","dimension","to","which","the","acceleration","should","be","applied",".","These","are","1",",","2",",","3","for","forward\/backward",",","left\/right",",","up\/down",",","and","4",",","5",",","6","for","pitch",",","yaw",",","roll","."]
code: def keymap(self):
      """A dictionary that maps keys to thruster directions
  
      The keys in this dictionary are vispy key descriptions (from
      vispy.keys) or characters that represent keys. These are matched
      to the "key" attribute of key-press and key-release events.
  
      The values are tuples, in which the first element specifies the
      magnitude of the acceleration, using negative values for
      "backward" thrust. A value of zero means to brake. The remaining
      elements specify the dimension to which the acceleration should
      be applied. These are 1, 2, 3 for forward/backward, left/right,
      up/down, and 4, 5, 6 for pitch, yaw, roll.
      """
      return self._keymap
  
imports: from __future__ import division
  import math
  import numpy
  from ...app import Timer
  from ...util.quaternion import Quaternion
  from ...util import keys
  from .perspective import PerspectiveCamera
label_desc: Use image node_id 10 for calling the FlyCamera obj's underlying member method code with example usage: obj.keymap() and returns: self