 # What is the best way to calculate the force to use for applyimpulse in order to impulse in a given direction?

Hi everyone,

I’m fairly new to 3D and the math that are used to calculate certain type of behaviors.
For example I’m trying to find a way to use applyImpulse with a force (first param) that will throw a sphere in the direction of a goal (a mesh) knowing that my camera is locked (using camera.target) on this goal.

I also want to be able to control the “power” of the impulse (don’t know what is the dedicated physics word). For that matter I use the time between space bar press and release to get a number that I will use as a multiplier when I will be able to calculate the force mentionned above.

Currently I think I know which data to start with (maybe camera.position and camera.getTarget()) but, as I’m really weak in math, I can’t figure out what to do with those data.

If someone has an idea or an hint to share that would be really helpful I’m not sure it will help but here is the current state of my project of a basket ball minigame for which I want to implement the calculation explained above Babylon Template

My question in few words : How to calculate the force (first parameter of applyImpulse) in order to throw an object towards another ? ( and how to apply a variable “power” to the resulting vector )

1 Like

Hi PB! The “direction” used in physics applyImpulse (and applyForce?)… can be gotten by subtracting starting position… from target position (or vise-versa).

So, in your case, `forceVector = camera.position.clone().subtract(camera.target)` should give you something useable… or maybe `forceVector = camera.getPosition().subtract(camera.target)` … something similar to that, or switch the values around… or use forceVector.negate() as needed.

The result of those subtractions of two vector3’s… is a vector3. Vector3’s have a handy scale() method that is an amplifier or attenutator (up-scaler or down-scaler)… and that is your AMOUNT of power that you will be impulsing along the force vector.

Sometimes… the scale of the direction-type vector3… is called its magnitude. Feel free to read about magnitudes of direction vectors on the web.

There is also a vector3.normalize() method that could be read-about, too. As best I understand it, normalize() makes all three values of the vector3… as tiny as possible… and still be pointing in the same direction. SO… it is a de-magnituder, right? You might want to start with de-magnituded force vectors… just before you do `forceVector = forceVector.scale(somePowerLevel)`… or maybe `forceVector.scaleInPlace(somePowerLevel)`.

Do you know about scale() vs. scaleInPlace() vs. scaleToRef() stuff? All just different ways of up/down-scaling a vector3. The same options exist for that subtraction mentioned earlier… ie. subtractToRef(), subtractInPlace(), etc. They exist for other math stuff, too.

All in all, I would FIRST do the subtraction of target position from source position, or vise-versa. Then do thatResult.normalize(). Then do thatResult.scale(yourPowerLevel)… the magnitude adjuster. That should give you all the tools you need. I hope this helps. Holler if ya got problems… we have some applyImpulse demo playgrounds nearby.

3 Likes

Point of Order Sir - normalize() makes the vector into a unit vector in the same direction.

That is given a Vector3 V = BABYLON.Vector3(a, b, c) then

V.normalize() changes the value of V to (x, y, z) where x2 + y2 + z2 = 1

Note if you want to retain V as (a, b, c) you need to do

``````W = V.clone();
W.normalize();
``````

It is then true that V = W.scale(V.length()) where V.length() gives the magnitude of V

in this sense

is true.

2 Likes

Wow,
First thanks a lot for all the time you took to write me this really detailed and comprehensive answer. Really great people and community here Yes I think I’ve got all the tools I need to start ! I was just droping by to thank you, I’ll let you know if I made it work right for my needs Thanks a lot again !

1 Like