Jump to content

  • Log In with Google      Sign In   
  • Create Account


Impulse on multiple object


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 rmxhaha   Members   -  Reputation: 182

Like
0Likes
Like

Posted 21 July 2013 - 09:41 AM

I am new here, hi to everyone

 

 

I made my physic engine and I finally reach the point where object resting on top of each other produce some kind of anomally which I kinda know what the cause is.

 

I try a few method from this series

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-2d-physics-engine-aabb-circle-impulse-resolution/

http://www.gamedev.net/page/resources/_/technical/game-programming/swept-aabb-collision-detection-and-response-r3084

 

But I kinda one of some little part of each tutorial and I even have my own method in some small part as well.

So I cannot really say which tutorial I follow..

 

I took ResolveCollision function from the first tutorial 

void ResolveCollision( Object A, Object B )
{
  // Calculate relative velocity
  Vec2 rv = B.velocity - A.velocity
 
  // Calculate relative velocity in terms of the normal direction
  float velAlongNormal = DotProduct( rv, normal )
 
  // Do not resolve if velocities are separating
  if(velAlongNormal > 0)
    return;
 
  // Calculate restitution
  float e = min( A.restitution, B.restitution)
 
  // Calculate impulse scalar
  float j = -(1 + e) * velAlongNormal
  j /= 1 / A.mass + 1 / B.mass
 
  // Apply impulse
  Vec2 impulse = j * normal
  A.velocity -= 1 / A.mass * impulse
  B.velocity += 1 / B.mass * impulse
}

I use this algorithm to solve impulse problem between 2 object

But the problem is when 1 object collide to another object and then that other object collide with another object and so on...

 

if it's just one object with another it's not so hard

but if one object collide with 2 or more object simultaneously there occur a problem I cannot solve,

I don't know, I haven't learn physic to that level

 

Can someone help me ?

Thanks for your reply in Advance...

 



Sponsor:

#2 WiredCat   Members   -  Reputation: 239

Like
0Likes
Like

Posted 21 July 2013 - 01:43 PM

maybe this should do the trick the interaction between all objects:

 

 

 

galaxy.c in opengl downloaded somwehere from internet

void __fastcall TGLgalaxy::movegals() {
try {
//lastcenter = center;
//								 center.x = 0.0;
//								 center.y = 0.0;
//								 center.z = 0.0;
		int i, j;
		float ep_t_mass;

		for(i = 0; i < n; i++) {
			for(j = 0; j< n; j++) {

				if(j == i)
					continue;
															//jezeli cos do siebie dobija to: :)
															//	co  ma mniejsza mase = acc czyli przyspieszenia :) accumulation :)
				 x1 = s[i].pos.x - s[j].pos.x;
				x2 = s[i].pos.y - s[j].pos.y;
				x3 = s[i].pos.z - s[j].pos.z;
				
  long double f = x1*x1+x2*x2+x3*x3;
						  if (f>0.0)
						  f = sqrtl(f); else f = 1.0;

						  d = f;

				if(d > 10)      //-0.001
					ep_t_mass = -0.001*G*(s[j].mass/(d*d));
	else
					ep_t_mass = 0;
//						ep_t_mass = +(G*s[j].mass/(d*d));// / 2.00f;



				s[i].acc.x = ep_t_mass * x1;
				s[i].acc.y = ep_t_mass * x2;
				s[i].acc.z = ep_t_mass * x3;

				s[i].vel.x += s[i].acc.x;
				s[i].vel.y += s[i].acc.y;
				s[i].vel.z += s[i].acc.z;

				s[i].pos.x += s[i].vel.x;
				s[i].pos.y += s[i].vel.y;
				s[i].pos.z += s[i].vel.z;

				}



//		 center = vectors_add(center,s[i].pos);

//		center = vector_multiple(center,1.0f/float(n));
}
 
	 } catch (...) {

	 }

}

you see there that there are two loops each goes through all objects (except that second cant interact with itself)



#3 rmxhaha   Members   -  Reputation: 182

Like
0Likes
Like

Posted 23 July 2013 - 05:11 AM

