示例#1
0
    def setup(self, *args, **kwargs):
        super().setup(*args, **kwargs)

        self._setup_body()
        assert self.body is not None
        self.body.position = self.init_pos
        self.body.angle = self.init_angle
        self.add_to_space(self.body)

        # Main body position and angle should be set before calling setup on the
        # extra bodies since they might depend on those values.
        self._setup_extra_bodies()
        self.add_to_space(*self.extra_bodies)

        self._setup_control_body()
        assert self.control_body is not None

        self._setup_shape()
        self._setup_extra_shapes()
        assert self.shape is not None
        self.add_to_space(self.shape)
        self.add_to_space(self.extra_shapes)

        self._setup_graphic()
        self._setup_extra_graphics()
        assert self.graphic_bodies

        self.xform = r.Transform()
        self.robot_compound = r.Compound(
            [*self.graphic_bodies, *self.extra_graphic_bodies])
        self.robot_compound.add_transform(self.xform)
        self.viewer.add_geom(self.robot_compound)
示例#2
0
    def setup(self, *args, **kwargs):
        super().setup(*args, **kwargs)

        # thick line segments around the edges
        arena_body = pm.Body(body_type=pm.Body.STATIC)
        rad = self.seg_rad
        points = [
            (self.left - rad, self.top + rad),
            (self.right + rad, self.top + rad),
            (self.right + rad, self.bottom - rad),
            (self.left - rad, self.bottom - rad),
        ]
        arena_segments = []
        for start_point, end_point in zip(points, points[1:] + points[:1]):
            segment = pm.Segment(arena_body, start_point, end_point, rad)
            segment.friction = 0.8
            arena_segments.append(segment)
        self.add_to_space(*arena_segments)

        width = self.right - self.left
        height = self.top - self.bottom
        arena_square = r.make_rect(width, height, True)
        arena_square.color = (1, 1, 1)
        arena_square.outline_color = COLORS_RGB["grey"]
        txty = (self.left + width / 2, self.bottom + height / 2)
        centre_xform = r.Transform(translation=txty)
        arena_square.add_transform(centre_xform)

        self.viewer.add_geom(arena_square)
示例#3
0
    def _setup_extra_graphics(self):
        super()._setup_extra_graphics()

        light_robot_color = lighten_rgb(self.robot_color, 4)
        self.finger_xforms = []
        finger_outer_geoms = []
        finger_inner_geoms = []
        for finger_outer_subshapes, finger_inner_verts, finger_side in zip(
                self.finger_shapes, self.finger_inner_vertices, [-1, 1]):
            finger_xform = r.Transform()
            self.finger_xforms.append(finger_xform)
            for finger_subshape in finger_outer_subshapes:
                vertices = [(v.x, v.y) for v in finger_subshape.get_vertices()]
                finger_outer_geom = r.Poly(vertices, False)
                finger_outer_geom.color = self.robot_color
                finger_outer_geom.add_transform(finger_xform)
                finger_outer_geoms.append(finger_outer_geom)
            for vertices in finger_inner_verts:
                finger_inner_geom = r.Poly(vertices, False)
                finger_inner_geom.color = light_robot_color
                finger_inner_geom.add_transform(finger_xform)
                finger_inner_geoms.append(finger_inner_geom)
        for geom in finger_outer_geoms:
            self.viewer.add_geom(geom)
        for geom in finger_inner_geoms:
            self.viewer.add_geom(geom)
示例#4
0
 def _setup_extra_graphics(self):
     self.eye_shapes = []
     self.pupil_transforms = []
     for x_sign in [-1, 1]:
         eye = r.make_circle(0.2 * self.radius, 100, outline=False)
         eye.color = (1.0, 1.0, 1.0)  # White color.
         eye_base_transform = r.Transform(translation=(x_sign *
                                                       self.eye_txty[0],
                                                       self.eye_txty[1]))
         eye.add_transform(eye_base_transform)
         pupil = r.make_circle(0.12 * self.radius, 100, outline=False)
         pupil.color = (0.1, 0.1, 0.1)  # Black color.
         pupil_transform = r.Transform()
         pupil.add_transform(
             r.Transform(translation=(0, self.radius * 0.07)))
         pupil.add_transform(pupil_transform)
         pupil.add_transform(eye_base_transform)
         self.pupil_transforms.append(pupil_transform)
         self.eye_shapes.extend([eye, pupil])
     self.extra_graphic_bodies.extend(self.eye_shapes)
