代码之家  ›  专栏  ›  技术社区  ›  Robert Oschler Rob

模拟旋转球体因摩擦和重力而减速公式的简单代码示例?

  •  2
  • Robert Oschler Rob  · 技术社区  · 14 年前

    我有一个旋转球体,用户可以通过施加虚拟力来旋转,就像虚拟加速器一样。我想能够模拟一个很好的动量效应,这样当它们从加速器上起飞时,球会以一种自然和现实的方式,像是由于摩擦力和/或重力,以自然和现实的方式减速。我不想进入任何深层的物理方程式。我想做的很快,所以如果我能找到一个代码示例,显示如何做到这一点,甚至一页公式足够清楚,我可以编码,那就太好了。

    我想要一个公式,有一个或两个可调系数,我可以调整,使球减速更快或更慢取决于我的需要。我不想进入像开放源码物理库之类的沉重的东西。只是一些简单的事情。

    我使用的是Delphi 6 Pro,但我也知道C/C++、BASIC、Java和JavaScript。

    4 回复  |  直到 11 年前
        1
  •  2
  •   Birger    14 年前

    这是一段时间以前的事了,但是根据我的动力学研究书籍,球体的质量转动惯量定义为i=(2/5)m*r^2。m是质量,r是球体的半径(单位为si untis)。论 this page 你会找到一些例子,用质量转动惯量来计算由于施加负扭矩而引起的球体减速。这是摩擦的结果。由于你没有定义球体表面和周围的材料,你无法计算摩擦力,因此你必须自己选择一个好的力。

        2
  •  3
  •   sje397    14 年前

    速度是位移的变化。加速度是速度的变化。

    重力或摩擦只会引起加速度(可能是负的)。

    所以你所要做的就是在它们没有激活加速器的时候,施加一个负加速度。

    所以假设你有一个改变的角度。应用加速器会增加每次迭代或时间步长所改变的角度。如果你的角度是 t 你的角度变化叫做 dt (角速度)那么,当使用加速器时,你会得到:

    T+T+DT
    dt= dt+a

    在哪里? a 取决于多少钱 force 你在使用,或者他们“踩”了多少油门(也就是说,这是加速度)。

    你可能想限制dt(即旋转速度)-如果你只想朝一个方向旋转,你会得到一个正上限和一个0的下限。如果你想要两个方向,你可以有一个负下限和一个正上限。

    你只需要做 不使用加速器时的一些负数(如果dt为正数-make 正IF dt 为负),并确保不“包裹”(即当dt接近0时使dt为0)。

        3
  •  2
  •   Uwe Raabe    14 年前

    只要你不解决恒星的问题,我看不出重力与旋转减速有多大关系。

    摩擦几乎与当前的旋转速度成正比(实际上是球体表面的速度)。

    因此,当前旋转速度随时间w(t)的公式如下:

    w(t) = w0*exp(-c*(t - t0))
    

    其中t0是摩擦开始的时间,wt是当时的转速。 系数c>0决定速度下降的速度-C越高,速度下降的速度越快。此公式适用于所有t>=t0。

    注意,对于t=t0,exp函数返回1,得到初始速度,而对于t->exp函数(因此得到的速度)返回->0(C前面的减号保证了这一点)。

        4
  •  1
  •   Beta    14 年前

    你已经接受了一个答案,但我会把它写进去。

    我假设你已经知道如何使球体以恒定的速度旋转,以及如何使它在施加的扭矩下加速。使其减速只是施加另一个扭矩的问题,这个扭矩必须计算出来。

    当物体在固体表面上滑动时,减速率是恒定的。力的方向与运动方向相反,其大小取决于两个因素,但是 速度。当物体完全停止时,力就消失了。同样适用于在实心轴上转动的球体。

    当物体通过流体时,减速力随速度增加而增大,因此物体越快,阻力越大。当物体减速时,减速变弱,物体保持减速但从不停止。这描述了一个在空气或水中旋转的球体。在相当高的速度下,阻力与v成比例 在非常低的速度下,它与v成正比(我不知道这些域之间的转换)。

    所以我建议 T=-A 在哪里 W 是角速度。参数 摩擦强度,以及 描述减速的类型; =0就像固体支点上的摩擦力, =2就像在空气中旋转,并且 =1就像在糖浆中旋转。其他价值观 可能或可能看起来不现实或 现实主义。