编写简单的 2D 物理引擎的时候遇到了点问题

abcdabcd987
  • 71

我最近在写一个非常简单的2D物理引擎,大概就是支持球和球、球和墙壁的弹性碰撞,但是目前遇到了几个问题。先说下我的实现方法吧。每个球记录下 (pos, vel, acc) 三个向量,然后每一帧 vel += acc; pos += vel;。碰撞的话,发现两个物体重叠,就用弹性碰撞的公式重新计算物体的速度向量。目前加速度还取的是0。

现在遇到了三个问题:

两个球相撞的时候,有可能会纠缠在一起。这个原因我还是知道的,万一下一帧的时候球依然重叠,那么就会再一次重新计算速度向量,于是乎就纠缠在一起了。我试过打一个标记,表示这个球刚刚撞完,然后等这个球不和别的物体重叠了之后,再把这个标记清除掉。然而这样做的话,在几个球相撞的时候就会出问题。

还有,有的球撞着撞着速度变快了之后,直接从墙壁穿出去了……

另外,我对加上一个重力场表示很疑惑,不知道怎么实现。我尝试设置每个球的加速度向量,然后出现了两个严重的问题。一是球跳起来的高度越来越低,最后就贴在下边界上了。二是球贴在下边界上之后,速度依然会增加,于是当速度足够大的时候就飞出下边界了。我在想是不是应该引入力的表示??

我实在是没有游戏编程的经验,求各位前辈指点一下,说说这些情况怎么解决,或者是应该看看什么资料?谢谢!

btw 目前的失败演示: http://lab.abcdabcd987.com/playground/bouncing_air2/

回复
阅读 3.4k
2 个回答
u_unyxi
  • 2
新手上路,请多包涵
雖然我只是一個高中生,不過我有在這方面的一點點經驗(某次上課偷偷玩電腦,
就寫了個像你這樣的物理引擎,花了我前前後後三個小時,還只支持矩形),所
以即使過去一年了,我還是想來消滅這個零回覆。
你最大的問題在於,檢測到相交之後只是改變了速度方向,導致陷入其中,‘球
跳起来的高度越来越低’,這很好理解嘛:陷進去了,回彈速度還與碰撞速度一
樣,i.e. 勢能減小,動能未變,總機械能減小。其它問題也大抵如此,我也遇
到過。
但是解決的方法異常簡單:將碰撞的物體移出相交的物體(沿着速度反方向移動,
保證不相交爲止),再改變速度方向。這樣就變成了剛體碰撞(即完全彈性碰撞)
了。OK,All is well.
問題的關鍵在於,彈性碰撞公式不能用於存在形變的情況(陷入就是形變),只
要沒有陷入,一切問題都解決。
phenomLi
  • 1
新手上路,请多包涵

首先你要处理相交的问题。然后你说到球的速度会越来越快,这个应该是你设计出了问题,即使忽略摩擦力,球的速度最多也就不变,怎么会越来越快呢,我想是你没有在每一帧完成后把球的加速度清零。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