您现在的位置:首页 >> 前端 >> 内容

形状属性

时间:2016/12/13 9:34:56 点击:

  核心提示:P2的形状属性P2所有形状都继承至Shape类,所以拥有一些共同属性,这些属性包含在Shape的构造函数中,具体如下:function Shape(optins:{position?:number[]...

P2的形状属性


P2所有形状都继承至Shape类,所以拥有一些共同属性,这些属性包含在Shape的构造函数中,具体如下:

    function Shape(optins:{
        position?:number[];
        angle?:number;
        collisionGroup?:number;
        collisionMask?:number;
        sensor?:boolean;
        collisionResponse?:boolean;
        type?:number;
        material?:Material;
    });

参数说明:

position:形状相对与刚体本地坐标中心的偏移量。这个偏移量会影响到刚体的重心位置

angle:形状在刚体本地坐标系统中倾斜的角度。

collisionGroup:碰撞分组,与接下来的collisionMask一起使用,限制当前形状只与指定条件的形状碰撞。

假设当前形状为si,要检测的形状为sj,那么collisionGroup 和collisionMask 属性实现形状之间的碰撞限制的原理,如以下代码:

    if(!(
        (si.collisionGroup & sj.collisionMask) !== 0 &&
        (sj.collisionGroup & si.collisionMask) !== 0 
    )){
        continue;
    }

大致过程是这样的。首先进行形状si的collisionGroup 和形状sj的collisionMask属性按位与运算,再进行形状sj的collisionGroup和形状si的collisionMask属性按位与运算,如果两个结果都不为0,则忽略此次碰撞检测,即si和sj不会发生碰撞。

因为是按位运算,所以在设置collisionGroup和collisionMask时候,最好设置成2的倍数。

sensor:设置形状是否为感应区域,默认为false。如果设置为true,则该形状不参与碰撞模拟,只作为感应区域,不过此时会正常触发碰撞事件,但不会生成ContactEquation(关于ContactEquation的内容,请参考“碰撞处理一节”)。

collisionResponse:当与其他刚体发生碰撞时,当前形状是否进行碰撞模拟,默认为true,如果collisionResponse为false,则碰撞发生时,当前形状不进行碰撞模拟,会穿过碰撞刚体,效果与sensor类似。但此时依然会发生碰撞事件,同时生成ContactEquation。

type:刚体类型,取值范围是Shape.CIRCLE 和 Shape.BOX等常量之一。我们不需要刻意设置此参数,子类形状会自动设置。

material:形状材质,1个Material对象。用来设置形状发生碰撞时,所表现出的相应特性,这些特性包括摩擦力、弹性系数等。

实际上,Material类中并不包含摩擦力、弹性系数等属性,它只是1个标识类,只是1个ID,而真正实现碰撞相应特性的是ContactMaterial类。

ContactMaterial类


ContactMaterial类,用来为添加了materialA和materialB标识的两个形状设置独特的碰撞相应特性。其构造函数如下:

    function ContactMaterial(
        materialA:Material,
        materialB:Material,
        options?:{
            friction:number;
            restitution:number;
            stiffness:number;
            relaxation:number;
            frictionStuffness:number;
            frictionRelaxation:number;
            surfaceVelocity:number; 
        }
    )

Tags:形状 状属 属性   
作者:网络 来源:zpab123的博客