经典的物理游戏如:愤怒的小鸟,小鳄鱼顽皮爱洗澡等,都是用物理系统制作。
2D物理引擎由刚体和碰撞体以及关节构成。
当物体包含碰撞体的时候物体可以发生碰撞,当物体含有碰撞体不含有刚体的时候可以被碰撞但不发生物理运动学动力影响
开发者可以不用关心物体是怎么碰撞的,laya引擎底层已经帮我们做好,开发者只要给想要做碰撞的物体挂上相应的碰撞体以及刚体组件即可。
刚体rigidbody :刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体,比如模拟铅球,石头等。
碰撞体collider:碰撞体是给物体加一个判定框,当碰撞框重叠的时候,两物体发生碰撞,这是碰撞的检测区域。
关节joint: 关节可以对两个或多个物体进行一种约束,可选。
Laya 2D物理引擎支持的关节有:
- 距离关节DistanceJoint:两个物体上面各自有一点,两点之间的距离固定不变。
- 齿轮关节GearJoint:用来模拟两个齿轮间的约束关系,齿轮旋转时,产生的动量有两种输出方式,一种是齿轮本身的角速度,另一种是齿轮表面的线速度。
- 马达关节MotorJoint:用来限制两个刚体,使其相对位置和角度保持不变,马达关节永远向目标点移动,并且保持特定的角度。
- 鼠标关节MouseJoint:用于鼠标操控物体。它试图将物体拖向当前鼠标光标的位置。而在旋转方面就没有限制。
- 平移关节PrismaticJoint : 移动关节允许两个物体沿指定轴相对移动,它会阻止相对旋转。
- 滑轮关节PulleyJoint:它将两个物体接地(ground)并彼此连接,当一个物体上升,另一个物体就会下降。
- 旋转关节RevoluteJiont:强制两个物体共享一个锚点,两个物体相对旋转。
- 绳索关节RopeJoint :限制两个点之间的最大距离。即使在很大的负载下也阻止连接的物体之间的拉伸。
- 焊接关节WeldJoint:使两个物体不能相对运动,两个刚体的相对位置和角度都保持不变,像一个整体。
- 轮子关节WheelJoint:围绕节点旋转,包含弹性属性,使得刚体在节点位置发生弹性偏移。
刚体RigidBody
RigidBody类继承自 Component,刚体支持三种类型:static,dynamic和kinematic,默认为dynamic。
- static为静态类型,静止不动,不受重力影响,质量无限大,可以通过节点移动,旋转,缩放进行控制;
在模拟环境下静态物体是不会移动的,就好像有无限大的质量。在Box2D的内部会将质量至反,存储为零。静态物体有零速度。静态物体不能和其它静态或运动学物体进行碰撞。 - dynamic为动态类型,受重力影响;
动态物体可以进行全模拟。它们可以被用户手动移动,但是通常情况下会根据受力进行移动。动态物体可以和任何物体发生碰撞。动态物体总是拥有有限的非零质量。如果你尝试设置动态物体的质量为零,它会自动设置一个1千克质量的物体。 - kinematic为运动类型,不受重力影响,可以通过施加速度或者力的方式使其运动。
属性说明
1)gravityScale
重力缩放系数,默认为1,即正常重力,设置为0为没有重力。
2)angularVelocity
角速度,设置会导致旋转,单位为弧度,实际使用中需要约束。
3)angularDampin
旋转速度阻尼系数,范围从0到无穷大,0表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在0到0.1之间。
4)linearVelocity
线性运动速度,需要输入向量,比如10,10,代表x轴向右速度10,y轴向下速度10。
5)linearDamping
线性速度阻尼系数,范围从0到无穷大,0表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在0到0.1之间。
6)bullet
是否高速移动的物体,设置为true,可以防止高速穿透。
7)allowSleep
是否允许休眠,允许休眠能提高性能,这个一般都要设置为true
8)allowRotation
是否允许旋转,如果不希望刚体旋转,这设置为false。
9)group
指定了该主体所属的碰撞组,默认为0.
碰撞体Collider
碰撞体类型分为以下4种:
- 矩形碰撞体
- 圆形碰撞体
- 线形碰撞体
- 多边形碰撞体
基类共有属性说明
1)x,y
相对节点x,y轴偏移。
2)friction
摩擦力,取值范围0-1,值越大,摩擦越大,默认值为0.2。
3)restitution
弹性系数,取值范围0-1,值越大,弹性越大,默认值为0。
4)density
密度值,值可以为零或者是正数,建议使用相似的密度,这样做可以改善堆叠稳定性,默认值为10。
5)isSensor
是否是传感器,传感器能够触发碰撞事件,但不会产生碰撞反应。可以理解为Trigger。
6)label
自定义标签
矩形碰撞体
属性说明
1)width,height
矩形的宽度和高度。
2)fitsize按钮
点一下这个按钮,碰撞体的大小就会自适应为节点宽高。
圆形碰撞体
radius
圆的半径,必须为正数。
线形碰撞体
points
用逗号隔开的点的集合,格式:x,y,x,y … 设置点之后,从第一个点依次连接到最后一个点的连线即为线形碰撞体。在编辑器中,在线上单击左键增加一个点,点可以拖拽,双击点会删除这个点。
多边形碰撞体
points
用逗号隔开的点的集合,格式:x,y,x,y ..
2D多边形碰撞体,暂时不支持凹多边形,如果是凹多边形,先手动拆分为多个凸多边形
节点个数最多是b2_maxPolygonVertices,这数值默认是8,所以点的数量不建议超过8个。