Magnetism formula...
#1 GDNet+ - Reputation: 819
Posted 02 August 2012 - 05:58 PM
I want to be able to tweak the values to make the object either pull closer to the main object or push away based on some variables.
Anyone done this or have any info on it?
Would Bullet or Box2D have anything for this?
Thanks
#3 Moderator* - Reputation: 5343
Posted 02 August 2012 - 07:48 PM
bool attract = false;
Vector2f d = objectA.position() - objectB.position();
Vector2f force = d.normal() / d.magnitude();
if (!attract)
{
force = -force;
}
// ... now apply the force to whatever object...
#4 GDNet+ - Reputation: 819
Posted 02 August 2012 - 10:15 PM
Best I can say is this
I have the player as ObjA
and ObjB-ObjZ are enemies
Now I want ObjB-ObjZ to be randomly moving around the screen but I want to use the formula to always pull these enemies towards the player but they need to vary due to some variables which I figured something like a magnetic attraction some are stronger and weaker.... does this make more sense?
Thanks!
#5 Members - Reputation: 568
Posted 03 August 2012 - 12:59 AM
#7 Crossbones+ - Reputation: 959
Posted 03 August 2012 - 08:15 AM
I'm assuming you want the attractive force to be weaker with distance, so that means you'll want to divide by the distance. You can also divide by the squared distance to get more of a gravity effect. You'll probably want some constant factor for the strength of the forces, so multiply by that.
So now we have F = G / r^2, with F being the force, G the constant factor and r the distance between the objects. Adding in any other object property is as simple as multiplying/adding it with/to either the numerator or the denominator. If you're unsure if you should multiply/divide/add/subtract plot out some graphs or ask away.
Is that what you were looking for?
Edited by Mussi, 03 August 2012 - 08:15 AM.
#8 Crossbones+ - Reputation: 3512
Posted 03 August 2012 - 07:43 PM
Remember that dividing by distance or distance squared is numerically unstable if the two objects are too close to each other, you want to introduce a minimal radius to prevent this (make the two objects collide with each other when they get too close, I guess).I'm assuming you want the attractive force to be weaker with distance, so that means you'll want to divide by the distance. You can also divide by the squared distance to get more of a gravity effect. You'll probably want some constant factor for the strength of the forces, so multiply by that.
#10 Crossbones+ - Reputation: 1328
Posted 06 August 2012 - 11:38 AM
Edited by jwezorek, 06 August 2012 - 11:39 AM.
#11 GDNet+ - Reputation: 819
Posted 06 August 2012 - 05:31 PM
1C = 1A*1s
1C= 1F*1V
so what do I do with the 1C when it's done? Not sure how to apply this to each object....
As of now I am guessing,
Obj1 = A = 10
Obj1 = s = 1
Obj2 = A = 20
Obj2 = s = 1
do I subtract the two 1C's? and when at zero they are attracted to each other? Guess I need a usage example.... if you could!
Thanks!
#12 Crossbones+ - Reputation: 1328
Posted 06 August 2012 - 07:36 PM
Ok, I see these equations
1C = 1A*1s
1C= 1F*1V
...
You're looking at the wrong equations because for some reason my link was broken. Search for "Coulomb's Law" on wikipedia. Let me try again, just posting the naked url right into this post
The Url is this:
http://en.wikipedia....ulomb's_law
Edited by jwezorek, 06 August 2012 - 07:36 PM.
#13 GDNet+ - Reputation: 819
Posted 06 August 2012 - 08:42 PM
pseudo code....
//change obj1charge or obj2charge + or - will attract or repel each other...
float obj1Charge = 1000.0f, obj2Charge = 200.0f;
float x = 1000.0f, y = 1000.0f;
float k = 299000.0f;
float f = k * ((obj1Charge * obj2Charge) / pow(float(x * y), 2));
for(int i = 0; i < 30; ++i)
{
x += x*f;
y += y*f;;
std::cout << f << ", " << x << " , " << y << std::endl;
}
that is what I came up with....
BTW obj1 and obj2 should be a vector correct for easy scalar * vector multiplication?
Edited by MARS_999, 06 August 2012 - 09:11 PM.
#14 Crossbones+ - Reputation: 959
Posted 07 August 2012 - 08:19 AM






