Buduję silnik fizyki i miałem coś w rodzaju "pseudo-verlet" i chcę go ulepszyć do "prawdziwego" verleta. Więc znalazłem artykuł i gotowe do pracy. Po dodaniu tego, co uważam za dobre przybliżenie, silnik przestał działać. Czy ktoś może mi pomóc zrozumieć, co robię źle? AktualizacjaVerlet Integration wysadza mój silnik fizyki
mojego główne klasy body fizyki za zastosować siłę i zastosować układy impulsowe:
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: Naprawiłem go i działa jak czar, ale mam dwa pytania o następujący kod:
- Czy kod aplikacji impulsu jest poprawny, a jeśli nie, jaki powinien być?
- Jak zmienić właściwość pozycji, aby ustawienie zachowywało bieżącą prędkość ciała?
Oto kod:
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;
}
Dlaczego nie: _acceleration - = impuls; ? –
Actualy nie pomyślał o tym ... Dzięki! – RCIX