import { Box2DJoint, Box2DJointType, Box2DShapeType } from '.'; import { BaseBodyOptions, Vec2, Vec4 } from '../physics'; import { Box2DRigidBody } from './RigidBody'; export interface Box2DBaseJointOptions { type: Box2DJointType; name?: string; } /** * 距离关节:两个物体上面各自有一点,两点之间的距离固定不变 */ export interface Box2DDistanceJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.distance; collision?: boolean; mainPivot?: Vec2; connectedPivot?: Vec2; mainBody: Box2DRigidBody; connectedBody: Box2DRigidBody; /**约束的最小长度*/ min?: number; /**约束的最大长度*/ max?: number; /**约束的目标静止长度*/ length?: number; /**弹簧系统的震动频率,可以视为弹簧的弹性系数,通常频率应该小于时间步长频率的一半*/ frequency?: number; /**刚体在回归到节点过程中受到的阻尼比,建议取值0~1*/ damping?: number; } /** * 齿轮关节:用来模拟两个齿轮间的约束关系,齿轮旋转时,产生的动量有两种输出方式,一种是齿轮本身的角速度,另一种是齿轮表面的线速度 */ export interface Box2DGearJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.gear; mainJoint: Box2DJoint; connectedJoint: Box2DJoint; /**两个齿轮角速度比例,默认1*/ ratio?: number; collision?: boolean; } /** * 马达关节:用来限制两个刚体,使其相对位置和角度保持不变 */ export interface Box2DMotorJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.motor; mainBody: Box2DRigidBody; connectedBody: Box2DRigidBody; collision?: boolean; /**基于otherBody坐标位置的偏移量,也是selfBody的目标位置*/ linearOffset: Vec2; /**基于otherBody的角度偏移量,也是selfBody的目标角度*/ angularOffset: number; /**当selfBody偏离目标位置时,为使其恢复到目标位置,马达关节所施加的最大作用力*/ maxForce?: number; /**当selfBody角度与目标角度不同时,为使其达到目标角度,马达关节施加的最大扭力*/ maxTorque?: number; /**selfBody向目标位置移动时的缓动因子,取值0~1,值越大速度越快*/ correctionFactor?: number; } /** * 鼠标关节:鼠标关节用于通过鼠标来操控物体。它试图将物体拖向当前鼠标光标的位置。而在旋转方面就没有限制。 */ export interface Box2DMouseJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.mouse; mainBody: Box2DRigidBody; /**[首次设置有效]关节的链接点,使用的是鼠标点击点作为连接点*/ pivot: Vec2; /**鼠标关节在拖曳刚体bodyB时施加的最大作用力*/ maxForce?: number; /**弹簧系统的震动频率,可以视为弹簧的弹性系数,通常频率应该小于时间步长频率的一半*/ frequence?: number; /**刚体在回归到节点过程中受到的阻尼比,建议取值0~1*/ damping?: number; } export interface Box2DMouseJoint extends Box2DJoint { setTarget(x: number, y: number): void; } /** * 平移关节:移动关节允许两个物体沿指定轴相对移动,它会阻止相对旋转 */ export interface Box2DPrismaticJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.prismatic; mainBody: Box2DRigidBody; connectedBody?: Box2DRigidBody; /**[首次设置有效]关节的控制点,是相对于自身刚体的左上角位置偏移*/ pivot: Vec2; /**[首次设置有效]一个向量值,描述运动方向,比如1,0是沿X轴向右*/ axis: Vec2; collision?: boolean; /**是否开启马达,开启马达可使目标刚体运动*/ enableMotor: boolean; /**启用马达后,在axis坐标轴上移动可以达到的最大速度*/ motorSpeed: number; /**启用马达后,可以施加的最大作用力*/ maxMotorForce: number; /**是否对刚体的移动范围加以约束*/ enableLimit: boolean; /**启用约束后,刚体移动范围的下限,是距离anchor的偏移量*/ lowerTranslation: number; /**启用约束后,刚体移动范围的上限,是距离anchor的偏移量*/ upperTranslation: number; } /** * 滑轮关节:它将两个物体接地(ground)并彼此连接,当一个物体上升,另一个物体就会下降 */ export interface Box2DPulleyJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.pulley; /**[首次设置有效]关节的自身刚体*/ mainBody: Box2DRigidBody; /**[首次设置有效]关节的连接刚体,可不设置,默认为左上角空刚体*/ connectedBody: Box2DRigidBody; /**[首次设置有效]自身刚体链接点,是相对于自身刚体的左上角位置偏移*/ mainPivot: Vec2; /**[首次设置有效]链接刚体链接点,是相对于otherBody的左上角位置偏移*/ connectedPivot: Vec2; /**[首次设置有效]两个刚体是否可以发生碰撞,默认为false*/ collision?: boolean; /**[首次设置有效]滑轮上与节点selfAnchor相连接的节点,是相对于自身刚体的左上角位置偏移*/ mainGroundPoint: Vec2; /**[首次设置有效]滑轮上与节点otherAnchor相连接的节点,是相对于otherBody的左上角位置偏移*/ connectedGroundPoint: Vec2; /**[首次设置有效]两刚体移动距离比率*/ ratio: number; } /** * 旋转关节强制两个物体共享一个锚点,两个物体相对旋转 */ export interface Box2DRevoluteJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.revolute; mainBody: Box2DRigidBody; connectedBody?: Box2DRigidBody; /**[首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移*/ pivot: Vec2; collision?: boolean; /**是否开启马达,开启马达可使目标刚体运动*/ enableMotor: boolean; /**启用马达后,在axis坐标轴上移动可以达到的最大速度*/ motorSpeed: number; /**启用马达后,可以施加的最大扭距,如果最大扭矩太小,会导致不旋转*/ maxMotorTorque: number; /**是否对刚体的移动范围加以约束*/ enableLimit: boolean; /**启用约束后,刚体旋转范围的下限弧度*/ lowerAngle: number; /**启用约束后,刚体旋转范围的上限弧度*/ upperAngle: number; } /** * 焊接关节:焊接关节的用途是使两个物体不能相对运动,受到关节的限制,两个刚体的相对位置和角度都保持不变,看上去像一个整体 */ export interface Box2DWeldJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.weld; mainBody: Box2DRigidBody; connectedBody: Box2DRigidBody; /**[首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移*/ pivot: Vec2; collision?: boolean; frequence: number; damping: number; } /** * 轮子关节:围绕节点旋转,包含弹性属性,使得刚体在节点位置发生弹性偏移 */ export interface Box2DWheelJointOptions extends Box2DBaseJointOptions { type: Box2DJointType.wheel; mainBody: Box2DRigidBody; connectedBody: Box2DRigidBody; /**[首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移*/ pivot: Vec2; collision?: boolean; /**[首次设置有效]一个向量值,描述运动方向,比如1,0是沿X轴向右*/ axis: Vec2; frequence: number; damping: number; /**是否开启马达,开启马达可使目标刚体运动*/ enableMotor: boolean; /**启用马达后,在axis坐标轴上移动可以达到的最大速度*/ motorSpeed: number; /**启用马达后,可以施加的最大扭距,如果最大扭矩太小,会导致不旋转*/ maxMotorTorque: number; /**是否对刚体的移动范围加以约束*/ enableLimit: boolean; /**启用约束后,刚体移动范围的下限,是距离anchor的偏移量*/ lowerTranslation: number; /**启用约束后,刚体移动范围的上限,是距离anchor的偏移量*/ upperTranslation: number; } export interface Box2DShapeOptions { type: Box2DShapeType; /** * 位置偏移 */ position?: Vec2; /** * 缩放偏移 */ rotation?: number; /** * 已经创建好的shape实例 */ instance?: any; } export interface Box2DRectShapeOptions extends Box2DShapeOptions { type: Box2DShapeType.rectangle; width: number; height: number; } export interface Box2DCircleShapeOptions extends Box2DShapeOptions { type: Box2DShapeType.circle; radius: number; } export interface Box2DChainShapeOptions extends Box2DShapeOptions { type: Box2DShapeType.chain; points: number[]; loop?: boolean; } export interface Box2DEdgeShapeOptions extends Box2DShapeOptions { type: Box2DShapeType.edge; points: Vec4; } export interface Box2DPolygonShapeOptions extends Box2DShapeOptions { type: Box2DShapeType.polygon; points: number[]; } export declare type Box2DShapeOptionsAll = Box2DRectShapeOptions | Box2DCircleShapeOptions | Box2DChainShapeOptions | Box2DEdgeShapeOptions | Box2DPolygonShapeOptions; export interface Box2DRigidBodyOptions extends BaseBodyOptions { /**[只读] 指定了该主体所属的碰撞组,默认为0,碰撞规则如下: * 1.如果两个对象group相等 * group值大于零,它们将始终发生碰撞 * group值小于零,它们将永远不会发生碰撞 * group值等于0,则使用规则3 * 2.如果group值不相等,则使用规则3 * 3.每个刚体都有一个category类别,此属性接收位字段,范围为[1,2^31]范围内的2的幂 * 每个刚体也都有一个mask类别,指定与其碰撞的类别值之和(值是所有category按位AND的值) */ category?: number; /**是否是传感器,传感器能够触发碰撞事件,但不会产生碰撞反应*/ isSensor?: boolean; /**是否允许休眠,允许休眠能提高性能*/ allowSleep?: boolean; /**旋转速度阻尼系数,范围可以在0到无穷大之间,0表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在0到0.1之间*/ angularDamping?: number; /**角速度,设置会导致旋转*/ angularVelocity?: number; /**是否高速移动的物体,设置为true,可以防止高速穿透*/ bullet?: boolean; /**是否允许旋转,如果不希望刚体旋转,这设置为false*/ fixedRotation?: boolean; /**重力缩放系数,设置为0为没有重力*/ gravityScale?: number; /**线性速度阻尼系数,范围可以在0到无穷大之间,0表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在0到0.1之间*/ linearDamping?: number; /**线性运动速度,比如[10,10]*/ linearVelocity?: Vec2; /**密度 */ density?: number; shapes?: Box2DShapeOptionsAll | Box2DShapeOptionsAll[]; position?: Vec2; rotation?: number; scale?: Vec2; } export interface Box2DWorldOptions { gravity?: Vec2; Box2D?: any; wasm?: string; velocityIterations?: number; positioniterations?: number; }