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 坐标系