API Docs for: 0.7.1
Show:

Body Class

Extends EventEmitter

刚体,具有质量、位置、速度以及一些用于碰撞的形状的物理对象

构造器

Body

(
  • [options]
)

参数:

  • [options] Object 可选
    • [force] Array 可选
    • [position] Array 可选
    • [velocity] Array 可选
    • [allowSleep] Boolean 可选
    • [collisionResponse] Boolean 可选
    • [angle=0] Number 可选
    • [angularForce=0] Number 可选
    • [angularVelocity=0] Number 可选
    • [ccdIterations=10] Number 可选
    • [ccdSpeedThreshold=-1] Number 可选
    • [fixedRotation=false] Number 可选
    • [gravityScale] Number 可选
    • [id] Number 可选
    • [mass=0] Number 可选

      一个大于等于 0 的数字,如果为0, 则type 将被设为Body.STATIC

    • [sleepSpeedLimit] Number 可选
    • [sleepTimeLimit] Number 可选

Example:

// Create a typical dynamic body
        var body = new Body({
            mass: 1,
            position: [0, 0],
            angle: 0,
            velocity: [0, 0],
            angularVelocity: 0
        });
        
        // Add a circular shape to the body
        body.addShape(new Circle({ radius: 1 }));
        
        // Add the body to the world
        world.addBody(body);
        

Methods

addShape

(
  • shape
  • [offset]
  • [angle]
)

将一个形状依附到这个刚体上,可以在添加形状时传入一个局部变换值,使得形状拥有相对刚体重心的位置和角度。这将自动更新刚体的属性和包围半径

参数:

  • shape Shape
    将依附到刚体上的形状
  • [offset] Array 可选

    形状的局部偏移

  • [angle] Number 可选

    形状的局部角度

Example:

var body = new Body(),
    shape = new Circle({ radius: 1 });

// 将形状置于刚体中间
body.addShape(shape);

// 添加另一个形状, 将其放置于距离刚体重心X轴方向1单位的位置
body.addShape(shape,[1,0]);

// 添加另一个形状, 将其放置于距离刚体重心Y轴方向1单位的位置,同时将其旋转90度(逆时针方向)
body.addShape(shape,[0,1],Math.PI/2);

adjustCenterOfMass

()

调整形状的偏移量,使得其中心变成刚体的重心。

applyDamping

(
  • dt
)

施加阻尼。参见 this

参数:

  • dt Number

    当前时间戳

applyForce

(
  • force
  • [relativePoint]
)

在相对刚体重心的一个点施加作用力, 这个点可以是刚体表面上的任意一点, 这种情况下施加作用力将影响刚体的force 作用力和angularForce 角速度,如果这一点为0, 这一作用力将直接施加在刚体重心,产生的扭矩将为0

参数:

  • force Array

    施加在刚体上的力

  • [relativePoint] Array 可选

    相对重心的施力点

applyForceLocal

(
  • localForce
  • [localPoint]
)

对物体所在位置施加一个作用力

参数:

  • localForce Array

    施加在刚体所在物理空间的向量力

  • [localPoint] Array 可选

    刚体所在的物理世界中的一个关联点,如果不给出,它将被设置为零,所有的冲量将施加到刚体重心

applyImpulse

(
  • impulse
  • [relativePoint]
)

在相对刚体的某一点上施加一个冲量(冲量是一个短时间内加到刚体上的力,冲量= 力 * 时间),这个点可以是刚体表面上的任意一点。冲量将影响刚体的velocity 速度和angularVelocity 角速度

参数:

  • impulse Array

    施加在刚体所在物理空间的冲量

  • [relativePoint] Array 可选

    刚体所在的物理世界中的一个关联点,如果不给出,它将被设置为零,所有的冲量将施加到刚体重心

applyImpulseLocal

(
  • impulse
  • [relativePoint]
)

在相对刚体的某一点上施加一个冲量(冲量是一个短时间内加到刚体上的力,冲量= 力 * 时间),这个点可以是刚体表面上的任意一点。冲量将影响刚体的velocity 速度和angularVelocity 角速度

参数:

  • impulse Array

    施加在刚体所在物理空间的冲量

  • [relativePoint] Array 可选

    刚体所在的物理世界中的一个关联点,如果不给出,它将被设置为零,所有的冲量将施加到刚体重心

emit

(
  • event
)
EventEmitter

触发一个事件,并返回自身,用于链式调用

参数:

  • event Object
    • type String

Returns:

EventEmitter:

自身,用于链式调用

fromPolygon

(
  • path
  • [options]
)
Boolean

读取一个多边形路路径,转化为凸型并将其放置在适当的偏移点上。

参数:

  • path Array

    包含多个2D向量的数组的凹或凸多边形,这个形状必须是普通的且不包含留空(内部)的

  • [options] Object 可选
    • [optimalDecomp=false] Boolean 可选

      是否开启最优分解,当顶点大于10个时性能将下降

    • [skipSimpleCheck=false] Boolean 可选

      如果你已经知道路径不会与自身相交,将其设置为true则跳过检查

    • [removeCollinearPoints=false] Boolean | Number 可选

      设置为一个数字(角度阈值)去除共线点,或false保持所有点

