我正在用JavaScript编写2D物理引擎,以便可以了解有关视频游戏中物理的更多信息。我可以使它在刚体碰撞中正常工作,除非任何物体同时与两个或多个其他物体碰撞。
目前,对于每对碰撞体(A,B),我会根据碰撞冲量来修改它们的速度和角速度,并将它们相互推开,以使它们不会穿透。但是,对于涉及A的其他碰撞,碰撞检测和脉冲计算将是错误的。
我可以探索什么方法来使我的引擎针对3个以上的对象相互碰撞而工作?
我正在用JavaScript编写2D物理引擎,以便可以了解有关视频游戏中物理的更多信息。我可以使它在刚体碰撞中正常工作,除非任何物体同时与两个或多个其他物体碰撞。
目前,对于每对碰撞体(A,B),我会根据碰撞冲量来修改它们的速度和角速度,并将它们相互推开,以使它们不会穿透。但是,对于涉及A的其他碰撞,碰撞检测和脉冲计算将是错误的。
我可以探索什么方法来使我的引擎针对3个以上的对象相互碰撞而工作?
Answers:
我使用以下方法(类似于Tonge的质量拆分算法http://www.richardtonge.com/):
m_A/M
为B并将B 的质量暂时设置为m_B/N
m_A = m_A * M
和m_B = m_B * N
)中指定为当事方的所有物体的质量这种方法类似于Jacobi迭代算法与线性联立方程组一起工作的方式。它并不能保证收敛,但是在我的模拟器中它可以非常顺利地完成工作。.在3D中(是的,额外的尺寸会增加两倍的难度!)。
注意:只有在碰撞检测/处理阶段结束后才能正确定位位置和速度!这样,您就可以同时更新碰撞的演员。此外,下次整合位置和速度时,必须考虑恢复原动力。
编辑:好吧,我想您正在使用已经滥用的Verlet集成方法(这已成为gamedev爱好者的家喻户晓的名字)。在这种冲突处理和集成的幽灵中,您可能想在这里看看。
更新:可以在以下论文中找到一些有关如何进行碰撞(实际上是自碰撞)的信息:
通过基于脉冲的方法解决刚体碰撞的简单文章:http : //web.archive.org/web/20060925200136/http : //i31www.ira.uka.de/docs/PaperFinal.pdf
我提出的方法远不是最初的贡献,很多游戏使用它的效果似乎都是合理的,Jakobsen最好在他的Hitman游戏引擎中采用这种方法。
根据一些实际经验,当来自碰撞物体的其他力设法大于它们时,惩罚力(类似于线性或指数弹簧从穿透距离获取输入)不能正确解决穿透。这就是为什么我选择组合三种(几乎是多余的)方法的原因:牛顿反作用力(推壁,壁推回),脉冲推导的速度(斯诺克球碰撞)和非自然的“使几何体相互远离解决方案。他们在一起似乎可以提供一切:摆脱大多数从长远来看,相互穿透的物体很丑陋,碰撞的物体往往会相互影响(由于恢复速度和作用力-至少抵消了在碰撞情况下趋向于拖拽物体的力,并且物体彼此弹开了) 。最后,为了进一步理解这些简单但通用的概念,我建议分析这些幻灯片。
我描述Verlet集成步骤的“滥用方法”的用语是针对一种普遍的文化信念,即这是集成方法的圣杯。它仅比其辛欧拉表亲(也被某些半隐式欧拉称呼)堂兄更好。存在更复杂的集成方法的方式(并且所有方法都具有隐式名称)。强大的游戏引擎可以使用它们,但是独立开发人员没有时间去尝试这些功能,因为Verlet在调整到特定场景后确实能带来奇迹。同样,绝对没有一种可以在没有一点作弊的情况下处理严格约束的集成方法(找不到链接,但是我要引用的论文应该称为“ X.Provot-”变形约束刚性布行为的弹簧模型”
我已经分析了一组碰撞体的脉冲方程。我面临的唯一问题是缺少变量来查找组中各个联系人之间的相对交互强度,而我已经充满了实体交点的深度。
组联系人的解决方案比单触点难得多。不幸的是,我丢失了一份包含计算结果的论文,因此无法在此处共享。
编辑:可能我想出了这样的东西/physics/296767/multiple-colliding-balls