刚体物理旋转

Rigid Body Physics Rotations

我想在 Java 中创建一个物理引擎。然而,这不是我所关心的代码。它只是刚体物理的数学运算,特别是力以及它们如何影响物体的旋转。

例如,我有一个边长相同的正方形。由于重力(无空气阻力),正方形将向地面加速。这意味着在正方形的每个点上都会有 (0,-9.8)m/s 的矢量力。

现在假设这个正方形稍微旋转了。当这个旋转的正方形与地面(平面)接触时,在接触点(很可能是正方形的一个角)将有一个脉冲速度矢量。然而,广场上其他角落的力量又会怎样呢?从最初的引力来看,它们是如何受到影响的?

如果我的问题不够详细,我深表歉意。我很想上传图表,但我还没有名声。

施加的力在接触脉冲的计算中不起作用,因为据说脉冲发生在比模拟时间步长小得多的时间尺度上。基本上,由于重力或其他力的影响,变化是速度可以忽略不计。

如果我没理解错的话,你担心正方形的不同角——一个有影响,三个没有。

但是,由于您想进行刚体动力学,将刚体视为具有质心(在本例中为正方形的中心)、位置、旋转和几何形状(在本例中是正方形,但它可以是任何东西)。

顶点的角相对于质心处于恒定位置和旋转 - 只有刚体的位置和旋转会同时改变世界中所有四个角的位置。这个视图的一个优点是它独立于几何体——你可以有 10 或 20 个角,方法是一样的。

关于计算旋转: 重力像以前一样工作。但是,您现在有了另一种力量(来自其作用时间的冲动)- 您必须将两者的影响相加才能获得系统的完整结果。

在您描述的情况下,冲量是由于其中一个角发生碰撞。它必须在接触点计算,接触法线 - 在这种情况下是平面的法线。

如果法线指向与质心不同的方向,这将导致旋转(以及位置变化)。

位置变化量取决于您如何建模接触计算和分辨率、material 属性、数值步进器、冲击速度、时间步长……

正如其他人提到的,阅读物理(刚体动力学)和物理模拟可能是更好地理解这些概念的良好起点。

  1. 旋转是动能的形式

    首先类比运动

    • alpha - angular 位置 [rad]
    • omega - angular 速度 [rad/s]
    • epsilon - angular 加速度 [rad/s^2]
    • alpha(t)/(dt^2)=omega(t)/dt=epsilon(t)

    现在惯性

    • I - 二次旋转质量惯性 [kg.m^2]
    • m - 质量 [kg]
    • M - 扭矩 [N.m]

    和一些要利用的方程

    1. M=epsilon*I - 实现加速所需的扭矩,反之亦然[N.m]
    2. acc=epsilon*radius - 周界加速度[m/s^2]
    3. vel=omega*radius - 圆周速度[m/s^2]

    方程#1 可用于直接计算力。方程#2、#3 可用于计算基于摩擦的力,例如车轮 grip/drag。不要忘记动能Ek=0.5*m*vel^2+0.5*I*omega^2,这样你就可以利用能量守恒定律。

  2. object1object2 连续接触的过程中发生这种情况

    周边 speed/acceleration 产生相互作用力,这会减慢 object2 的旋转速度,从而在 object2 上产生阻力并在 object1 上产生反作用力。

    如果 object1 不固定,那么这个力也会产生扭矩并旋转 object1

    如果旋转突然被迫停止那么所有旋转部分的动能都转移到碰撞反作用力脉冲。

    如果对象处于更复杂的旋转运动中,那么您应该计算实际的旋转轴和 alpha,omega,epsilon 并使用它,因为对象可以旋转更多的旋转,每个旋转具有不同的旋转中心。

    此外,如果物体正在旋转并且在不同的轴上应用了另一个旋转,那么这会产生陀螺扭矩,从而在垂直于两者的第三轴上产生旋转。

    所以当你把所有这些放在一起时,你就会知道你需要什么样的结构。如果没有关于模拟的结构和属性的更多信息,抱歉不能比这更具体...