Returns:

Boolean:

如果成功则返回true,否则为false

getAABB

() AABB

返回从刚体中的AABB实例,如果必要这个AABB 将会被更新

Returns:

AABB:

AABB 实例(this.aabb)

getArea

() Number

返回刚体所包含的形状总面积

Returns:

Number:

getVelocityAtPoint

(
  • result
  • relativePoint
)
Array

返回刚体上一个点的速度

参数:

  • result Array

    放置结果的向量数组

  • relativePoint Array

    面向世界的向量,需要得到速度信息的点的位置

Returns:

Array:

刚体上一个点的速度

has

(
  • type
  • listener
)
Boolean

检查是否添加了该事件监听器

参数:

  • type String
  • listener Function

Returns:

Boolean:

integrate

(
  • dt
)

根据时间以及当前的速度移动刚体。

参数:

  • dt Number
    时间增量

off

(
  • type
  • listener
)
EventEmitter

移除指定的事件监听

参数:

  • type String
  • listener Function

Returns:

EventEmitter:

自身,用于链式调用

on

(
  • type
  • listener
)
EventEmitter

添加一个事件监听

参数:

  • type String
  • listener Function

Returns:

EventEmitter:

自身,用于链式调用

overlaps

(
  • body
)
Boolean

检查该刚体是否覆盖于其他刚体,需要注意的是,这个方法仅在刚体已添加到物理世界中且至少已经有一次步进的情况下可用

参数:

Returns:

Boolean:

removeShape

(
  • shape
)
Boolean

删除指定的形状

参数:

Returns:

Boolean:

如果找到并移除了指定的形状则返回True, 否则为false

setDensity

(
  • density
)

设定刚体的总密度

参数:

  • density Number

setZeroForce

()

将刚体的作用力归零

sleep

()

强制让刚体睡眠

sleepTick

(
  • time
  • dontSleep
  • dt
)

在每次时间步进时调用,更新内部睡眠定时器并在必要时更改睡眠状态

参数:

  • time Number

    以秒为单位的世界时间

  • dontSleep Boolean
  • dt Number

toLocalFrame

(
  • out
  • worldPoint
)

将世界中的一个点移动到刚体的范围中。(Transform a world point to local body frame.)

参数:

  • out Array

    存放结果的向量数组

  • worldPoint Array

    世界中的一个点(The input world point)

toWorldFrame

(
  • out
  • localPoint
)

将一个本地的点移动到世界范围内(Transform a local point to world frame.)

参数:

  • out Array

    存放结果的向量数组

  • localPoint Array

    范围中的一个点(The input local point)

updateAABB

()

更新刚体的包围盒模型, 并且设置 .aabbNeedsUpdate = false.

updateBoundingRadius

()

更新刚体的边缘半径(this.boundingRadius). 如果形状尺寸或位置改变了就完成了

updateMassProperties

()

更新这个刚体的 .inertia, .invMass, .invInertia 属性, 当改变刚体的结构或质量时需要调用这个方法

Example:

body.mass += 1;
body.updateMassProperties();

updateSolveMassProperties

() private

vectorToLocalFrame

(
  • out
  • worldVector
)

将世界中的一个点移动到刚体的范围中。(Transform a world point to local body frame.)

参数:

  • out Array

    存放结果的向量数组

  • worldVector Array

    世界中的一个向量(The input local point)

vectorToWorldFrame

(
  • out
  • localVector
)

将一个本地的点移动到世界范围内(Transform a local point to world frame.)

参数:

  • out Array

    存放结果的向量数组

  • localVector Array

    范围中的一个向量(The input local point)

wakeUp

()

唤醒当前刚体. 正常情况下你不需要用到它,因为当刚体触发类似于碰撞等的事件时会自动苏醒。 这一方法将设置睡眠状态为Body.AWAKE 同时触发wakeUp 事件,即使刚体在此之前没有苏醒

Properties

aabb

AABB

刚体的包围盒

aabbNeedsUpdate

Boolean

标志包围盒是否需要更新,使用.updateAABB()进行更新

Example:

// 强制更新包围盒
                    body.aabbNeedsUpdate = true;
                    body.updateAABB();
                    console.log(body.aabbNeedsUpdate); // false
                    

allowSleep

Boolean

如果设置为真,刚体将会自动进入睡眠状态。需要注意的是,你需要在所有事件发生前在World 中启用睡眠。

Default: true

angle

Number

角度

Example:

// 这一属性没有限定在标准的0 - 2π 之间,可以设置为任意数字,如果你需要设置它为这一区间的数字,可以用下列函数进行换算;
                    function normalizeAngle(angle){
                        angle = angle % (2*Math.PI);
                        if(angle < 0){
                            angle += (2*Math.PI);
                        }
                        return angle;
                    }
                    

