【问题标题】:Damping a spring without affecting gravity在不影响重力的情况下阻尼弹簧
【发布时间】:2019-03-09 22:46:22
【问题描述】:

我在 OpenGL 中实现了一个弹簧粒子系统,其中粒子 B 被约束到 A,具有给定的偏移距离。粒子 B 受弹簧力和重力影响。这是实现:

vec3 velocity;
float k = 1.0f;
float damping = 0.1f;
dt = 0.01f;
void ImplementSpring(vec3 &Apos, vec3 &Bpos, float offsetDistance) {
    vec3 dir = Apos-Bpos;
    vec3 normdir = normalize(dir);
    float currentDistance = length(dir);


    //Forces
    vec3 gravity = vec3(0, -1, 0)*dt;
    vec3 spring = normdir*(currentDistance-offsetDistance)*k*dt;
    vec3 dampingForce = velocity*damping;

    //Calculate velocity
    vec3 acceleration = (gravity+spring-dampingForce)/particleMass;
    velocity += acceleration;
    Bpos += velocity;
}

void main() {
    ImplementSpring(vec3(0, 0, 0), vec3(0, -3, 0), 4);
}

现在,如果我增加阻尼,弹簧会变得更硬,但重力也会受到阻尼/摩擦的影响。所以粒子基本上是以“慢动作”下落的,具有高阻尼值。

如何编辑脚本,使弹簧更硬,但不影响重力?

编辑:我正在使用 glm 数学库进行计算。

编辑 2:如果将damping 更改为高值,例如0.9,您可以看到问题,因为粒子会很慢地受到重力影响。

【问题讨论】:

  • 目前回答您的问题需要太多的猜测。请填写tour,阅读How to Ask,然后填写minimal reproducible example
  • 你能否举出具体的例子来说明为什么它需要“太多猜测”,@Yunnosch?
  • 另外,阅读我提供的链接将真正帮助您利用这个社区为您带来好处。 (而且,你知道,我可以说你还没有阅读它们。)
  • 好的,我编辑了我的问题。

标签: c++ opengl glm-math particle-system rigid-bodies


【解决方案1】:

要将摩擦力限制为弹簧产生的力,请将 速度 矢量投影到弹簧的标准化方向,然后仅在该方向应用阻尼,即

 vec3 dampingForce = dot(velocity,normdir)*normdir*damping;

【讨论】:

  • 非常感谢@datenwolf!你是救生员!我刚刚开始学习编码物理。所以我查看了弹簧系统的不同实现。但是它们都没有将摩擦力限制为弹簧力,所以我很困惑。
  • @LennyWhite:这不是一个编程问题,而是一个数学和物理问题。假设我是一名训练有素的物理学家,所以这完全属于我的领域:)
  • 哇,没想到我会在这里找到真正的物理学家!但现在我终于有了一个工作弹簧接头!我还改变了它的用途来创建一个铰链接头。我使用了 30.0f 的k-value 和 0.9999f 的阻尼值。似乎也很好用!
  • 这不是还有符号错误吗?阻尼力应该与速度矢量相反,所以我希望在那里看到一个-(或者阻尼是一个负常数)。
  • @AdrianMcCarthy:OP 将负号应用到了两个下方,所以一切都很好。但是,是的,如果我们将所有相关的力转储到一个累积变量中,那么您必须将- 放在这里。
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2017-11-12
  • 2022-01-20
相关资源
最近更新 更多