Esempio n. 1
0
def forward(output=None, visualize=True):
  if random.random() > 0.5:
    goal[None] = [0.9, 0.2]
  else:
    goal[None] = [0.1, 0.2]
  goal[None] = [0.9, 0.2]
  
  interval = vis_interval
  if output:
    interval = output_vis_interval
    os.makedirs('mass_spring/{}/'.format(output), exist_ok=True)
  
  total_steps = steps if not output else steps * 2
  
  for t in range(1, total_steps):
    compute_center(t - 1)
    nn1(t - 1)
    nn2(t - 1)
    apply_spring_force(t - 1)
    if use_toi:
      advance_toi(t)
    else:
      advance_no_toi(t)
      
    if (t + 1) % interval == 0 and visualize:
      canvas.clear(0xFFFFFF)
      canvas.path(tc.vec(0, ground_height), tc.vec(1, ground_height)).color(0x0).radius(3).finish()
      
      def circle(x, y, color):
        canvas.circle(tc.vec(x, y)).color(rgb_to_hex(color)).radius(7).finish()
      
      
      for i in range(n_springs):
        def get_pt(x):
          return tc.vec(x[0], x[1])
        
        a = act[t - 1, i] * 0.5
        r = 2
        if spring_actuation[i] == 0:
          a = 0
          c = 0x222222
        else:
          r = 4
          c = rgb_to_hex((0.5 + a, 0.5 - abs(a), 0.5 - a))
        canvas.path(get_pt(x[t, spring_anchor_a[i]]),
                get_pt(x[t, spring_anchor_b[i]])).color(c).radius(r).finish()

      for i in range(n_objects):
        color = (0.4, 0.6, 0.6)
        if i == head_id:
          color = (0.8, 0.2, 0.3)
        circle(x[t, i][0], x[t, i][1], color)
      # circle(goal[None][0], goal[None][1], (0.6, 0.2, 0.2))
      
      gui.update()
      if output:
        gui.screenshot('mass_spring/{}/{:04d}.png'.format(output, t))
  
  loss[None] = 0
  compute_loss(steps - 1)
Esempio n. 2
0
def forward(visualize=False, output=None):
    interval = vis_interval
    if output:
        interval = output_vis_interval
        os.makedirs('gravity/{}/'.format(output), exist_ok=True)

    canvas = gui.get_canvas()
    for t in range(1, steps):
        nn1(t)
        nn2(t)
        advance(t)
        compute_loss(t)

        if (t + 1) % interval == 0 and visualize:
            canvas.clear(0x3C733F)

            for i in range(n_gravitation):
                r = (gravitation[t, i] + 1) * 30
                canvas.circle(tc.vec(*gravitation_position[i])).radius(
                    r).color(0xccaa44).finish()

            canvas.circle(tc.vec(x[t][0],
                                 x[t][1])).radius(30).color(0xF20530).finish()

            canvas.circle(tc.vec(
                goal[t][0], goal[t][1])).radius(10).color(0x3344cc).finish()

            gui.update()
            if output:
                gui.screenshot('gravity/{}/{:04d}.png'.format(output, t))
Esempio n. 3
0
def forward(output=None, visualize=True):
    interval = vis_interval
    total_steps = steps
    if output:
        interval = output_vis_interval
        # os.makedirs('rigid_body/{}/'.format(output), exist_ok=True)
        total_steps *= 2

    for t in range(1, total_steps):
        if use_toi:
            advance_toi(t)
        else:
            advance_no_toi(t)

        if (t + 1) % interval == 0 and visualize:
            canvas.clear(0xFFFFFF)
            canvas.circle(tc.vec(x[t, 0][0],
                                 x[t, 0][1])).radius(10).color(0x0).finish()
            offset = 0.003
            canvas.path(tc.vec(0.05, ground_height - offset),
                        tc.vec(0.95, ground_height -
                               offset)).radius(2).color(0xAAAAAA).finish()

            if output:
                gui.screenshot('rigid_body/{}/{:04d}.png'.format(output, t))

            gui.update()

    loss[None] = 0
    compute_loss(steps - 1)
