偶尔搜到
网游中的物理
作者: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)针对干涉进行特别处理:
这步即使是作者采用了大量的近似,但是collision始终是物理仿真中的重点难点,因为不仅要测出
干涉点而且要对干涉进行处理,例如下面的简单的穿刺深度的处理。
d) 添加输入参数对系统受力的影响
将enum input 控制量转换为 受力。
3)对以上量运用RK方法积分计算出当前时刻的状态