I don't quite understand this code

 

 

This part is 

-0.001*G*(s[j].mass/(d*d))

I don't know what this equation is

 

I shall re explain some part that might be ambigious

 

I've built many parts of my physic engine and I have find a way to know which object collide with whichs on which side..

The problem is only when one object collide with more than 2 objects or

one object collide with another and that other object collide with yet another object...

 

The problem is in the equation I think

 

The problem only occur when that case I mention above

I can always make a game where it doesn't happen

but I want this problem ( Bug ) fixed

 

 

 

 

I am bit frustrated, I making building this physic engine while cutting corners everywhere and yet it's not up to the point where I want it to be

 

I still have many things on hand like A.I. , Animation, The viewport and other GL Stuff, Responsive background music, sound Fx, Database and much more ...

 

I am running a bit late on the schedule

I think that building this physic engine take something like a month, but it's been 5 weeks,,,

 

sorry for making you listen to my frustration... 


Edited by rmxhaha, 23 July 2013 - 05:15 AM.


#4 WiredCat   Members   -  Reputation: 239

Like
0Likes
Like

Posted 23 July 2013 - 09:53 AM

i dont know if it help but if you have code for collision between more than 2 objects you should do instancing, find the first object that colliudes \with another, collide with it, then apply collision between another object to collided model, but i think you didnt read whole article and ou use just only one piece of code.



#5 DT....   Members   -  Reputation: 487

Like
0Likes
Like

Posted 24 July 2013 - 03:07 PM

I am new here, hi to everyone

 

 

I made my physic engine and I finally reach the point where object resting on top of each other produce some kind of anomally which I kinda know what the cause is.

 

I try a few method from this series

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-2d-physics-engine-aabb-circle-impulse-resolution/

http://www.gamedev.net/page/resources/_/technical/game-programming/swept-aabb-collision-detection-and-response-r3084

 

But I kinda one of some little part of each tutorial and I even have my own method in some small part as well.

So I cannot really say which tutorial I follow..

 

I took ResolveCollision function from the first tutorial 

void ResolveCollision( Object A, Object B )
{
  // Calculate relative velocity
  Vec2 rv = B.velocity - A.velocity
 
  // Calculate relative velocity in terms of the normal direction
  float velAlongNormal = DotProduct( rv, normal )
 
  // Do not resolve if velocities are separating
  if(velAlongNormal > 0)
    return;
 
  // Calculate restitution
  float e = min( A.restitution, B.restitution)
 
  // Calculate impulse scalar
  float j = -(1 + e) * velAlongNormal
  j /= 1 / A.mass + 1 / B.mass
 
  // Apply impulse
  Vec2 impulse = j * normal
  A.velocity -= 1 / A.mass * impulse
  B.velocity += 1 / B.mass * impulse
}

I use this algorithm to solve impulse problem between 2 object

But the problem is when 1 object collide to another object and then that other object collide with another object and so on...

 

if it's just one object with another it's not so hard

but if one object collide with 2 or more object simultaneously there occur a problem I cannot solve,

I don't know, I haven't learn physic to that level

 

Can someone help me ?

Thanks for your reply in Advance...

 

 

 

You almost got it.  Just 2 things missing.

 

1)  An array/list of contact point information (contact normal, penetration depth, the objects involved, etc.)

2)  Solve each contact, several times.

 

Assuming "contactData" is the array of contacts, pseudocode would be:

 

 

for ( int iteration = 0; iteration < maxIterations; ++iteration )

{

    for ( int contactPoint = 0; contactPoint < numberOfContactPoints; ++contactPoint )

    {

        Object& a = contactData[ contactPoint ].ObjectA;

        Object& b = contactData[ contactPoint ].ObjectB;

 

        ResolveCollision( a, b );

    }

}



#6 Burnt_Fyr   Members   -  Reputation: 1230

Like
0Likes
Like

Posted 31 July 2013 - 10:44 AM

I don't quite understand this code

 

 

This part is 

-0.001*G*(s[j].mass/(d*d))

I don't know what this equation is

From over here, it appears to be integrating force ( f=ma = kg*m/s^2)






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS