粒子边界碰撞的处理

这篇内容讲述了如何处理单个粒子与边界碰撞的场景。首先判断粒子是否穿透边界,然后根据壁面法向量和速度进行速度的法向与切向分解。接着,应用法向和切向衰减系数调整速度,并确保切向衰减系数符合库仑摩擦定律。最后,重组速度并移动粒子。示例代码展示了具体实现过程。
摘要由CSDN通过智能技术生成

对于单个粒子处理碰撞:

首先,要判断粒子是否穿透了边界,假如穿透了,才发生碰撞。这要通过碰撞检测算法来实现。这个算法很复杂,尤其在涉及多个物体和复杂表面的情况下。我们先不讨论,只讨论最简单的情况。

假设我们已经检测到了碰撞,并且我们知道壁面的法向N。还知道当前粒子的速度和位置。

那么

  1. 判断 v ⋅ N < 0 ? v\cdot N < 0? vN<0? 前者意味着速度要继续往穿透边界的方向移动。如果不是,意味着粒子已经朝着离开固体的方向移动了,很可能是上一时刻已经处理过,但是暂且还未离开的粒子。
  2. 根据壁面法向N,把速度拆解为法向和切向。然后法向乘以法向衰减系数并且反向,切向乘以切向衰减系数。但是这里要注意切向衰减系数是要根据库仑摩擦定律计算出来。计算出来的值和法向速度大小与切向速度大小的比值有关。
  3. 重组法向和切向速度。然后移动粒子。

参考:games103 王华民

在这里插入图片描述

import taichi as ti
import random

x = random.randint(0, 9)
y = random.randint(-3, 3)

velocities = ti.Vector([x, y, 0])
print(velocities)

n_dir = ti.Vector([0, 1, 0]).normalized()


vn = velocities.dot(n_dir) * n_dir
vt = velocities - vn
vt_norm = vt.norm()
vn_norm = vn.norm()
print(f"vn_norm:{vn_norm}; vt_norm:{vt_norm}")


if(velocities.dot(n_dir) < 0 and vt_norm != 0):
    mu_N = 1
    mu_T = 1
    vn_new = -mu_N * vn
    a = ti.max((1 - mu_T * (1 + mu_N) * vn.norm() / vt_norm ), 0)
    print(1 - mu_T * (1 + mu_N) * vn.norm() / vt_norm )
    print(f"a={a}")
    vt_new = a * vt

    v_new = vn_new + vt_new

    print(v_new)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值