Invoke Tech Blog

简易质点弹簧系统

2025-11-05

物理原理

  • 弹簧的物理原理基于 Hooke's Law(胡克定律),该定律描述了弹簧在拉伸或压缩时的力与变形量之间的关系。
  • 质点弹簧,这里用两个重合的质点来模拟无原长弹簧的行为。 重合质点
  • 设a为主动点,b为从动点。分析b点的受力,由胡克定律可得,F=Kx,其中K为弹簧的劲度系数,x为弹簧的变形量。因为是质点,所以Kx = a。V = a * deltaT = Kx * deltaT。这里x为向量,给定x的模长和方向,即可求出b点在某一时刻的坐标。 弹簧受力
  • 由于没有阻力,a点停止后,b点仍会做无限循环运动。这里为b点添加阻力。f = -b * V,其中b为阻力系数,V为b点的速度。
  • 这时b点受力变为 F = Kx - b * V,F依旧代入上式求速度。 添加阻力

代码实现

脚本

  • 这里给出几个关键函数
//弹簧拉力
private Vector3 GetMainForce()
{
    //胡克定律
    Vector3 forceDir = transform.position - followPos;
    return forceDir * stiffness;
}
//弹簧阻力
private Vector3 GetDampingForce()
{
    return -massVelocity * damping;//弹簧阻尼
}
  • 以position为主动点质点坐标,即可求出每一帧从动点的坐标。

Shader

  • 在脚本中将主动点和从动点坐标传到Shader中,在顶点着色器中根据主动点和从动点的偏移值对顶点进行偏移,将模型顶点的Y坐标映射到0-1,作为主动点和从动点的Mask,将顶点原位置与偏移后位置进行插值即可得到弹簧效果。(这里默认模型底部为主动点)