angularDamping

Number

角度阻尼,0 - 1之间的数字

Default: 0.1

angularForce

Number

作用于刚体的角力,参考 force.

angularVelocity

Number

角速度,每秒转动设定的弧度

AWAKE

Number static

boundingRadius

Number

边界圆半径

ccdIterations

Number

在连续碰撞检测时遍历碰撞所使用的迭代次数,次数越多将使得连续碰撞检测碰撞的误差变小,但次数越少将提高性能。

Default: 10

ccdSpeedThreshold

Number

如果刚体的速度超过此阈值,连续碰撞检测将被启用。将该值设置为一个负数将完全禁用该刚体的连续碰撞检测;

Default: -1

collisionResponse

Boolean

当与其他刚体碰撞时是否产生碰撞作用力。需要注意的是,碰撞仍会产生,但会被禁用。即:该刚体会穿过其他刚体,但仍然会触发碰撞等事件。

damping

Number

在速度的方向上作用于刚体的线性阻尼,取值在0 - 1之间;

Default: 0.1

DYNAMIC

Number static

Dynamic body.

fixedRotation

Boolean

若为真,则将固定刚体的旋转

fixedX

Boolean

若为真,则将固定刚体在X轴上的移动,此时刚体依然可以沿着Y轴上移动。

fixedY

Boolean

若为真,则将固定刚体在Y轴上的移动,此时刚体依然可以沿着X轴上移动。

force

Array

作用于刚体的外力。 因为刚体的作用力 (and 角向力) 在每一次步进后会变成0, 所以你需要在每一次步进前设置作用力

Example:

// This produces a forcefield of 1 Newton in the positive x direction.
                    for(var i=0; i<numSteps; i++){
                        body.force[0] = 1;
                        world.step(1/60);
                    }
                    
// This will apply a rotational force on the body
                    for(var i=0; i<numSteps; i++){
                        body.angularForce = -3;
                        world.step(1/60);
                    }
                    

gravityScale

Number

重力比例因子,如果希望刚体忽略重力影响,将其设置为0即可,如果希望刚体反重力,将其设置为-1;

Default: 1

id

Number

刚体的唯一标志

idleTime

Number

刚体持续睡眠的时间

inertia

Number

刚体围绕Z轴上的惯性

interpolatedAngle

Number

刚体的插入角度,用于渲染

interpolatedPosition

Array

刚体的插入位置,用于渲染

invInertia

Number

反向惯性

invMass

Number

反向重力

KINEMATIC

Number static

Kinematic body.

mass

Number

刚体的质量

massMultiplier

Array private

position

Array

刚体的位置

previousAngle

Number

刚体的前一角度

previousPosition

Array

刚体的前一位置

shapes

Array

刚体中的形状,可以多个

SLEEPING

Number static

sleepSpeedLimit

Number

如果刚体当前的速度(数量速度speed, 非velocity矢量速度)小于这一数值,刚体将被视为需进入惺忪状态

Default: 0.2

sleepState

Number

Body.AWAKE, Body.SLEEPYBody.SLEEPING之一

刚体初始的睡眠状态为 Body.AWAKE. 如果其当前速度低于 .sleepSpeedLimit, 刚体的睡眠状态将变为 Body.SLEEPY. 如果刚体保持 Body.SLEEPY .sleepTimeLimit 秒将进入休眠模式 (Body.SLEEPY)

Default: Body.AWAKE

sleepTimeLimit

Number

如果刚体保持Body.SLEEPY(惺忪状态)超出这一限制时间将进入休眠。

Default: 1

SLEEPY

Number static

STATIC

Number static

Static body.

timeLastSleepy

Number private

The last time when the body went to SLEEPY state.

type

Number

刚体的运动类型, Body.STATIC, Body.DYNAMICBody.KINEMATIC之一

  • STATIC 刚体不可移动,也不受作用力和碰撞影响
  • DYNAMIC 刚体将根据碰撞和作用力运动
  • KINEMATIC 刚体根据其velocity 属性移动,也不受作用力和碰撞影响。

Example:

// B刚体默认为静力学模型,静力学模型刚体永远不移动
                    var body = new Body();
                    console.log(body.type == Body.STATIC); // true
                    
// 将刚体的质量设置为非零数值时,它将变成能够运动及与其他刚体进行交互的动力学模型
                    var dynamicBody = new Body({
                        mass : 1
                    });
                    console.log(dynamicBody.type == Body.DYNAMIC); // true
                    
// 运动学模型刚体仅在改变其矢量速度时发生移动
                    var kinematicBody = new Body({
                        type: Body.KINEMATIC // Type can be set via the options object.
                    });
                    

velocity

Array

刚体的当前速度

vlambda

Array

在世界最后一次步进(step)中添加到刚体的约束速度。

wlambda

Array

在世界最后一次步进(step)中添加到刚体的角约束速度。

world

World

刚体进入的物理世界,当设置为Null 时,意味着刚体未进入任何物理世界

Events

sleep

sleepy

wakeup