抑制弹簧而不会影响重力
Damping a spring without affecting gravity
本文关键字:影响 更新时间:2023-10-16
i在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
,您可以看到问题,因为粒子会非常慢以受重力影响。
将摩擦限制为弹簧产生的力,在弹簧的归一化方向上投射 velocity 向量,然后仅在该方向上应用阻尼,即
vec3 dampingForce = dot(velocity,normdir)*normdir*damping;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 未达到的情况会影响开关外壳性能
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 模板如何影响C++中隐式声明的规则?
- 命名空间信息会影响C++的可读性
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 检查nullptr是否100%保护内存布局不受segfault影响
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- QSql查询行受影响的结果
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 是否有任何区域设置会影响宽字符编码?
- 使用"静态"如何影响我的代码速度?