Je construis un moteur de physique et j'ai eu une sorte de pseudo-verlet et je voulais le mettre à niveau vers un verlet "réel". J'ai donc trouvé un article et je me suis mis au travail. Après avoir ajouté ce que je pense être une bonne approximation, le moteur ne fonctionne plus. Quelqu'un peut-il m'aider à comprendre ce que je fais mal?L'intégration de Verlet fait exploser mon moteur physique
Ma principale mise à jour de classe du corps physique, appliquer une force, et appliquer les systèmes d'impulsion:
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Zero;
}
}
public void ApplyForce(Vector2 accelerationValue)
{
if (!this._isStatic)
_acceleration += (accelerationValue) * _mass;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
Edit: je l'ai fixé et il fonctionne comme un charme, mais j'ai deux questions sur la Le code suivant est-il:
- Le code d'application d'impulsion est-il correct, et si ce n'est pas le cas, que devrait-il être?
- Comment modifier la propriété de position de sorte que le réglage préserve la vitesse actuelle du corps?
Voici le code:
public Vector2 Position
{
get { return _position; }
set { _position = value;}
}
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 velocityChange = Vector2.Subtract(velocity, Vector2.Subtract(_lastPosition, _twoStepsAgoPosition));
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_twoStepsAgoPosition = _lastPosition;
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Multiply(velocityChange, timestepLength);
}
}
public void ApplyForce(Vector2 force)
{
if (!this._isStatic)
_lastPosition -= force;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
Pourquoi? ? –
Actualy n'a pas pensé à ça ... Merci! – RCIX