UNPKG

planck

Version:

2D JavaScript/TypeScript physics engine for cross-platform HTML5 game development

239 lines (213 loc) 6.87 kB
/* * Planck.js * * Copyright (c) Erin Catto, Ali Shakiba * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /** @internal */ const math_PI = Math.PI; /** * Tuning constants based on meters-kilograms-seconds (MKS) units. * * Some tolerances are absolute and some are relative. Absolute tolerances use MKS units. */ export class Settings { /** * You can use this to change the length scale used by your game. * * For example for inches you could use 39.4. */ static lengthUnitsPerMeter = 1.0; // Collision /** * The maximum number of contact points between two convex shapes. Do not change * this value. */ static maxManifoldPoints: number = 2; /** * The maximum number of vertices on a convex polygon. You cannot increase this * too much because BlockAllocator has a maximum object size. */ static maxPolygonVertices: number = 12; /** * This is used to fatten AABBs in the dynamic tree. This allows proxies to move * by a small amount without triggering a tree adjustment. This is in meters. */ static aabbExtension: number = 0.1; /** * This is used to fatten AABBs in the dynamic tree. This is used to predict the * future position based on the current displacement. This is a dimensionless * multiplier. */ static aabbMultiplier: number = 2.0; /** * A small length used as a collision and constraint tolerance. Usually it is * chosen to be numerically significant, but visually insignificant. */ static linearSlop: number = 0.005; /** * A small angle used as a collision and constraint tolerance. Usually it is * chosen to be numerically significant, but visually insignificant. */ static angularSlop: number = (2.0 / 180.0) * math_PI; /** * The radius of the polygon/edge shape skin. This should not be modified. * Making this smaller means polygons will have an insufficient buffer for * continuous collision. Making it larger may create artifacts for vertex * collision. */ static get polygonRadius(): number { return 2.0 * Settings.linearSlop; } /** * Maximum number of sub-steps per contact in continuous physics simulation. */ static maxSubSteps: number = 8; // Dynamics /** * Maximum number of contacts to be handled to solve a TOI impact. */ static maxTOIContacts: number = 32; /** * Maximum iterations to solve a TOI. */ static maxTOIIterations: number = 20; /** * Maximum iterations to find Distance. */ static maxDistanceIterations: number = 20; /** * A velocity threshold for elastic collisions. Any collision with a relative * linear velocity below this threshold will be treated as inelastic. */ static velocityThreshold: number = 1.0; /** * The maximum linear position correction used when solving constraints. This * helps to prevent overshoot. */ static maxLinearCorrection: number = 0.2; /** * The maximum angular position correction used when solving constraints. This * helps to prevent overshoot. */ static maxAngularCorrection: number = (8.0 / 180.0) * math_PI; /** * The maximum linear velocity of a body. This limit is very large and is used * to prevent numerical problems. You shouldn't need to adjust Settings. */ static maxTranslation: number = 2.0; /** * The maximum angular velocity of a body. This limit is very large and is used * to prevent numerical problems. You shouldn't need to adjust Settings. */ static maxRotation: number = 0.5 * math_PI; /** * This scale factor controls how fast overlap is resolved. Ideally this would * be 1 so that overlap is removed in one time step. However using values close * to 1 often lead to overshoot. */ static baumgarte: number = 0.2; static toiBaugarte: number = 0.75; // Sleep /** * The time that a body must be still before it will go to sleep. */ static timeToSleep: number = 0.5; /** * A body cannot sleep if its linear velocity is above this tolerance. */ static linearSleepTolerance: number = 0.01; /** * A body cannot sleep if its angular velocity is above this tolerance. */ static angularSleepTolerance: number = (2.0 / 180.0) * math_PI; } /** @internal */ export class SettingsInternal { static get maxManifoldPoints() { return Settings.maxManifoldPoints; } static get maxPolygonVertices() { return Settings.maxPolygonVertices; } static get aabbExtension() { return Settings.aabbExtension * Settings.lengthUnitsPerMeter; } static get aabbMultiplier() { return Settings.aabbMultiplier; } static get linearSlop() { return Settings.linearSlop * Settings.lengthUnitsPerMeter; } static get linearSlopSquared() { return Settings.linearSlop * Settings.lengthUnitsPerMeter * Settings.linearSlop * Settings.lengthUnitsPerMeter; } static get angularSlop() { return Settings.angularSlop; } static get polygonRadius() { return 2.0 * Settings.linearSlop; } static get maxSubSteps() { return Settings.maxSubSteps; } static get maxTOIContacts() { return Settings.maxTOIContacts; } static get maxTOIIterations() { return Settings.maxTOIIterations; } static get maxDistanceIterations() { return Settings.maxDistanceIterations; } static get velocityThreshold() { return Settings.velocityThreshold * Settings.lengthUnitsPerMeter; } static get maxLinearCorrection() { return Settings.maxLinearCorrection * Settings.lengthUnitsPerMeter; } static get maxAngularCorrection() { return Settings.maxAngularCorrection; } static get maxTranslation() { return Settings.maxTranslation * Settings.lengthUnitsPerMeter; } static get maxTranslationSquared() { return ( Settings.maxTranslation * Settings.lengthUnitsPerMeter * Settings.maxTranslation * Settings.lengthUnitsPerMeter ); } static get maxRotation() { return Settings.maxRotation; } static get maxRotationSquared() { return Settings.maxRotation * Settings.maxRotation; } static get baumgarte() { return Settings.baumgarte; } static get toiBaugarte() { return Settings.toiBaugarte; } static get timeToSleep() { return Settings.timeToSleep; } static get linearSleepTolerance() { return Settings.linearSleepTolerance * Settings.lengthUnitsPerMeter; } static get linearSleepToleranceSqr() { return ( Settings.linearSleepTolerance * Settings.lengthUnitsPerMeter * Settings.linearSleepTolerance * Settings.lengthUnitsPerMeter ); } static get angularSleepTolerance() { return Settings.angularSleepTolerance; } static get angularSleepToleranceSqr() { return Settings.angularSleepTolerance * Settings.angularSleepTolerance; } }