Jump to content

View more

Image of the Day

Inventory ! Va falloir trouver une autre couleur pour le cadre D: #AzTroScreenshot #screenshotsaturday https://t.co/PvxhGL7cOH
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.


Sign up now

Impulse resolution and position correction

4: Adsense

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
No replies to this topic

#1 Tweezy   Members   

106
Like
0Likes
Like

Posted 05 March 2014 - 01:14 PM

**Please delete duplicate post in the maths section, realised I posted it incorrectly**

Details:
 
C++
SFML
2D Platformer
 
Position correction and Impulse Resolution Issue:
 
Hello all. I am having some issues with my impulse resolution. So far I have an intersection test which returns whenever two AABB objects have collided. This works perfectly. 
 
Next, when the two objects have intersected, I need to do impulse resolution and then position correction to move the dynamic object in a certain manor. So far I have it working perfectly on the two sides:
 
x_axis.jpg
 
The arrows indicate that the response works fine on these axis's.
 
Some code!
 
 
// ---- Calculating normals in x and y
float a, b, otherA, otherB;
 
a = max.y - min.y;
b = min.x - max.x;
 
otherA = other.max.y - other.min.y;
otherB = other.min.x - other.max.x;
 
float magnitude = sqrt(a*a) + (b* b); 
float magnitudeOther = sqrt(otherA * otherA) + (otherB * otherB); 
 
vector2D normal=(a/magnitude,b/magnitude); 
vector2D normalOther(otherA / magnitudeOther, otherB / magnitudeOther);
 
The first thing I do is calculate my normals which I use later on for my correction.
 
 
// ---- Masses so I can use inverse mass - hard coded for now
 
float m, mOther, inverse, inverseOther;
m = 50;
mOther = 50;
inverse = 1.f/m;
inverseOther = 1.f/mOther;
The next thing I do is calculate my extents:
 
vector2D extent, otherExtent;
	
	extent = min.add(max).scale(0.5f);
	otherExtent = other.min.add(other.max).scale(0.5f);

	float e = 0.6;
	float slop = 0.01;
	float percentage = 0.1;

From here I now work out my impulse resolution and position correction:
 
vector2D correction, pd, j;	

pd.x = (extent.x + otherExtent.x) - (other.getPosition().x - getPosition().x); // penetration in X - need to double check this
pd.y = (extent.y + otherExtent.y) - (other.getPosition().y - getPosition().y); // penetration in Y

correction.y = (std::max(pd.x-slop,0.00f) / (inverse + inverseOther))* percentage * normal.x; //  correction based on the max of pen - by the slop. Percentage for overlap
correction.y = (std::max(pd.y-slop,0.00f) / (inverse + inverseOther))* percentage * normal.y;
	
j.x = -(1.f + e) + (minus(other.vel).dotProduct(normal)) / inverse + inverseOther;
j.y = -(1.f + e) + (minus(other.vel).dotProduct(normal)) / inverse + inverseOther;

From here I apply the code to my velocity in Y using j.y + correction.y, this in turn results my dynamic object resting on my static object with a little bit of bounce, which is wrong. It needs to be resting there perfectly so allow clean movement. Little stuck on what to do next.




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.