This site requires JavaScript, please enable it in your browser!
Greenfoot back

Report as inappropriate.

MTK
MTK presents ...

2009/11/5

Rigid Body Physics Engine

This is the rewritten, restructured, and reorganized version of my physics engine.

This time I decided to start with circles before I get to polygons.

The collisions do not affect the rotation yet. (But rotation already does affect the collision)

I also created better graphics in GIMP in which you can clearly see the rotation.

The arrow keys control the red ball.

*UPDATE* Proper collisions, but no friction yet

7383 views / 16 in the last 7 days

6 votes | 0 in the last 7 days

Tags: simulation physics with-source bounce collision engine balls

open in greenfoot
Your browser is ignoring the <APPLET> tag.
This is looking really great! The collisions seem to be working really well, and running the scenario for a long period of time doesn't seem to yield any problems :) Just out of curiosity, have you seen my Rigid Body physics engine?
MTKMTK

2009/11/8

Yes, I did see it. I am trying to figure out collisions with friction, now.
MTKMTK

2009/11/8

I created my own collision algorithm, but I have no idea how to implement rotation it it. norm = norm.unit(); PhysicsObject a = this; Vector2D ua = a.velocity; Vector2D ub = b.velocity; Vector2D uab = ua.subtract(ub); if(uab.dotProduct(norm) < 0) { double e = (a.elasticity + b.elasticity) / 2; double f = Math.min(a.friction, b.friction); Vector2D tang = norm.perpendicular(); Vector2D uaNorm = ua.projectOnto(norm); Vector2D uaTang = ua.projectOnto(tang); Vector2D ubNorm = ub.projectOnto(norm); Vector2D ubTang = ub.projectOnto(tang); Vector2D vaNorm = elasticCollision(uaNorm, a.mass, ubNorm, b.mass, e); Vector2D vbNorm = elasticCollision(ubNorm, b.mass, uaNorm, a.mass, e); Vector2D inelasticVTang = inelasticCollision(uaTang, a.mass, ubTang, b.mass); Vector2D vaTang = inelasticVTang.scale(f).add(uaTang.scale(1-f)); Vector2D vbTang = inelasticVTang.scale(f).add(ubTang.scale(1-f)); a.velocity = vaNorm.add(vaTang); b.velocity = vbNorm.add(vbTang); } I wonder if a solution would be to have a method that applies an impulse to a certain point on the body or something?
I think the impulse idea would work well. We know that since we are avoiding friction for the moment, a collision can only exert force along the normal. (And consequently with spheres, rotation does not occur) If we take into account friction, then there is a force tangential to the surface. Anyway, when you do impulse on a point, a percentage of that force goes into rotation, and the other percentage goes into translation. This is a bit more difficult for me though, since I do my simulating in a completely different matter, by simulating the elasticity and deformation of the object XD
MTKMTK

2009/11/9

For the impulse function, I guess you can find the normal velocity component and apply that to the object's linear velocity. But for the tangential component, I am not sure how to calculate how much of it will go into rotation and how much will go into translation.
MTKMTK

2009/11/9

As for now it seems to be working well with my impulse method idea, but no rotation yet...
birdguybirdguy

2009/11/24

about the incodent it is OK i have gone through this situation before
MTKMTK

2009/11/24

I don't understand what this is about and why you posted this in my scenario.
MTKMTK

2009/11/24

I don't understand what this is about and why you posted this in my scenario.
MTKMTK

2009/11/24

Oops, I accidentally clicked submit twice.

See all comments

Want to leave a comment? You must first log in.

Who likes this?

Entity1037 drhorriblejr Dreikäsehoch qnanqing Jamit4me Builderboy2005