单立方体简单的动力学

来源:互联网 发布:现金贷系统源码 编辑:程序博客网 时间:2024/06/02 13:06


偶尔搜到

网游中的物理

作者:Glenn Fiedler

译者:trcj

原文:http://gafferongames.com/game-physics/networked-physics/

这按文章

好奇cubic 的物理仿真

 

代码在上文中已经给出。

本文只是对cubic物理仿真分析,和其事件处理

 

可能作者认为这个是demo所以代代码比较随意,很多全局变量,然后整个也没有pimpl只是.h 所组织起来

 

动力学场景:

是一个有六个面包围的房间里中的一个立方体的性质,支持输入参数,例如

enum input{  front   back  left  right   jump}


以上6个参数在内部物理状态的计算中均转换为相应的受力,

支持重力,damp, friction,

并且系统在damp 和 friction 的形象下,逐渐产生能量转换,

动能转换为内能耗散掉,所以停止外界输入,系统将趋于静止。

作者讲由于用了简单的积分计算,所以cube 看起来具有点弹性。

 

 

代码物理部分是用RK积分方法做处理,这种方法的优点是精度很高作者做到了O(5),其实本质上多做几次分割。

下面给出自己的理解对应的代码,

 

cubic 状态量

包含:

struct state{/// 主要的物理状态        Vector position;                ///< cube 质心的世界坐标 (unit meters)        Vector momentum;                ///< cube 的动量 (unit kg*m/s)        Quaternion orientation;         ///< cube 的指向 使用一个单位四元数表示        Vector angularMomentum;         ///< cube 角动量        // 计算时作为备份        Vector velocity;                ///< velocity in meters per second (calculated from momentum).        Quaternion spin;                ///< cube 指向的变化率        Vector angularVelocity;         ///< cube 的角速度        Matrix bodyToWorld;             ///< cube 的局部到世界变换矩阵        Matrix worldToBody;             ///< cube 的世界到局部变换矩阵        /// constant state        float size;                     ///< cube 的边长        float mass;                     ///< cube 的质量 (unit kg)        float inverseMass;              ///< cube 的质量分之一,用来计算动量*inverseMass = velocity        float inertiaTensor;            ///< cube 的惯量张量,(这里因为是cube 所以简化为常量)        float inverseInertiaTensor;     ///< cube 的惯量张量分之一, (用来计算角速度)}


 大步骤分三步

1) 计算time step 的 state

        current state += Derivative * time step

       相对比较简单

2) 计算在积分好的 state 的受力情况,也就是计算出新的受力

       这不相对来讲比较麻烦,针对约束,要进行处理

      a)作者简单的对 cube 于 房屋的六个面进行碰撞干涉检查

      b)针对干涉进行特别处理:

  •             添加重力gravity (常量)
  •             添加阻尼,作者采用常量线性阻尼,所以在给出的demo中表现为阻尼过重。
  •             计算torque torque改变 cube的角速度。(gravity 对torque没有贡献,因为其合作用在质心)

                 这步即使是作者采用了大量的近似,但是collision始终是物理仿真中的重点难点,因为不仅要测出

                干涉点而且要对干涉进行处理,例如下面的简单的穿刺深度的处理。

    • 首先计算出穿刺深度,即cube 顶点所在的位置与房间六个面的关系
    • 相对速度关系
    • 穿刺补偿受力(与穿刺深度成正比,方向为平面的法相)
    • 扭矩torque 为 1)点摩擦受力与切向速度成正比 + 2)穿刺补偿力力矩 + 3)阻尼力矩???

                  

         d)  添加输入参数对系统受力的影响

              将enum input 控制量转换为 受力。

3)对以上量运用RK方法积分计算出当前时刻的状态