def pan_delta(self, dx_px, dy_px):
        """
        This causes the scene to appear to translate right and up
        (i.e., what really happens is the camera is translated left and down).
        This is also called "panning" in some software packages.
        Passing in negative delta values causes the opposite motion.
        """
        direction = self.target - self.position
        distance_from_target = direction.length()
        direction = direction.normalized()

        speed_per_radius = self.get_translation_speed(distance_from_target)
        px_per_unit = self.vport_radius_px / speed_per_radius

        right = direction ^ self.up

        translation = (right * (-dx_px / px_per_unit) +
                       self.up * (-dy_px / px_per_unit))

        self.position = self.position + translation
        self.target = self.target + translation
This causes the scene to appear to translate right and up
        (i.e., what really happens is the camera is translated left and down).
        This is also called "panning" in some software packages.
        Passing in negative delta values causes the opposite motion.