Esempio n. 4
0
def forward(output=None, visualize=True, dy=0, i=0):
    x[0, 0] = [0.8, 0.4 + dy]
    v[0, 0] = [-2, -2]

    interval = vis_interval
    total_steps = steps
    if output:
        os.makedirs('rigid_body_toi/{}/'.format(output), exist_ok=True)

    canvas.clear(0xFFFFFF)
    for t in range(1, total_steps):
        if use_toi:
            advance_toi(t)
        else:
            advance_no_toi(t)

        if (t + 1) % interval == 0 and visualize:
            color = 0x010101 * min(
                255, max(0, int((1 - t * dt / total_t) * 0.7 * 255)))
            canvas.circle(tc.vec(x[t, 0][0],
                                 x[t, 0][1])).radius(80).color(color).finish()
            offset = 0.077
            canvas.path(tc.vec(0.05, ground_height - offset),
                        tc.vec(0.95, ground_height -
                               offset)).radius(2).color(0x000000).finish()

    if output:
        gui.screenshot('rigid_body_toi/{}/{:04d}.png'.format(output, i))
    gui.update()
Esempio n. 5
0
 def text(self, content, pos, font_size=15, color=0xFFFFFF):
     import taichi as ti
     # TODO: refactor Canvas::text
     font_size = float(font_size)
     pos = ti.vec(*pos)
     r, g, b = (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff
     color = ti.vec(r / 255, g / 255, b / 255, 1)
     self.canvas.text(content, pos, font_size, color)
Esempio n. 6
0
def render(gui, canvas):
  canvas.clear(bg_color)
  for pos in positions.to_numpy():
    for j in range(dim):
      pos[j] *= screen_to_world_ratio / screen_res[j]
    canvas.circle(ti.vec(pos[0], pos[1])).radius(
        particle_radius).color(particle_color).finish()
  canvas.rect(ti.vec(0, 0), ti.vec(
      board_states[None][0] / boundary[0], 1.0)).radius(1.5).color(boundary_color).close().finish()
  gui.update()
Esempio n. 7
0
def render(gui):
    canvas = gui.canvas
    canvas.clear(bg_color)
    pos_np = positions.to_numpy()
    for pos in pos_np:
        for j in range(dim):
            pos[j] *= screen_to_world_ratio / screen_res[j]
    gui.circles(pos_np, radius=particle_radius, color=particle_color)
    canvas.rect(ti.vec(
        0, 0), ti.vec(board_states[None][0] / boundary[0],
                      1.0)).radius(1.5).color(boundary_color).close().finish()
    gui.show()
Esempio n. 8
0
def main():
    for i in range(n_particle_x):
        for j in range(n_particle_y):
            t = mesh(i, j)
            x[t] = [0.1 + i * dx * 0.5, 0.7 + j * dx * 0.5]
            v[t] = [0, -1]

    # build mesh
    for i in range(n_particle_x - 1):
        for j in range(n_particle_y - 1):
            # element id
            eid = (i * (n_particle_y - 1) + j) * 2
            vertices[eid, 0] = mesh(i, j)
            vertices[eid, 1] = mesh(i + 1, j)
            vertices[eid, 2] = mesh(i, j + 1)

            eid = (i * (n_particle_y - 1) + j) * 2 + 1
            vertices[eid, 0] = mesh(i, j + 1)
            vertices[eid, 1] = mesh(i + 1, j + 1)
            vertices[eid, 2] = mesh(i + 1, j)

    compute_rest_T()

    os.makedirs('tmp', exist_ok=True)

    for f in range(600):
        canvas.clear(0x112F41)
        for s in range(50):
            clear_grid()
            # Note that we are now differentiating the total energy w.r.t. the particle position.
            # Recall that F = - \partial (total_energy) / \partial x
            with ti.Tape(total_energy):
                # Do the forward computation of total energy and backward propagation for x.grad, which is later used in p2g
                compute_total_energy()
                # It's OK not to use the computed total_energy at all, since we only need x.grad
            p2g()
            grid_op()
            g2p()

        canvas.circle(ti.vec(0.5, 0.5)).radius(70).color(0x068587).finish()
        # TODO: why is visualization so slow?
        for i in range(n_elements):
            for j in range(3):
                a, b = vertices[i, j], vertices[i, (j + 1) % 3]
                canvas.path(ti.vec(x[a][0], x[a][1]), ti.vec(
                    x[b][0], x[b][1])).radius(1).color(0x4FB99F).finish()
        for i in range(n_particles):
            canvas.circle(ti.vec(x[i][0],
                                 x[i][1])).radius(2).color(0xF2B134).finish()
        gui.update()
        gui.screenshot("tmp/{:04d}.png".format(f))
    ti.profiler_print()
def forward(output=None, visualize=True):

    initialize_properties()

    interval = vis_interval
    total_steps = steps
    if output:
        interval = output_vis_interval
        os.makedirs('rigid_body/{}/'.format(output), exist_ok=True)
        total_steps *= 2

    for t in range(1, total_steps):
        collide(t - 1)
        advance(t)

        if (t + 1) % interval == 0 and visualize:
            canvas.clear(0xFFFFFF)
            for i in range(n_objects):
                points = []
                for k in range(4):
                    offset_scale = [[-1, -1], [1, -1], [1, 1], [-1, 1]][k]
                    rot = rotation[t, i]
                    rot_matrix = np.array([[math.cos(rot), -math.sin(rot)],
                                           [math.sin(rot),
                                            math.cos(rot)]])

                    pos = np.array([x[t, i][0], x[t, i][1]
                                    ]) + offset_scale * rot_matrix @ np.array(
                                        [halfsize[i][0], halfsize[i][1]])
                    points.append((pos[0], pos[1]))

                for k in range(4):
                    canvas.path(
                        ti.vec(*points[k]),
                        ti.vec(*points[(k + 1) %
                                       4])).radius(2).color(0x0).finish()

            offset = 0.003
            canvas.path(ti.vec(0.05, ground_height - offset),
                        ti.vec(0.95, ground_height -
                               offset)).radius(2).color(0xAAAAAA).finish()

            if output:
                gui.screenshot('rigid_body/{}/{:04d}.png'.format(output, t))

            gui.update()

    loss[None] = 0
    compute_loss(steps - 1)
Esempio n. 10
0
def visualize(s, folder):
  canvas.clear(0xFFFFFF)
  vec = tc.vec
  for i in range(n_particles):
    color = 0x111111
    aid = actuator_id[i]
    if aid != -1:
      act = actuation[s - 1, aid]
      color = rgb_to_hex((0.5 - act, 0.5 - abs(act), 0.5 + act))
    canvas.circle(vec(x[s, i][0], x[s, i][1])).radius(2).color(color).finish()
  canvas.path(tc.vec(0.05, 0.02), tc.vec(0.95, 0.02)).radius(3).color(0x0).finish()
  gui.update()

  os.makedirs(folder, exist_ok=True)
  gui.screenshot('{}/{:04d}.png'.format(folder, s))
Esempio n. 11
0
def main():
    for i in range(n_particle_x):
        for j in range(n_particle_y):
            t = mesh(i, j)
            x[t] = [0.1 + i * dx * 0.5, 0.7 + j * dx * 0.5]
            v[t] = [0, -1]

    # build mesh
    for i in range(n_particle_x - 1):
        for j in range(n_particle_y - 1):
            # element id
            eid = (i * (n_particle_y - 1) + j) * 2
            vertices[eid, 0] = mesh(i, j)
            vertices[eid, 1] = mesh(i + 1, j)
            vertices[eid, 2] = mesh(i, j + 1)

            eid = (i * (n_particle_y - 1) + j) * 2 + 1
            vertices[eid, 0] = mesh(i, j + 1)
            vertices[eid, 1] = mesh(i + 1, j + 1)
            vertices[eid, 2] = mesh(i + 1, j)

    compute_rest_T()

    os.makedirs('tmp', exist_ok=True)

    for f in range(600):
        canvas.clear(0x112F41)
        for s in range(50):
            clear_grid()
            with ti.Tape(total_energy):
                compute_total_energy()
            p2g()
            grid_op()
            g2p()

        canvas.circle(ti.vec(0.5, 0.5)).radius(70).color(0x068587).finish()
        # TODO: why is visualization so slow?
        for i in range(n_elements):
            for j in range(3):
                a, b = vertices[i, j], vertices[i, (j + 1) % 3]
                canvas.path(ti.vec(x[a][0], x[a][1]), ti.vec(
                    x[b][0], x[b][1])).radius(1).color(0x4FB99F).finish()
        for i in range(n_particles):
            canvas.circle(ti.vec(x[i][0],
                                 x[i][1])).radius(2).color(0xF2B134).finish()
        gui.update()
        gui.screenshot("tmp/{:04d}.png".format(f))
    ti.profiler_print()
Esempio n. 12
0
def main():
    for i in range(n_particles):
        x[i] = [random.random() * 0.4 + 0.2, random.random() * 0.4 + 0.2]
        v[i] = [0, -1]
        J[i] = 1

    for f in range(200):
        canvas.clear(0x112F41)
        t = time.time()
        for s in range(150):
            clear_grid()
            p2g()
            grid_op()
            g2p()
        print('{:.1f} ms per frame'.format(1000 * (time.time() - t)))

        pos = np.empty((2 * n_particles), dtype=np.float32)
        copy_x(pos)
        for i in range(n_particles):
            # canvas.circle(ti.vec(x[i][0], x[i][1])).radius(1).color(0x068587).finish()

            # Python binding here is still a bit slow...
            canvas.circle(ti.vec(pos[i * 2],
                                 pos[i * 2 +
                                     1])).radius(1).color(0x068587).finish()
        gui.update()
    ti.profiler_print()
Esempio n. 13
0
def animate(total_steps: int, output=None):
    """Animate a the policy controlling the robot.

    * `total_steps` controls the number of time steps to animate for. This is
        necessary since the final animation is run for more time steps than in
        training.
    * `output` controls whether or not frames of the animation are screenshotted
        and dumped to a results directory.
    """
    if output:
        os.makedirs("{}/{}/".format(RESULTS_DIR, output))

    for t in range(1, total_steps):
        canvas.clear(0xFFFFFF)
        canvas.path(ti.vec(0, ground_height),
                    ti.vec(1, ground_height)).color(0x0).radius(3).finish()

        def circle(x, y, color):
            canvas.circle(ti.vec(x, y)).color(
                ti.rgb_to_hex(color)).radius(7).finish()

        for i in range(n_springs):

            def get_pt(x):
                return ti.vec(x[0], x[1])

            a = act[t - 1, i] * 0.5
            r = 2
            if spring_actuation[i] == 0:
                a = 0
                c = 0x222222
            else:
                r = 4
                c = ti.rgb_to_hex((0.5 + a, 0.5 - abs(a), 0.5 - a))
            canvas.path(
                get_pt(x[t, spring_anchor_a[i]]),
                get_pt(x[t, spring_anchor_b[i]])).color(c).radius(r).finish()

        for i in range(n_objects):
            color = (0.4, 0.6, 0.6)
            if i == head_id:
                color = (0.8, 0.2, 0.3)
            circle(x[t, i][0], x[t, i][1], color)

        gui.update()
        if output:
            gui.screenshot("{}/{}/{:04d}.png".format(RESULTS_DIR, output, t))
Esempio n. 14
0
def forward(visualize=False, output=None):
    initialize()

    interval = vis_interval
    if output:
        interval = output_vis_interval
        os.makedirs('billiards/{}/'.format(output), exist_ok=True)

    count = 0
    for i in range(billiard_layers):
        for j in range(i + 1):
            count += 1
            x[0, count] = [
                i * 2 * radius + 0.5, j * 2 * radius + 0.5 - i * radius * 0.7
            ]

    pixel_radius = int(radius * 1024) + 1

    canvas = gui.get_canvas()
    for t in range(1, steps):
        collide(t - 1)
        advance(t)

        if (t + 1) % interval == 0 and visualize:
            canvas.clear(0x3C733F)

            canvas.circle(tc.vec(goal[0], goal[1])).radius(
                pixel_radius // 2).color(0x00000).finish()

            for i in range(n_balls):
                if i == 0:
                    color = 0xCCCCCC
                elif i == n_balls - 1:
                    color = 0x3344cc
                else:
                    color = 0xF20530

                canvas.circle(tc.vec(
                    x[t, i][0],
                    x[t, i][1])).radius(pixel_radius).color(color).finish()

            gui.update()
            if output:
                gui.screenshot('billiards/{}/{:04d}.png'.format(output, t))

    compute_loss(steps - 1)
Esempio n. 15
0
def main():
    for i in range(n_particles):
        x[i] = [random.random() * 0.4 + 0.2, random.random() * 0.4 + 0.2]
        v[i] = [0, -1]
        J[i] = 1

    for f in range(200):
        canvas.clear(0x112F41)
        for s in range(150):
            clear_grid()
            p2g()
            grid_op()
            g2p()

        # TODO: why is visualization so slow?
        for i in range(n_particles):
            canvas.circle(ti.vec(x[i][0],
                                 x[i][1])).radius(1).color(0x068587).finish()
        gui.update()
    ti.profiler_print()
Esempio n. 16
0
 def circle(self, pos, color, radius=1):
     import taichi as ti
     self.canvas.circle(ti.vec(
         pos[0], pos[1])).radius(radius).color(color).finish()
Esempio n. 17
0
        g_v = grid_v[base + ti.Vector([i, j])]
        weight = w[i][0] * w[j][1]
        new_v += weight * g_v
        new_C += 4 * weight * ti.outer_product(g_v, dpos) * inv_dx
    v[p] = new_v
    x[p] += dt * v[p]
    J[p] *= 1 + dt * new_C.trace()
    C[p] = new_C


gui = ti.core.GUI("MPM88", ti.veci(512, 512))
canvas = gui.get_canvas()

for i in range(n_particles):
  x[i] = [random.random() * 0.4 + 0.2, random.random() * 0.4 + 0.2]
  v[i] = [0, -1]
  J[i] = 1

for frame in range(200):
  for s in range(50):
    grid_v.fill([0, 0])
    grid_m.fill(0)
    substep()

  canvas.clear(0x112F41)
  pos = x.to_numpy(as_vector=True)
  for i in range(n_particles):
    canvas.circle(ti.vec(pos[i, 0],
                         pos[i, 1])).radius(1.5).color(0x068587).finish()
  gui.update()
Esempio n. 18
0
 def circle(x, y, color):
     canvas.circle(tc.vec(x, y)).color(
         rgb_to_hex(color)).radius(7).finish()
Esempio n. 19
0
x = ti.Vector(dim, dt=ti.f32, shape=n_particles)
for i in range(n_particles):
    x[i] = x_logo[i]


@ti.func
def complexMul(a: ti.f32, b: ti.f32, c: ti.f32, d: ti.f32):  # 复数乘法,用于旋转
    return [a * c - b * d, b * c + a * d]


@ti.kernel
def substep():
    for p in x:
        x[p] = x[p] - 0.5
        x[p] = complexMul(x[p][0], x[p][1], spin[0], spin[1])
        x[p] = x[p] + 0.5


gui = ti.core.GUI("SYSU_CG_COURSE", ti.veci(512, 512))
canvas = gui.get_canvas()
for frame in range(19260817):
    substep()

    canvas.clear(0)
    pos = x.to_numpy(as_vector=True)
    for i in range(n_particles):
        canvas.circle(ti.vec(pos[i, 0],
                             pos[i, 1])).radius(7).color(87 * 256 +
                                                         33).finish()  # 中大绿
    gui.update()
Esempio n. 20
0
def imread(fn, bgr=False):
  img = taichi.core.Array2DVector3(
      taichi.veci(0, 0), taichi.vec(0.0, 0.0, 0.0))
  img.read(fn)
  return image_buffer_to_ndarray(img, bgr)[::-1]
Esempio n. 21
0
def forward(output=None, visualize=True):

    initialize_properties()

    interval = vis_interval
    total_steps = steps
    if output:
        print(output)
        interval = output_vis_interval
        os.makedirs('rigid_body/{}/'.format(output), exist_ok=True)
        total_steps *= 2

    goal[None] = [0.9, 0.15]
    for t in range(1, total_steps):
        nn1(t - 1)
        nn2(t - 1)
        collide(t - 1)
        apply_spring_force(t - 1)
        if use_toi:
            advance_toi(t)
        else:
            advance_no_toi(t)

        if (t + 1) % interval == 0 and visualize:
            canvas.clear(0xFFFFFF)

            for i in range(n_objects):
                points = []
                for k in range(4):
                    offset_scale = [[-1, -1], [1, -1], [1, 1], [-1, 1]][k]
                    rot = rotation[t, i]
                    rot_matrix = np.array([[math.cos(rot), -math.sin(rot)],
                                           [math.sin(rot),
                                            math.cos(rot)]])

                    pos = np.array([x[t, i][0], x[t, i][1]
                                    ]) + offset_scale * rot_matrix @ np.array(
                                        [halfsize[i][0], halfsize[i][1]])

                    points.append((pos[0], pos[1]))

                for k in range(4):
                    canvas.path(tc.vec(*points[k]), tc.vec(
                        *points[(k + 1) % 4])).color(0x0).radius(2).finish()

            for i in range(n_springs):

                def get_world_loc(i, offset):
                    rot = rotation[t, i]
                    rot_matrix = np.array([[math.cos(rot), -math.sin(rot)],
                                           [math.sin(rot),
                                            math.cos(rot)]])
                    pos = np.array([[x[t, i][0]], [
                        x[t, i][1]
                    ]]) + rot_matrix @ np.array([[offset[0]], [offset[1]]])
                    return pos

                pt1 = get_world_loc(spring_anchor_a[i], spring_offset_a[i])
                pt2 = get_world_loc(spring_anchor_b[i], spring_offset_b[i])

                color = 0xFF2233

                if spring_actuation[i] != 0 and spring_length[i] != -1:
                    a = actuation[t - 1, i] * 0.5
                    color = rgb_to_hex((0.5 + a, 0.5 - abs(a), 0.5 - a))

                if spring_length[i] == -1:
                    canvas.path(
                        tc.vec(*pt1),
                        tc.vec(*pt2)).color(0x000000).radius(9).finish()
                    canvas.path(tc.vec(*pt1),
                                tc.vec(*pt2)).color(color).radius(7).finish()
                else:
                    canvas.path(
                        tc.vec(*pt1),
                        tc.vec(*pt2)).color(0x000000).radius(7).finish()
                    canvas.path(tc.vec(*pt1),
                                tc.vec(*pt2)).color(color).radius(5).finish()

            canvas.path(tc.vec(0.05, ground_height - 5e-3),
                        tc.vec(0.95, ground_height -
                               5e-3)).color(0x0).radius(5).finish()

            gui.update()
            if output:
                gui.screenshot('rigid_body/{}/{:04d}.png'.format(output, t))

    loss[None] = 0
    compute_loss(steps - 1)
Esempio n. 22
0
def read_image(fn, linearize=False):
  img = taichi.core.Array2DVector3(
      taichi.veci(0, 0), taichi.vec(0.0, 0.0, 0.0))
  img.read(fn, linearize)
  return img
Esempio n. 23
0
 def get_pt(x):
     return tc.vec(x[0], x[1])
Esempio n. 24
0
 def line(self, begin, end, radius, color):
   import taichi as ti
   self.canvas.path(ti.vec(*begin), ti.vec(*end)).radius(radius).color(color).finish()
Esempio n. 25
0
                g_v = grid_v[base + ti.Vector([i, j])]
                weight = w[i][0] * w[j][1]
                new_v += weight * g_v
                new_C += 4 * weight * ti.outer_product(g_v, dpos) * inv_dx
        v[p] = new_v
        x[p] += dt * v[p]
        J[p] *= 1 + dt * new_C.trace()
        C[p] = new_C


gui = ti.core.GUI("MPM99", ti.veci(512, 512))
canvas = gui.get_canvas()

for i in range(n_particles):
    x[i] = [random.random() * 0.4 + 0.2, random.random() * 0.4 + 0.2]
    v[i] = [0, -1]
    J[i] = 1

for frame in range(200):
    for s in range(50):
        grid_v.fill([0, 0])
        grid_m.fill(0)
        substep()

    canvas.clear(0x112F41)
    pos = x.to_numpy(as_vector=True)
    for i in range(n_particles):
        canvas.circle(ti.vec(pos[i, 0], pos[i, 1])).radius(
            1.5).color(0x068587).finish()
    gui.update()
Esempio n. 26
0
 def circles(self, pos, color, radius=1):
     import taichi as ti
     for i in range(len(pos)):
         self.canvas.circle(ti.vec(
             pos[i, 0], pos[i, 1])).radius(radius).color(color[i]).finish()