Пример #1
0
        self.offset_y = y
        self.offset_z = z

    def finalize(self):
        global n_particles, n_solid_particles
        n_particles = self.n_particles
        n_solid_particles = max(self.n_solid_particles, 1)
        print('n_particles', n_particles)
        print('n_solid', n_solid_particles)

    def set_n_actuators(self, n_act):
        global n_actuators
        n_actuators = n_act


gui = tc.core.GUI("Differentiable MPM", tc.Vectori(1024, 1024))
canvas = gui.get_canvas()


@ti.kernel
def splat(t: ti.i32):
    for i in range(n_particles):
        pos = ti.cast(x[t, i] * visualize_resolution, ti.i32)
        screen[pos[0], pos[1]][0] += 0.1


res = [visualize_resolution, visualize_resolution]


@ti.kernel
def copy_back_and_clear(img: np.ndarray):
Пример #2
0
def read_image(fn, linearize=False):
    img = taichi.core.Array2DVector3(taichi.Vectori(0, 0),
                                     taichi.Vector(0.0, 0.0, 0.0))
    img.read(fn, linearize)
    return img
Пример #3
0
        gravitational_force = ti.Vector([0.0, 0.0])
        for i in ti.static(range(n_gravitation)):  # instead of this one
            r = x[t - 1] - ti.Vector(gravitation_position[i])
            len_r = ti.max(r.norm(), 1e-1)
            gravitational_force += K * gravitation[t, i] / (len_r * len_r *
                                                            len_r) * r
        v[t] = v[t - 1] * math.exp(-dt * damping) + dt * gravitational_force
        x[t] = x[t - 1] + dt * v[t]


@ti.kernel
def compute_loss(t: ti.i32):
    ti.atomic_add(loss[None], dt * (x[t] - goal[t]).norm_sqr())


gui = tc.core.GUI("Gravity", tc.Vectori(1024, 1024))


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)
Пример #4
0
def imread(fn, bgr=False):
    img = taichi.core.Array2DVector3(taichi.Vectori(0, 0),
                                     taichi.Vector(0.0, 0.0, 0.0))
    img.read(fn)
    return image_buffer_to_ndarray(img, bgr)[::-1]
Пример #5
0
def advance(t: ti.i32):
  for i in range(n_objects):
    s = math.exp(-dt * damping)
    v[t, i] = s * v[t - 1, i] + v_inc[t, i] + dt * gravity * ti.Vector(
      [0.0, 1.0])
    x[t, i] = x[t - 1, i] + dt * v[t, i]
    omega[t, i] = s * omega[t - 1, i] + omega_inc[t, i]
    rotation[t, i] = rotation[t - 1, i] + dt * omega[t, i]


@ti.kernel
def compute_loss(t: ti.i32):
  loss[None] = x[t, head_id][0]


gui = tc.core.GUI("Rigid Body", tc.Vectori(1024, 1024))
canvas = gui.get_canvas()

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)
Пример #6
0
    x[t, i] = x[t - 1, i] + dt * v[t, i]


@ti.kernel
def compute_loss(t: ti.i32):
  loss[None] = ti.sqr(x[t, target_ball][0] - goal[0]) + ti.sqr(
    x[t, target_ball][1] - goal[1])


@ti.kernel
def initialize():
  x[0, 0] = init_x
  v[0, 0] = init_v


gui = tc.core.GUI("Billiards", tc.Vectori(1024, 1024))


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,
Пример #7
0
        depth = old_x[1] - ground_height
        if depth < 0 and new_v[1] < 0:
            # friction projection
            new_v[0] = 0
            new_v[1] = 0
        new_x = old_x + dt * new_v
        v[t, i] = new_v
        x[t, i] = new_x


@ti.kernel
def compute_loss(t: ti.i32):
    ti.atomic_add(loss[None], dt * ti.sqr(target_v[t][0] - v[t, head_id][0]))


gui = tc.core.GUI("Mass Spring Robot", tc.Vectori(1024, 1024))
canvas = gui.get_canvas()

from renderer_vector import rgb_to_hex


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
Пример #8
0
    for i in range(n_objects):
        s = math.exp(-dt * damping)
        v[t, i] = s * v[t - 1, i] + v_inc[t, i] + dt * gravity * ti.Vector(
            [0.0, 1.0])
        x[t, i] = x[t - 1, i] + dt * v[t, i]
        omega[t, i] = s * omega[t - 1, i] + omega_inc[t, i]
        rotation[t, i] = rotation[t - 1, i] + dt * omega[t, i]


@ti.kernel
def compute_loss(t: ti.i32):
    loss[None] = (x[t, head_id] - goal[None]).norm()


import taichi as tc
gui = tc.core.GUI('Rigid Body Simulation', tc.Vectori(1024, 1024))
canvas = gui.get_canvas()

from renderer_vector import rgb_to_hex


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)