コード例 #1
0
ファイル: camera.py プロジェクト: tarsbase/cosmonium
    def calc_look_at(self, target, rel=True, position=None):
        if not rel:
            if position is None:
                position = self.get_camera_pos()
            direction = LVector3d(target - position)
        else:
            direction = LVector3d(target)
        direction.normalize()
        local_direction = self.get_camera_rot().conjugate().xform(direction)
        angle = LVector3d.forward().angleRad(local_direction)
        axis = LVector3d.forward().cross(local_direction)
        if axis.length() > 0.0:
            new_rot = utils.relative_rotation(self.get_camera_rot(), axis,
                                              angle)
#         new_rot=LQuaterniond()
#         lookAt(new_rot, direction, LVector3d.up())
        else:
            new_rot = self.get_camera_rot()
        return new_rot, angle
コード例 #2
0
ファイル: bodies.py プロジェクト: ondrocks/cosmonium
 def get_normals_under(self, position):
     if self.surface is not None:
         (x, y, distance) = self.spherical_to_longlat(self.cartesian_to_spherical(position))
         vectors = self.surface.get_normals_at(x, y)
     else:
         vectors = (LVector3d.up(), LVector3d.forward(), LVector3d.left())
     sync_frame = SynchroneReferenceFrame(self)
     return (sync_frame.get_orientation().xform(vectors[0]),
             sync_frame.get_orientation().xform(vectors[1]),
             sync_frame.get_orientation().xform(vectors[2]))
コード例 #3
0
ファイル: nav.py プロジェクト: ondrocks/cosmonium
    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)
コード例 #4
0
ファイル: camera.py プロジェクト: tarsbase/cosmonium
 def __init__(self, cam, lens):
     CameraBase.__init__(self, cam, lens)
     #Global position of the camera, i.e. the center of the current system
     self.camera_global_pos = LPoint3d()
     #Local position of the camera within the system in the current camera reference frame
     #Initialize not at zero to avoid null vector when starting to move
     self.camera_pos = LPoint3d(0, -1, 0)
     #Camera orientation in the current camera reference frame
     self.camera_rot = LQuaterniond()
     #Camera reference frame
     self.camera_frame = AbsoluteReferenceFrame()
     #Direction of sight of the camera
     self.camera_vector = LVector3d.forward()
コード例 #5
0
 def update_instance(self, camera_pos, camera_rot):
     position = self.parent.project(0, self.context.observer.camera_global_pos, self.context.observer.infinity)
     if position != None:
         self.instance.setPos(*position)
         scale = abs(self.context.observer.pixel_size * self.parent.get_label_size() * self.context.observer.infinity)
     else:
         scale = 0.0
     if scale < 1e-7:
         print("Label too far", self.get_name())
         scale = 1e-7
     self.instance.setScale(scale)
     self.look_at.set_pos(LVector3(*(camera_rot.xform(LVector3d.forward()))))
     self.label_instance.look_at(self.look_at, LVector3(), LVector3(*(camera_rot.xform(LVector3d.up()))))
コード例 #6
0
ファイル: nav.py プロジェクト: raonyguimaraes/cosmonium
    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)
コード例 #7
0
ファイル: stellarobject.py プロジェクト: cosmonium/cosmonium
 def update_instance(self, camera_pos, camera_rot):
     body = self.parent
     if body.is_emissive() and (not body.resolved or body.background):
         if body.scene_position != None:
             self.instance.setPos(*body.scene_position)
             scale = abs(self.context.observer.pixel_size * body.get_label_size() * body.scene_distance)
         else:
             scale = 0.0
     else:
         offset = body.get_apparent_radius() * 1.01
         rel_front_pos = body.rel_position - camera_rot.xform(LPoint3d(0, offset, 0))
         vector_to_obs = LVector3d(-rel_front_pos)
         distance_to_obs = vector_to_obs.length()
         vector_to_obs /= distance_to_obs
         position, distance, scale_factor = self.calc_scene_params(rel_front_pos, rel_front_pos, distance_to_obs, vector_to_obs)
         self.instance.setPos(*position)
         scale = abs(self.context.observer.pixel_size * body.get_label_size() * distance)
     self.look_at.set_pos(LVector3(*(camera_rot.xform(LVector3d.forward()))))
     self.label_instance.look_at(self.look_at, LVector3(), LVector3(*(camera_rot.xform(LVector3d.up()))))
     self.instance.set_color_scale(LColor(self.fade, self.fade, self.fade, 1.0))
     if scale < 1e-7:
         print("Label too far", self.get_name())
         scale = 1e-7
     self.instance.setScale(scale)
コード例 #8
0
ファイル: camera.py プロジェクト: tarsbase/cosmonium
 def get_camera_vector(self):
     return self.get_camera_rot().xform(LVector3d.forward())
コード例 #9
0
ファイル: nav.py プロジェクト: ondrocks/cosmonium
    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)
コード例 #10
0
ファイル: tiles.py プロジェクト: cosmonium/cosmonium
 def get_normals_at(self, coord):
     vectors = (LVector3d.up(), LVector3d.forward(), LVector3d.left())
     return vectors
コード例 #11
0
ファイル: controllers.py プロジェクト: cosmonium/cosmonium
 def step_relative(self, distance):
     rotation = self.body._frame_rotation
     direction = rotation.xform(LVector3d.forward())
     self.step(direction, distance)
コード例 #12
0
ファイル: controllers.py プロジェクト: cosmonium/cosmonium
 def step_relative(self, distance):
     rotation = self.body.rotation.get_frame_rotation_at(
         0)  #TODO: retrieve simulation time
     direction = rotation.xform(LVector3d.forward())
     self.step(direction, distance)
コード例 #13
0
 def get_normals_under_xy(self, x, y):
     if self.surface is not None:
         vectors = self.surface.get_normals_at(x, y)
     else:
         vectors = (LVector3d.up(), LVector3d.forward(), LVector3d.left())
     return vectors