如何计算由反弹摩擦引起的旋转?


15

接下来是我的上一个问题:我很实际地将球从击中的表面弹起。现在我想使它从打击的摩擦中旋转

演示起来很简单:我在每个刻度上以球的角速度旋转球,并在渲染时应用相同的旋转。

当球撞到墙壁时,我知道旋转速度受...

  • 击球时球的初始速度
  • 球与表面的摩擦系数(物理常数)
  • 入射角(球的进向速度矢量与表面法线之间的角度)。

入射角由球的撞击速度和出口速度向量的点积近似得出。(1表示高自旋,-1表示无自旋,其他所有相对而言)

将以上所有内容相乘,并确保将它们转换为0-1,然后乘以最大旋转速度,球似乎在旋转速度方面达到了预期。除了一件事:它总是沿顺时针方向旋转(因为正值)。


这是个好方法吗?您能想到一个更简单的方法吗?

如果此方法看起来不错,我会缺少什么?我怎么知道什么时候球应该逆时针旋转?

Answers:


2

您的方法很不错,因为它非常简单。您可能需要做的一件事是依赖球的先前旋转,而无需考虑这一点。旋转的球代表旋转能量,因此实际的仿真可能必须与其他能量一起保存。

但是,如果球在撞击时没有旋转,那么我将无法想象它会开始逆着入射角方向旋转。也就是说,“顺时针”或“逆时针”应相对于法线入射角的任一侧。

我认为只需将结果乘以原始x方向向量(如果从左向右移动,则为+1,如果从右向左移动,则为-1)即可。

编辑:您可以为此使用叉积。Incident cross normal仅在Z方向上提供矢量(如果我们在2D xy平面上)。看一下z元素:如果它是正数,则球的逼近应该使它顺时针旋转。如果为负,则球应逆时针旋转。


嘿eli首先,我考虑到了球的原始旋转,只是忘了在我的帖子中提及它。其次,我认为x方向系统不起作用。我试过了,但如果球从下面走左边打面,在x载体将是-1,那岂不是逆时针旋转,而在现实中,它应该按顺时针方向旋转
codemonkey

您如何考虑球的原始旋转?如果旋转速度非常快,它可能会朝完全不同的方向发射。在您的情况下,点积的问题在于它使用余弦(偶数函数)。您还需要其他一些设置矢量之间关系的符号(入射和法线)。为此,可以使用叉积(矢量积)。我已经编辑了答案,以包含跨产品方法。
eli

我喜欢编辑后重新阅读答案。尝试了一下,效果很好。关于原始旋转,我只是在谈论逐渐改变旋转...至于影响出口矢量的原始旋转,那是我的下一步:)
codemonkey 2010年

哎呀,编辑是我建议的三种不同解决方案之一,并且我解释了为什么必须这样做(点仅给出幅度,而不是角度方向)。guess,我猜应该更简洁一些。
Kaj 2010年

对不起,那个kaj,它让我溜走了……没有冒犯的意图:)
codemonkey

3

首先从表面法线获取表面切线:t =(ny,-nx)

然后,您可以得到沿表面的速度分量vt = v dot t

现在,您可以计算球的旋转:w = |(normal * r)cross vt |,其中r是球的半径。

在这里,我假设球没有旋转惯性,并开始以其沿表面滚动的速度立即旋转。您可以使用摩擦系数使其更逼真,并且,如果需要,可以考虑球的旋转惯性。


感谢您的回答Danik。我已经在考虑球的旋转惯性(通过将球添加到新的旋转中)以及表面的摩擦力作为要乘以总旋转速度的系数。摩擦力越大,旋转速度越高,对吗?
codemonkey 2010年

2

Ó好吧,这听起来可能很愚蠢,但是您没有使用球矢量和表面法线的点积,而只是通过arccos来计算角度是吗?因为当余弦在0周围对称时,该角度无论是正(最大90度)还是负(同上)都将为正。
如果这种情况,则不要使用平面法线,而应使用平面方向本身从角度减去90度,因此0到180会变成-90到+90度(如果您是径向倾斜的,则从-half PI到+ half PI)。


好吧,考虑这种情况:x + ve是正确的,y + ive是向下的;表面向量S =(1,0); 我们有两个冲击速度矢量V1 =(3,4)从上方击中,应顺时针旋转球&V2 =(3,-4)从下方击中,应逆时针旋转球。现在两个向量的法线分别为(3 / 5,4 / 5)和(3/5,-4 / 5)。现在两个向量的点积将为3/5。对于两个向量,生成的角度均为arccos(3/5)= 53度。这是正确的,但相反!因此,如果我使用此方法,则仍然会导致两者都沿顺时针方向旋转。看到我的困境?
codemonkey

3种可能的解决方案。1)不要使用法线,而是使用侧面的方向,并如上所述减去90度。2)通过交换法线的x和y并将其取反(乘以-1)来模拟相同的内容。3)将角度乘以两个向量的叉积的符号,因为叉积表示角度的正弦,该角度在0度附近不是对称的。
Kaj 2010年

点积不会给您角度,只是角度的大小,您还需要角度的方向。上面的所有3种方法都使用正弦模拟给您侧面。您也可以使用基本触发来获取角度。Sinα=相对的边长/倾斜的边长(基于在相对边和倾斜边之间成90度角的三角形)。那和毕达哥拉斯来计算边的长度就可以了。
Kaj 2010年

顺便说一句,重读我的原始答案,因为它确实解决了难题,方法是与平面而不是法线取角度并减去90度。
Kaj 2010年

0

您需要解决的第一件事是在撞到墙壁之前先旋转或旋转。可以说Si;Ss表示大于,等于或小于击中后保持相同旋转所需的值。这样,您可以利用球与曲面之间的摩擦值获得击打旋转后的实际值,例如Se

获得越过弹跳表面的速度分量Vxi = Vi点Vx,即Vx与大小为1的表面的平行向量。

您正在寻找的值是Ss = Vxi / r,这是将Vxi转换为角速度。如果Si低于Ss,则球应正旋转。如果Si等于Ss,则球应保持大约相同的旋转度,大约在此之后。如果Si大于Ss,则球应失去旋转

速度的损失和增加取决于摩擦值Fr。实际上,它是半径与热摩擦力之间的一个十字,但是您可以根据需要设置该值。

您还必须注意,除了弹跳小球以外,由于球与表面之间的摩擦,球还损失了一些能量,因此Vxi受到负面影响。我会说弹跳球会影响Vy,而摩擦会影响Vx。

您应考虑到球的变形。这将影响球粘附在墙上的时间或帧,因此,摩擦力将施加更长的时间,从而影响旋转速度和退出速度。这种变形取决于您要模型的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.