示例#5
0
    def setup(self, *args, **kwargs):
        super().setup(*args, **kwargs)

        # the space only needs a sensor body
        self.goal_body = pm.Body(body_type=pm.Body.STATIC)
        self.goal_shape = pm.Poly.create_box(self.goal_body, (self.w, self.h))
        self.goal_shape.sensor = True
        self.goal_body.position = (self.x + self.w / 2, self.y - self.h / 2)
        self.add_to_space(self.goal_body, self.goal_shape)

        # Graphics.
        outer_color = self.base_color
        inner_color = lighten_rgb(self.base_color, times=2)
        inner_rect = r.make_rect(self.w, self.h, True, dashed=self.dashed)
        inner_rect.color = inner_color
        inner_rect.outline_color = outer_color
        self.goal_xform = r.Transform()
        inner_rect.add_transform(self.goal_xform)
        self.viewer.add_geom(inner_rect)
示例#6
0
    def setup(self, *args, **kwargs) -> None:
        super().setup(*args, **kwargs)

        # Physics. This joint setup was taken form tank.py in the pymunk
        # examples.
        if self.shape_type == ShapeType.SQUARE:
            side_len = math.sqrt(math.pi) * self.shape_size
            shapes = self._make_square(side_len)
        elif self.shape_type == ShapeType.CIRCLE:
            shapes = self._make_circle()
        elif self.shape_type == ShapeType.STAR:
            star_npoints = 5
            star_out_rad = 1.3 * self.shape_size
            star_in_rad = 0.5 * star_out_rad
            shapes, convex_parts = self._make_star(star_npoints, star_out_rad,
                                                   star_in_rad)
        else:
            # These are free-form shapes b/c no helpers exist in Pymunk.
            try:
                factor, num_sides = POLY_TO_FACTOR_SIDE_PARAMS[self.shape_type]
            except KeyError:
                raise NotImplementedError("haven't implemented",
                                          self.shape_type)
            side_len = factor * gtools.regular_poly_circ_rad_to_side_length(
                num_sides, self.shape_size)
            shapes, poly_verts = self._make_regular_polygon(
                num_sides, side_len)

        for shape in shapes:
            shape.friction = 0.5
            self.add_to_space(shape)

        trans_joint = pm.PivotJoint(self.space.static_body, self.shape_body,
                                    (0, 0), (0, 0))
        trans_joint.max_bias = 0
        trans_joint.max_force = self.phys_vars.shape_trans_joint_max_force
        self.add_to_space(trans_joint)
        rot_joint = pm.GearJoint(self.space.static_body, self.shape_body, 0.0,
                                 1.0)
        rot_joint.max_bias = 0
        rot_joint.max_force = self.phys_vars.shape_rot_joint_max_force
        self.add_to_space(rot_joint)

        # Graphics.
        geoms_outer = []
        if self.shape_type == ShapeType.SQUARE:
            geoms = [r.make_square(side_len, outline=True)]
        elif self.shape_type == ShapeType.CIRCLE:
            geoms = [r.make_circle(self.shape_size, 100, True)]
        elif self.shape_type == ShapeType.STAR:
            star_short_verts = gtools.compute_star_verts(
                star_npoints,
                star_out_rad - SHAPE_LINE_THICKNESS,
                star_in_rad - SHAPE_LINE_THICKNESS,
            )
            short_convex_parts = autogeom.convex_decomposition(
                star_short_verts + star_short_verts[:1], 0)
            geoms = []
            for part in short_convex_parts:
                geoms.append(r.Poly(part, outline=False))
            geoms_outer = []
            for part in convex_parts:
                geoms_outer.append(r.Poly(part, outline=False))
        elif (self.shape_type == ShapeType.OCTAGON
              or self.shape_type == ShapeType.HEXAGON
              or self.shape_type == ShapeType.PENTAGON
              or self.shape_type == ShapeType.TRIANGLE):
            geoms = [r.Poly(poly_verts, outline=True)]
        else:
            raise NotImplementedError("haven't implemented", self.shape_type)

        if self.shape_type == ShapeType.STAR:
            for g in geoms_outer:
                g.color = darken_rgb(self.color)
            for g in geoms:
                g.color = self.color
        else:
            for g in geoms:
                g.color = self.color
                g.outline_color = darken_rgb(self.color)

        self.shape_xform = r.Transform()
        shape_compound = r.Compound(geoms_outer + geoms)
        shape_compound.add_transform(self.shape_xform)
        self.viewer.add_geom(shape_compound)