Website Youtube GitHub

Mgear springnode gravity


#1

hi,

i added gravity to the spring node and want to ask some developers if my approach is right.
in the springnode.cpp i add a gravity float variable to the goalForce.y vector like in this code snippet.

...
float gravity = data.inputValue(aGravity, &status).asFloat();

// computation
MFloatVector velocity = (_currentPosition - _previousPosition) * (1.0 - damping);
//velocity.y += gravity;
MVector newPosition = _currentPosition + velocity;
MFloatVector goalForce = (goal - newPosition) * stiffness;
goalForce.y += gravity;
newPosition += goalForce;
...

would this be right?

it works (somehow), but when the gravity is too high, i loose a lot of dynamics and then it feels not so right anymore…


#2

Without digging in too deeply, it seems you are adding in gravity separately after the calculation and separate from the damping and stiffness. I would guess that the gravity should be included in the velocity calculation.

Otherwise it is overriding it, rather than properly contributing to the vector.

And to imagine why damping should also affect gravity, imagine long hair underwater.


#3

that was also my first thought, as seen in the commented line, where i add the gravity to the velocity.y vector.
(but that gave me strange dynamic update results in maya, especially with DG.)


#4

Your commented out line does the same thing. It adds after, and ignores any damping in the line:

MFloatVector velocity = (_currentPosition - _previousPosition) * (1.0 - damping);


#5

This is untested pseudo code, and I know nothing about the syntax of what I guess is C++? but I’d make gravity a vector, and include it in the velocity.

vector gravity = (0, data.inputValue(aGravity, &status).asFloat(), 0);

// computation
MFloatVector velocity = (_currentPosition - _previousPosition + gravity) * (1.0 - damping);
MVector newPosition = _currentPosition + velocity;
MFloatVector goalForce = (goal - newPosition) * stiffness;
newPosition += goalForce;

#6

thanks, i will try that approach…
i let you know if it works better…


#7

The thing I don’t know without testing, is how the goalForce works. The spring wants to travel back to it’s original position. So maybe I am totally wrong and including gravity before the goalForce might just not work.

But if that were the case, I would suspect you would still want to calculate dampened gravity first, and then override the goalForce with gravity again.

MFloatVector goalForce = (goal - newPosition) * (stiffness - gravity); or something… I’ll stop replying with guesses though! :slight_smile:


#8

on wiki https://en.m.wikipedia.org/wiki/Verlet_integration there is some code implementing gravity force, but this uses an accelaration vector…which i assume is the same as the velocity vector in mgear springnode computation…
the forces are added after the accelaration computation.
i have to try…