UNPKG

planck

Version:

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

92 lines (66 loc) 2.66 kB
## Shape Shapes describe collision geometry and may be used independently of physics simulation. At a minimum, you should understand how to create shapes that can be later attached to rigid bodies. Planck.js shapes implement the Shape base class. The base class defines functions to: - Test a point for overlap with the shape. - Perform a ray cast against the shape. - Compute the shape's AABB. - Compute the mass properties of the shape. In addition, each shape has a type member and a radius. The radius even applies to polygons, as discussed below. Keep in mind that a shape does not know about bodies and stand apart from the dynamics system. In Planck.js shapes are considered immutable. When a shape is attached to a body using a fixture, the shapes move rigidly with the host body. In summary: - When a shape is **not** attached to a body, you can view its vertices as being expressed in world-space. - When a shape is attached to a body, you can view its vertices as being expressed in local coordinates. ### Geometric Queries You can perform a couple geometric queries on a single shape. #### Shape Point Test You can test a point for overlap with a shape. You provide a transform for the shape and a world point. ```js let transform = Transform.identity(); let point = Vec2(5, 2); let hit = shape.testPoint(transform, point); ``` Edge and chain shapes always return false, even if the chain is a loop. #### Shape Ray Cast You can cast a ray at a shape to get the point of first intersection and normal vector. A child index is included for chain shapes because the ray cast will only check a single edge at a time. > **Caution**: > No hit will register if the ray starts inside a convex shape like a circle or > polygon. This is consistent with Planck.js treating convex shapes as solid. > ```js let transform = Transform.identity(); let input = {}; // RayCastInput input.p1 = Vec2(0, 0); input.p2 = Vec2(1, 0); input.maxFraction = 1; let childIndex = 0; let output = {}; // RayCastOutput let hit = shape.RayCast(output, input, transform, childIndex); if (hit) { let hitPoint = Vec2.add( Vec2.mul(1 - output.fraction, input.p1), Vec2.mul(output.fraction, input.p2) ); } ``` #### Pairwise Functions The Collision module contains functions that take a pair of shapes and compute some results. These include: - Overlap - Contact manifolds - Distance - Time of impact #### Overlap You can test two shapes for overlap using this function: ```js Transform xfA = ..., xfB = ...; bool overlap = TestOverlap(shapeA, indexA, shapeB, indexB, xfA, xfB); ``` Again you must provide child indices for the case of chain shapes.