Sto costruendo un motore fisico e ho avuto una sorta di "pseudo-verlet" che sta succedendo e volevo aggiornarlo a verlet "reale". Così ho trovato un articolo e mi sono messo al lavoro. Dopo aver aggiunto quello che penso sia una buona approssimazione, il motore non funziona più. Qualcuno può aiutarmi a capire cosa sto facendo male? aggiornamentoVerlet Integration sta facendo esplodere il mio motore fisico
La mia principale di classe corpo di fisica, applicare la forza, e applicare sistemi di impulso:
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: Ho risolto e funziona come un fascino, ma ho due domande circa la codice seguente:
- Il codice dell'applicazione degli impulsi è corretto e, in caso contrario, quale dovrebbe essere?
- Come si modifica la proprietà della posizione in modo che l'impostazione mantenga la velocità corrente del corpo?
Ecco il codice:
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;
}
Perché no: _accelerazione - = impulso; ? –
A dire il vero non ci pensavo ... Grazie! – RCIX