需要关于圆形碰撞和旋转的帮助吗?- 游戏物理学

15

好的,我有一堆球:

Ignight Balls


我正在尝试弄清楚如何使这些圆:

  • 根据它们接触的表面旋转

  • 在处理多个接触对象时,修复碰撞穿透。


编辑: 这就是我所说的旋转

alt text

  • Ball 0 倾斜在 Ball 3 上时会逆时针旋转

  • Ball 5 倾斜在Ball 0 上时会顺时针旋转


虽然解决方法是通用的,但仅供记录,我正在使用JavaScript和SVG,并且更喜欢自己实现而不是使用库。

非常感谢您的帮助。谢谢!:)


我不确定我理解你所说的第一条要点。你能详细说明一下吗? - duffymo
1
如果球0掉落并撞到球3,它将逆时针旋转,我认为这就是他的意思。 - Harmen
谢谢bpowah!我想我已经解决了这个问题,稍后我会更新我的答案,并附上一张图片展示我所想到的! :) - RadiantHex
RadiantHex,你很出色,想聊天吗? - ONYX
获取法线,然后在碰撞中获得新的线性速度后,角速度=法线叉乘线性速度/半径。 - user2039981
显示剩余2条评论
3个回答

6

从物理学角度来看,您想要保守线性和角动量momentum

作为起点,您需要建立模拟这两个方面的ODE矩阵,然后进行一些线性代数运算来解决它们。我个人会使用Numpy/Scipy(可能使用稀疏数组)来进行求解。但是还有许多方法(例如sympy)。您想要使用哪些模块?

您需要熟悉coefficient of restitutioncoefficient of friction,并决定是否也要保留动能。(您是否希望/关心它们永远弹跳和滚动?)(您可能还需要能量矩阵)

你将在每个时间步骤解决这些矩阵,同时检查没有两个球心距离小于两个半径之和的条件。(如果确实如此,您需要调整动量和能量术语以满足碰撞后的条件)
这只是一个大项目的最基本的开始。我可以问一下为什么你想从头开始做这个吗?

嗨,bpowah。谢谢。我已经实现了你提到的部分。但是当多个对象彼此接触时,在穿透期间固定obj坐标方面遇到了困难。而且我不知道如何让objs进行“概念性”旋转。 - RadiantHex
我不确定你所说的“在穿透期间修复对象坐标”确切含义。我可以安全地假设您可以在保持所有动量项守恒的同时解决每个球在时间步长结束时的位置吗?如果是这样,那么您得到的结果与您想要的有何不同? - Paul
他可能的意思是,在给定的时间步长之后,许多球体可以相互穿透,并且他很难解决这个问题。我已经离开物理/游戏领域有两年了,但我记得可以使用“松弛”(relaxation)这个术语相对容易地解决它。基本上,在每个步骤的结束时,您将每一对物体分开,并迭代一定数量的步骤或直到穿透小于某个阈值为止。但我可能在这里忘记了一些“怪癖”。 - Tomasz Zieliński

6

以下是我认为会对你的探索有所帮助的一些链接:

Box2D

高级角色物理学

Javascript球模拟

Box2D有你需要的东西,而且我相信它是开源的。你可以下载文件并查看它们如何做到达到你想要的效果。

如果这有帮助,请让我知道,我正在努力回答这里的问题。 :)

编辑:

所以我继续思考了一下,以便给出一些我的方法。请看下面的图片:

基本上,比较网格上的角度,如果球下落与其所在的球相比增加了30度,则正向旋转球。如果它下落与其所在的球相比减少了30度,则负向旋转球。我并不是说这是正确的解决方案,但只是考虑一下,这是我一开始解决问题的方式。

alt text


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接