嗯嗯,这是一个很好的问题,确实很容易让你迷惑。
首先,减去0.5的原因是我们一般认为粒子在网格的中间。胡老师在Games 201, Lec 7, page 16,讲过为什么减去0.5,可以在B站具体听一下讲解here。
MPM中P2G阶段,需要将particle上的信息按照权重 w ,分散到周围的网格点上,这个例子里面就是 3\times3 的网格大小。
base
就是 这个网格的左下角网格点的位置。fx
就是particle 到base
网格点的差值。
我们可以以 p=[1.2,0.6], dx = 1.0 为例,研究一下权重 w 的求解。
我们这个例子中使用的是Quadratic kernels
那么 p 在 x 轴上,根据距离差可以算出和对应网格顶点的权重
对base
的影响(权重 w )应该是 N(1.2)
对B
的影响(权重 w )应该是 N(0.2)
对C
的影响(权重 w )应该是 N(-0.8)
你现在应该都还是很清楚的,但是你会看到这个公式和代码中的公式是不一样的。这就要涉及到一些数学了。我们将核函数 N 根据定义域分为三个部分 [-1.5, -0.5], [-0.5, 0.5], [0.5,1.5] 。这三个部分都可以用 [0.5,1.5] 的三个函数来表示。依然用图片给你展示一下:
-
N(x) \in [0.5,1.5] = f(x) \in [0.5,1.5]
-
N(x) \in [-0.5,0.5] = g(x) \in [0.5,1.5]
-
N(x) \in [-1.5,-0.5] = h(x) \in [0.5,1.5]
综上,你可以看出来
对base
的影响(权重 w )应该是 N(1.2), 也就是 f(1.2)
对B
的影响(权重 w )应该是 N(0.2), 也就是 g(1.2)
对C
的影响(权重 w )应该是 N(-0.8) , 也就是 h(1.2)
其中 1.2 = fx.x ,
那么 mpm88.py
的Line 37
w = [0.5 * (1.5 - fx)**2, 0.75 - (fx - 1)**2, 0.5 * (fx - 0.5)**2]
中的 w[0].x = f(1.2) = N(1.2), w[1].x = g(1.2) = N(0.2) , w[2].x = h(1.2) = N(-0.8) 。
Y轴同理 w[0].y = f(0.6)=N(0.6), w[1].y = g(0.6)=N(-0.4), w[2].y = h(0.6) = N(-1.4)