精通Cocos2d-x游戏开发(进阶卷)
上QQ阅读APP看书,第一时间看更新

10.1 物体的运动

前面讲解了刚体以及关节,知道了它们在被动地受到重力或者马达的作用下,会产生相应的物理效果,那么如何主动来控制物体的运动呢?

对于关节,可以用设置马达的方式,马达来驱动关节运动,而对于刚体,可以通过施加力或者冲量来使其移动,施加角力矩或者角冲量来使其旋转等,听起来很厉害,但本质上都是一些比较简单的东西,放到代码中实现就更简单了。

10.1.1 施加力和冲量

对一个物体施加力,可以通过下面两个函数来实现,ApplyForce第一个参数决定物体运动的方向,单位是牛顿,而第二个参数,决定物体受力点的位置,假设受力点不在物体上,也是有效的,效果如图10-1所示,蓝色的受力点在物体外部,当对其施加一个向上的力时,可以将受力点认为是在正方形的右上角,为物体施加力就像在推动一个物体一样。

图10-1 施加力

        ///为物体的point点施加一个方向为force的力,point是世界坐标
        void ApplyForce(const b2Vec2& force, const b2Vec2& point);

        ///对物体的中心点施加一个方向为force的力
        void ApplyForceToCenter(const b2Vec2& force);

对一个物体施加一个冲量可以用下面的ApplyLinearImpulse()函数来实现,第一个参数也是一个力的向量,这个向量的单位是kg·m/s。物体质量越大,运动的速度会越慢,而为物体施加一个冲量,等于直接赋给物体一个速度,在施加一个很大的冲量的时候,物体会一下子冲出去,然后在摩擦、重力、碰撞的影响下,慢慢衰减下来,就像突然使用了极品飞车的加速氮气一样。

        ///在point上施加向量为impulse的冲量,冲量的单位是kg·m/s
        void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point);

对比力和冲量,对物体施加力需要通过力来摆脱物体的静摩擦力,然后慢慢加速,而冲量则是可以直接对物体赋予一个速度。两种施力的力量参数的单位是不一样的,但受力点的意义一样,不同的受力点会在受力过程中,对物体产生不同的旋转。

10.1.2 角力矩和角冲量

使用下面的函数可以为物体施加一个角力矩和角冲量,当传入一个正数时,物体会在逆时针方向上自转,而传入一个负数时,物体在顺时针方向上自转。传入的参数越大,并且物体质量越小,转动越快。从本质上讲,角力矩相当于上面的施加力,而角冲量则是直接赋予物体角速度。施加角力矩,物体会慢慢运动起来,就像掷链球一样,把链球拉起来,慢慢转圈。而施加角冲量,可以让物体瞬间高速旋转。在没有收到其他力的作用下,旋转的物体并不会产生移动。

        ///施加一个角力矩,让物体根据穿过质点的z轴进行旋转
        void ApplyTorque(float32 torque);

        ///为物体施加一个角冲量,单位是kg·m/s
        void ApplyAngularImpulse(float32 impulse);