def align_on_equatorial(self, duration=None): if duration is None: duration = settings.fast_move ecliptic_normal = self.ship._frame_rotation.conjugate().xform(J2000EquatorialReferenceFrame.orientation.xform(LVector3d.up())) angle = acos(ecliptic_normal.dot(LVector3d.right())) direction = ecliptic_normal.cross(LVector3d.right()).dot(LVector3d.forward()) if direction < 0: angle = 2 * pi - angle rot=LQuaterniond() rot.setFromAxisAngleRad(pi / 2 - angle, LVector3d.forward()) self.ship.step_turn(rot, absolute=False)
def create_drag_params(self, target): center = target.get_rel_position_to(self.observer.camera_global_pos) self.dragCenter = self.observer.camera_frame.get_rel_position(center) dragPosition = self.observer.get_frame_camera_pos() self.dragDir = self.dragCenter - dragPosition self.dragOrientation = self.observer.get_frame_camera_rot() self.dragZAxis = self.dragOrientation.xform(LVector3d.up()) self.dragXAxis = self.dragOrientation.xform(LVector3d.right())
def OnSelectClick(self): if self.base.mouseWatcherNode.hasMouse(): self.mouseSelectClick = True mpos = self.base.mouseWatcherNode.getMouse() self.startX = mpos.getX() self.startY = mpos.getY() self.dragCenter = self.observer.get_camera_pos() self.dragOrientation = self.observer.get_camera_rot() self.dragZAxis = self.dragOrientation.xform(LVector3d.up()) self.dragXAxis = self.dragOrientation.xform(LVector3d.right())
def update(self, dt): if self.keyMap['up']: self.step(self.speed * self.speed_factor * dt) if self.keyMap['down']: self.step(-self.speed * self.speed_factor * dt) if self.keyMap['left']: self.turn(LVector3d.up(), self.rot_step_per_sec * dt) if self.keyMap['right']: self.turn(LVector3d.up(), -self.rot_step_per_sec * dt) if self.keyMap['shift-up']: self.turn(LVector3d.right(), self.rot_step_per_sec * dt) if self.keyMap['shift-down']: self.turn(LVector3d.right(), -self.rot_step_per_sec * dt) if self.keyMap['shift-left']: self.turn(LVector3d.up(), self.rot_step_per_sec * dt) if self.keyMap['shift-right']: self.turn(LVector3d.up(), -self.rot_step_per_sec * dt) if self.keyMap['control-left']: self.turn(LVector3d.forward(), self.rot_step_per_sec * dt) if self.keyMap['control-right']: self.turn(LVector3d.forward(), -self.rot_step_per_sec * dt) if self.keyMap['home']: self.change_altitude(self.distance_speed * dt) if self.keyMap['end']: self.change_altitude(-self.distance_speed * dt) if self.wheel_event_time + self.wheel_event_duration > globalClock.getRealTime( ): distance = self.wheel_direction self.change_altitude(distance * self.distance_speed * dt)
def update(self, dt): if self.keyMap['up']: self.step(self.speed * self.speed_factor * dt) if self.keyMap['down']: self.step(-self.speed * self.speed_factor * dt) if self.keyMap['left']: self.turn(LVector3d.up(), self.rot_step_per_sec * dt) if self.keyMap['right']: self.turn(LVector3d.up(), -self.rot_step_per_sec * dt) if self.keyMap['shift-up']: self.turn(LVector3d.right(), self.rot_step_per_sec * dt) if self.keyMap['shift-down']: self.turn(LVector3d.right(), -self.rot_step_per_sec * dt) if self.keyMap['shift-left']: self.turn(LVector3d.up(), self.rot_step_per_sec * dt) if self.keyMap['shift-right']: self.turn(LVector3d.up(), -self.rot_step_per_sec * dt) if self.keyMap['control-left']: self.turn(LVector3d.forward(), self.rot_step_per_sec * dt) if self.keyMap['control-right']: self.turn(LVector3d.forward(), -self.rot_step_per_sec * dt) if self.keyMap['home']: self.onChangeAltitude(0.1) if self.keyMap['end']: self.onChangeAltitude(-0.1)
def update(self, dt): rot_x = 0.0 rot_y = 0.0 rot_z = 0.0 distance = 0.0 if self.mouseTrackClick and self.base.mouseWatcherNode.hasMouse(): mpos = self.base.mouseWatcherNode.getMouse() deltaX = mpos.getX() - self.startX deltaY = mpos.getY() - self.startY z_angle = -deltaX * self.dragAngleX x_angle = deltaY * self.dragAngleY self.do_drag(z_angle, x_angle, True) if self.mouseSelectClick and self.base.mouseWatcherNode.hasMouse(): mpos = self.base.mouseWatcherNode.getMouse() deltaX = mpos.getX() - self.startX deltaY = mpos.getY() - self.startY z_angle = deltaX * self.observer.realCamLens.getHfov( ) / 180 * pi / 2 x_angle = -deltaY * self.observer.realCamLens.getVfov( ) / 180 * pi / 2 self.do_drag(z_angle, x_angle) if settings.celestia_nav: if self.keyMap['up']: rot_x = -1 if self.keyMap['down']: rot_x = 1 else: if self.keyMap['up']: rot_x = 1 if self.keyMap['down']: rot_x = -1 if self.keyMap['left']: rot_y = 1 if self.keyMap['right']: rot_y = -1 if self.keyMap['control-left']: rot_z = 1 if self.keyMap['control-right']: rot_z = -1 if self.keyMap['home']: distance = 1 if self.keyMap['end']: distance = -1 if self.wheel_event_time + self.wheel_event_duration > globalClock.getRealTime( ): distance = self.wheel_direction if not self.keyboardTrack and (self.keyMap['shift-left'] or self.keyMap['shift-right'] or self.keyMap['shift-up'] or self.keyMap['shift-down']): target = self.select_target() if target is not None: self.keyboardTrack = True arc_length = pi * target.get_apparent_radius() apparent_size = arc_length / (target.distance_to_obs - target.height_under) if apparent_size != 0: self.drag_coef = min(pi, pi / 2 / apparent_size) else: self.drag_coef = pi self.drag_x = 0.0 self.drag_z = 0.0 self.create_drag_params(target) if self.keyboardTrack: if not (self.keyMap['shift-left'] or self.keyMap['shift-right'] or self.keyMap['shift-up'] or self.keyMap['shift-down']): self.keyboardTrack = False if self.keyMap['shift-left']: self.drag_z += self.drag_coef * dt self.do_drag(self.drag_z, self.drag_x, True) if self.keyMap['shift-right']: self.drag_z -= self.drag_coef * dt self.do_drag(self.drag_z, self.drag_x, True) if self.keyMap['shift-up']: self.drag_x += self.drag_coef * dt self.do_drag(self.drag_z, self.drag_x, True) if self.keyMap['shift-down']: self.drag_x -= self.drag_coef * dt self.do_drag(self.drag_z, self.drag_x, True) if self.keyMap['a']: if self.speed == 0: self.speed = 0.1 else: self.speed *= exp(dt * 3) if self.keyMap['z']: if self.speed < 1e-5: self.speed = 0 else: self.speed /= exp(dt * 3) y = self.speed * dt self.stepRelative(0, y, 0) if settings.damped_nav: #TODO: Refactor this wall of code... if rot_x > 0: self.current_rot_x_speed += self.incr_speed_rot_step_per_sec * dt self.current_rot_x_speed = min(self.current_rot_x_speed, self.rot_step_per_sec) elif rot_x < 0: self.current_rot_x_speed -= self.incr_speed_rot_step_per_sec * dt self.current_rot_x_speed = max(self.current_rot_x_speed, -self.rot_step_per_sec) elif self.current_rot_x_speed > 0.0: self.current_rot_x_speed -= self.decr_speed_rot_step_per_sec * dt self.current_rot_x_speed = max(0.0, self.current_rot_x_speed) elif self.current_rot_x_speed < 0.0: self.current_rot_x_speed += self.decr_speed_rot_step_per_sec * dt self.current_rot_x_speed = min(0.0, self.current_rot_x_speed) if rot_y > 0: self.current_rot_y_speed += self.incr_speed_rot_step_per_sec * dt self.current_rot_y_speed = min(self.current_rot_y_speed, self.rot_step_per_sec) elif rot_y < 0: self.current_rot_y_speed -= self.incr_speed_rot_step_per_sec * dt self.current_rot_y_speed = max(self.current_rot_y_speed, -self.rot_step_per_sec) elif self.current_rot_y_speed > 0.0: self.current_rot_y_speed -= self.decr_speed_rot_step_per_sec * dt self.current_rot_y_speed = max(0.0, self.current_rot_y_speed) elif self.current_rot_y_speed < 0.0: self.current_rot_y_speed += self.decr_speed_rot_step_per_sec * dt self.current_rot_y_speed = min(0.0, self.current_rot_y_speed) if rot_z > 0: self.current_rot_z_speed += self.incr_speed_rot_step_per_sec * dt self.current_rot_z_speed = min(self.current_rot_z_speed, self.rot_step_per_sec) elif rot_z < 0: self.current_rot_z_speed -= self.incr_speed_rot_step_per_sec * dt self.current_rot_z_speed = max(self.current_rot_z_speed, -self.rot_step_per_sec) elif self.current_rot_z_speed > 0.0: self.current_rot_z_speed -= self.decr_speed_rot_step_per_sec * dt self.current_rot_z_speed = max(0.0, self.current_rot_z_speed) elif self.current_rot_z_speed < 0.0: self.current_rot_z_speed += self.decr_speed_rot_step_per_sec * dt self.current_rot_z_speed = min(0.0, self.current_rot_z_speed) else: self.current_rot_x_speed = rot_x * self.rot_step_per_sec self.current_rot_y_speed = rot_y * self.rot_step_per_sec self.current_rot_z_speed = rot_z * self.rot_step_per_sec self.turn(LVector3d.right(), self.current_rot_x_speed * dt) self.turn(LVector3d.forward(), self.current_rot_y_speed * dt) self.turn(LVector3d.up(), self.current_rot_z_speed * dt) self.change_altitude(distance * self.distance_speed * dt)