[fpc-pascal] Writing Pascal Physics and Vectors

Anthony Walter sysrpl at gmail.com
Fri Oct 29 06:49:15 CEST 2021

Ah, so that was you who wrote the C wrapper? I saw that a while ago and
considered using it, but after looking at and exploring how
Chimpmunk2D works, I decided it was smaller, pretty darn good. That and
Chipmunk2D is already C, so very little work was needed from me to convert
it to work with Pascal.

Again, the physics part will be in my second release. The first part is
just getting the vector graphics and a minimal GUI toolkit in OpenGL
working. That plus an overview and reference website similar to my
https://docs.getlazurs.org website.

If anyone cares to know more, here is a brief description of how my object
oriented wrapper around Chipmunk2D physics is organized.

ISpace is the base object to work with physics. If you use the
TPhyiscsScene class it's created and managed for you automatically. ISpace
provides properties for controlling gravity, bodies, and joints. There is
one ISpace object per physics simulation.

IBody objects are added to ISpace using ISpace.NewBody, ISpace.NewDynamic,
and ISpace.NewStatic methods which create kinematic, dynamic, and static
bodies respectively. Kinematic bodies react to collisions with each other
and are affected by forces such as gravity. Dynamic bodies can be moved
manually by the programmer, but are otherwise unaffected by forces and
collisions. Static bodies cannot move but kinematic bodies may bounce off

IShape objects are added to bodies using IBody.NewCircle, IBody.NewRect,
IBody.NewSegment, and IBody.NewPolygon method. A body by itself has no
shape. Its shape is defined by the shapes you add to it. Shapes within the
same body do not collide with each other or move with respect to the other
shapes within the body. Each shape within a body can have different
friction, density, and elasticity (or bounciness).  The mass and center of
gravity of a body is calculated by its constituent shapes.

IJoint includes a list of several joint types (I will not list them all
here), and they can be used to connect two bodies together. Some joint
types are motors, other are springs, and some are hinges or pivots.
Collisions between bodies connected by a joint can be set to be ignored for
those two bodies.

IArbitors allow you to either detect and handle collisions between body
types you define. You can ignore them if you simply want the physics system
to handle collisions for you.

Masks can be applied to body types, allowing you to say which bodies can
collide with which other bodies. For example, if you were writing a game
you could setup enemy bullets bodies to pass through enemy bodies using a
simple mask. The enemy bullet bodies could then be setup to collide with
the player body and wall bodies.

There is a lot more to the physics system, but my object orient design,
plus some documentation and examples ought to get most people running in
short order.

I have been mostly working on the graphics portion for the past week and
haven't been working with the physics system in that time. Last time I was
working on it I was trying to figure how how to make a decent rope. I am
not at all satisfied with my initial work, and maybe someone can help me
get rope physics working better, but below is the result of my first

Rope test : https://streamable.com/lli866

I'll put all the information above and the source code online in a git
repository soon with a FOSS license. If anyone wants to help, let me know.
Join me in the discord channel listed in my initial message, or see me on
liberachat irc in the #fpc channel.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20211029/880f6f56/attachment.htm>

More information about the fpc-pascal mailing list