GAMES201课程提问

GAMES201课程中,Lecture 8 混合欧拉-拉格朗日视角(2)31分42秒处,Moving collision object 和 coulomb friction,两种边界条件,尤其是移动边界条件,胡老师讲到 ”在相对速度上面做边界条件,做完边界条件再加上去,实际是做了坐标系的变换” 这部分一句话就带过了,实在是没理解,哪位老师能指点一下,该去补哪些知识。

可以看一下之前发给你的这段代码~ 我加了些注释

    for i, j in grid_m:
        if grid_m[i, j] > 0:  # No need for epsilon here
            grid_v[i,
                   j] = (1 / grid_m[i, j]) * grid_v[i,
                                                    j]  # Momentum to velocity

            grid_v[i, j][1] -= dt * 50  # gravity

            grid_pos = ti.Vector([i, j]) * dx
            collider_center = ti.Vector([collider_x, collider_y])
            collider_offset = grid_pos - collider_center
            if collider_offset.norm() < collider_radius:
                normal = collider_offset.normalized(1e-8)
                v_co = ti.Vector([collider_vx, collider_vy]) # collider
                v_rel = grid_v[i, j] - v_co # 计算网格相对于 collider 的速度,等效于把速度转换到一个随着 collider 一起运动的坐标系,在这个坐标系里面 collider 静止

                v_n = v_rel.dot(normal) # 速度法向分量
                v_tan = v_rel - v_n * normal # 速度的切向分量
                v_tan_len = v_tan.norm()
                friction_coeff = 0.4

                if v_n < 0: # 摩擦模型
                    v_tan_normalized = v_tan / (v_tan_len + 1e-5)
                    v_rel = max(v_tan_len + friction_coeff * v_n, 0) * v_tan_normalized
                grid_v[i, j] = v_rel + v_co # 把速度从 collider 坐标系转换回 grid 坐标系