Thrust in Box2D

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Davidobot
Party member
Posts: 1220
Joined: Sat Mar 31, 2012 5:18 am
Location: Oxford, UK
Contact:

Thrust in Box2D

So, I have a square that I want to apply force to so that the force applied is always perpendicular to the base of the square. How would one accomplish this? See the diagram:
My projects: Raycaster, love.js v11.3 port
My library: LovelyMoon
vrld
Party member
Posts: 917
Joined: Sun Apr 04, 2010 9:14 pm
Location: Germany
Contact:

Re: Thrust in Box2D

Rotate the force vector according to the rotation of the shape: http://en.wikipedia.org/wiki/Rotation_m ... dimensions. In code:

Code: Select all

function rotate(rot, x,y)
local s,c = math.sin(rot), math.cos(rot)
return c*x - s*y, s*x + c*y
end
[shameless-plug]Or use hump.vector that includes this function.[/shameless-plug]
I have come here to chew bubblegum and kick ass... and I'm all out of bubblegum.

hump | HC | SUIT | moonshine
chezrom
Citizen
Posts: 59
Joined: Tue May 28, 2013 11:03 pm
Location: France

Re: Thrust in Box2D

Sorry vrld for your hump.vector library, but Box2D has this functions ...

You can use body:getWorldVector(local_x,local_y) => world_x,world_y to transform a vector is the body/local coordinate to the world coordinate.
The local vector is simple to determine because your square shape is always aligned with the axes of the local coordinates.

Also use body:getWorldPoint(local_x,local_y) to determine where you applicate your force (by default it is applied to the center of mass, that is different of the origin of the local coordinates).
Davidobot
Party member
Posts: 1220
Joined: Sat Mar 31, 2012 5:18 am
Location: Oxford, UK
Contact:

Re: Thrust in Box2D

How would one use this with Body:applyForce?
My projects: Raycaster, love.js v11.3 port
My library: LovelyMoon
chezrom
Citizen
Posts: 59
Joined: Tue May 28, 2013 11:03 pm
Location: France

Re: Thrust in Box2D

For example :

Code: Select all

body:applyForce(body:getWorldVector(local_fx,local_fy))
The force is applied to the centre of mass, as show in your drawing.
You can have, if your thrust is directed down so the reaction force is up local_fx = 0 and local_fy= - gravity * factor
You must call applyForce at each update when the thrust is here.
Davidobot
Party member
Posts: 1220
Joined: Sat Mar 31, 2012 5:18 am
Location: Oxford, UK
Contact:

Re: Thrust in Box2D

chezrom wrote:For example :

Code: Select all

body:applyForce(body:getWorldVector(local_fx,local_fy))
The force is applied to the centre of mass, as show in your drawing.
You can have, if your thrust is directed down so the reaction force is up local_fx = 0 and local_fy= - gravity * factor
You must call applyForce at each update when the thrust is here.
Thank you! Works flawlessly.
My projects: Raycaster, love.js v11.3 port