def play(self, do_loop=False, real_time=True): time = 0.0 # seconds timer = QElapsedTimer() timer.restart() dtime = 1.0 / self.frames_per_second key_frame_number = 0 frame_number = 0 for kf in self._key_frames: self.current_key_frame_index = key_frame_number key_frame_time = 0.0 while key_frame_time < kf.time_to_next_frame: # Drop frames if we are going too slow # if real_time and (timer.elapsed() - 200) > time*1000.0: # continue tf = key_frame_time / kf.time_to_next_frame interpolation_parameter = tf + key_frame_number camera_state = camera.State() focus_x = self.spline.interpolate_sequence( self._focusx, interpolation_parameter, do_loop) focus_y = self.spline.interpolate_sequence( self._focusy, interpolation_parameter, do_loop) focus_z = self.spline.interpolate_sequence( self._focusz, interpolation_parameter, do_loop) camera_state.focus= Vec3([focus_x, focus_y, focus_z]) camera_state.zFocus_vheight = self.spline.interpolate_sequence( self._zfv, interpolation_parameter, do_loop) quat = self.spline.interpolate_quaternion_sequence( self._quat, interpolation_parameter, do_loop) camera_state.rotation = quat.to_rotation() if real_time: while timer.elapsed() < time*1000.0: # TODO - use threading instead QCoreApplication.processEvents() frame = KeyFrame(camera_state) frame.frame_number = frame_number + 1 frame.key_frame_number = key_frame_number + 1 yield frame key_frame_time += dtime time += dtime frame_number += 1 if (not do_loop) and (key_frame_number == len(self._key_frames) - 1): return # Don't go past final frame key_frame_number += 1