API Docs for: 0.7.1
Show:

World Class

Extends EventEmitter
Defined in: src/world/World.js:35

刚体和约束所活动的动态世界

构造器

World

(
  • [options]
)

参数:

  • [options] Object 可选
    • [solver] Solver 可选

      默认为 GSSolver.

    • [gravity] Array 可选

      默认为 y=-9.78.

    • [broadphase] Broadphase 可选

      默认为 SAPBroadphase

    • [islandSplit=true] Boolean 可选

Example:

var world = new World({
            gravity: [0, -10],
            broadphase: new SAPBroadphase()
        });
        world.addBody(new Body());
        

Methods

addBody

(
  • body
)

将一个刚体添加到模拟中

参数:

Example:

var world = new World(),
    body = new Body();
world.addBody(body);

addConstraint

(
  • constraint
)

将一个约束添加到模拟中

参数:

Example:

var constraint = new LockConstraint(bodyA, bodyB);
world.addConstraint(constraint);

addContactMaterial

(
  • contactMaterial
)

将一个碰撞材质添加到模拟中

参数:

addSpring

(
  • spring
)

将一个弹簧添加到模拟中

参数:

clear

()

重启世界,移除所有刚体、约束和弹簧

disableBodyCollision

(
  • bodyA
  • bodyB
)

禁用两个刚体间的碰撞

参数:

emit

(
  • event
)
EventEmitter

触发一个事件

参数:

  • event Object
    • type String

Returns:

EventEmitter:

自身,用于链式调用

enableBodyCollision

(
  • bodyA
  • bodyB
)

启用两个刚体间的碰撞

参数:

getBodyById

(
  • id
)
Body

根据id获取刚体

参数:

  • id Number

Returns:

Body:

找到的刚体,如果没找到返回false

getContactMaterial

(
  • materialA
  • materialB
)
ContactMaterial

返回两个材质的碰撞材质

参数:

Returns:

ContactMaterial:

匹配的碰撞材质,如果失败返回false

has

(
  • type
  • listener
)
Boolean

检查这一事件监听器是否添加

参数:

  • type String
  • listener Function

Returns:

Boolean:

hitTest

(
  • worldPoint
  • bodies
  • precision
)
Array

检测是否该点与刚体重合

参数:

  • worldPoint Array

    用于检测重合的点

  • bodies Array

    用于检测重合的刚体列表

  • precision Number

    用于匹配粒子和线,添加一些边距在这些无穷小的物体上

Returns:

Array:

与该点碰撞的所有刚体

internalStep

(
  • dt
)
private

Make a fixed step.

参数:

  • dt Number

off

(
  • type
  • listener
)
EventEmitter

移除这一事件监听器

参数:

  • type String
  • listener Function

Returns:

EventEmitter:

自身,用于链式调用

on

(
  • type
  • listener
)
EventEmitter

添加一个事件监听器

参数:

  • type String
  • listener Function

Returns:

EventEmitter:

自身,用于链式调用

raycast

(
  • result
  • ray
)
Boolean

物理世界中被射线投射到的所有刚体

参数:

Returns:

Boolean:

如果刚体被击中则为true

Example:

var ray = new Ray({
    mode: Ray.CLOSEST, // or ANY
    from: [0, 0],
    to: [10, 0],
});
var result = new RaycastResult();
world.raycast(result, ray);

// Get the hit point
var hitPoint = vec2.create();
result.getHitPoint(hitPoint, ray);
console.log('Hit point: ', hitPoint[0], hitPoint[1], ' at distance ' + result.getHitDistance(ray));
var ray = new Ray({
    mode: Ray.ALL,
    from: [0, 0],
    to: [10, 0],
    callback: function(result){

        // Print some info about the hit
        console.log('Hit body and shape: ', result.body, result.shape);

        // Get the hit point
        var hitPoint = vec2.create();
        result.getHitPoint(hitPoint, ray);
        console.log('Hit point: ', hitPoint[0], hitPoint[1], ' at distance ' + result.getHitDistance(ray));

        // If you are happy with the hits you got this far, you can stop the traversal here:
        result.stop();
    }
});
var result = new RaycastResult();
world.raycast(result, ray);

removeBody

(
  • body
)

从模拟中移除所有刚体,如果该方法在step()中被调用,刚体的移除将在步进后调用

参数:

removeConstraint

(
  • constraint
)

移除一个约束

参数:

removeContactMaterial

(
  • cm
)

移除一个碰撞材质

参数:

removeSpring

(
  • spring
)

移除一个弹簧

参数:

runNarrowphase

(
  • np
  • bi
  • si
  • xi
  • ai
  • bj
  • sj
  • xj
  • aj
  • mu
)

为形状i 和 j执行细测.

参数:

setGlobalRelaxation

(
  • relaxation
)

为所有方程和碰撞材质设置弛豫度

参数:

  • relaxation Number

setGlobalStiffness

(
  • stiffness
)

为所有方程和碰撞材质设置刚度

参数:

  • stiffness Number

step

(
  • dt
  • [timeSinceLastCalled=0]
  • [maxSubSteps=10]
)

沿着时间推进世界

有两种模式,简单的模式是不插值的固定步进,在这种情况下你只使用第一个参数。第二种情况用了插值,在这种情况下,你可以提供从上次调用函数到现在所花的时间,也可以提供最大步进数

参数:

  • dt Number

    使用的固定步进

  • [timeSinceLastCalled=0] Number 可选

    上次调用函数以来所经过的时间

  • [maxSubSteps=10] Number 可选

    每个函数调用占用的最大固定步长

Example:

// Simple fixed timestepping without interpolation
var fixedTimeStep = 1 / 60;
var world = new World();
var body = new Body({ mass: 1 });
world.addBody(body);

function animate(){
    requestAnimationFrame(animate);
    world.step(fixedTimeStep);
    renderBody(body.position, body.angle);
}

// Start animation loop
requestAnimationFrame(animate);
// Fixed timestepping with interpolation
var maxSubSteps = 10;
var lastTimeSeconds;

function animate(t){
    requestAnimationFrame(animate);
    timeSeconds = t / 1000;
    lastTimeSeconds = lastTimeSeconds || timeSeconds;

    deltaTime = timeSeconds - lastTimeSeconds;
    world.step(fixedTimeStep, deltaTime, maxSubSteps);

    renderBody(body.interpolatedPosition, body.interpolatedAngle);
}

// Start animation loop
requestAnimationFrame(animate);

Properties

applyDamping

Boolean

启用自动在每一步进中应用刚体的阻尼

Default: true

applyGravity

Boolean

启用自动在每一步进中应用刚体的重力

Default: true

applySpringForces

Boolean

启用自动在每一步进中应用刚体的弹力

Default: true

bodies

Array

物理世界中的所有刚体, 若想添加刚体,请使用 addBody方法

bodiesToBeRemoved

Array private

预设要在在每一步进末尾被移除的刚体

BODY_SLEEPING

Number static

使单独的刚体在睡眠状态下失活

broadphase

Broadphase

使用的粗测算法

constraints

Array

用户自定义添加的约束

contactMaterials

Array

添加到物理世界的碰撞材质

defaultContactMaterial

ContactMaterial

如果没设置默认碰撞材质时使用的默认材质

defaultMaterial

Material

默认使用的材质模型,在 .defaultContactMaterial 中使用

disabledBodyCollisionPairs

Array private

禁用刚体碰撞对,参考{{#crossLink "World/disableBodyCollision:method"}}.

emitImpactEvent

Boolean

如果你想物理世界impact事件时设置为true,将其关闭可以提高性能

Default: true

frictionGravity

Number

用于估算摩擦最大力时使用的重力(mumassgravity).

gravity

Array

物理世界的重力,将在每一次step() 开始应用在所有刚体上

ISLAND_SLEEPING

Number static

如果全部刚体都处在睡眠状态中时使所有碰撞中的刚体失活,注意·你必须先启用 .islandSplit 才能让这一属性生效

islandManager

IslandManager

岛屿管理器

islandSplit

Boolean

是否启用岛屿划分,岛屿划分可以增加精度和性能,参见 IslandManager.

Default: true

lastTimeStep

Number

用于追踪上一步中使用的时间消耗

narrowphase

Narrowphase

用于生成碰撞的精测阶段

NO_SLEEPING

Number static

永不让刚体失活

overlapKeeper

OverlapKeeper

sleepMode

Number

在模拟中使刚体失活的模式,可选模式有World.NO_SLEEPING, World.BODY_SLEEPINGWorld.ISLAND_SLEEPING. 如果启用了睡眠,你可能在刚体不应睡眠时睡眠时需要 唤醒刚体,如果在物理时间中启用了睡眠,但希望为特定的刚体禁用它,参见Body.allowSleep.

Default: World.NO_SLEEPING

solveConstraints

Boolean

启用或禁用每一步进中的约束求解

Default: true

solver

Solver

用于满足约束和碰撞的求解器,默认为GSSolver.

springs

Array

世界中的所有弹力,如果想添加弹力到世界中,使用addSpring.

stepping

Boolean

是否处在step()中

time

Number

世界时间

useFrictionGravityOnZeroGravity

Boolean

如果 .gravity 为0, 同时 .useWorldGravityAsFrictionGravity=true, 那么切换为使用 .frictionGravity用于摩擦,这个回退对于零重力游戏来说很有用

Default: true

useWorldGravityAsFrictionGravity

Boolean

如果你希望.frictionGravity自动设置为 .gravity的长度,设置为true

Default: true

Events

addBody

当刚体添加到世界中时触发

Event Payload:

addSpring

当一个弹力添加到世界中时触发

Event Payload:

beginContact

在每次步进中的精测阶段进行时,当两个形状开始重合时触发

Event Payload:

endContact

在每次步进中的精测阶段进行后,当两个形状停止重合时触发

Event Payload:

impact

当每一次步进已完成后,当两个刚体之间产生了第一个碰撞时触发

Event Payload:

postBroadphase

在粗测阶段收集了世界中的碰撞对后触发。 在这个事件处理器中,你可以根据你的喜好修改碰撞对数组,用于避免你不希望碰撞的两个物体发生碰撞

Event Payload:

  • pairs Array

    碰撞对数组,如果这个数组是[body1,body2,body3,body4], 则刚体对1,2 和 3,4 将继续进入到精测阶段

postStep

在每一次step()后触发

preSolve

在方程添加到将要求解的求解器中时触发, 可以用于控制何种方程将进入求解器中

Event Payload:

  • contactEquations Array

    将要求解的碰撞方程

  • frictionEquations Array

    将要求解的摩擦方程

removeBody

当某一刚体从物理世界中被移除时触发

Event Payload: