Estoy construyendo un motor de física y tenía algo así como "pseudo-verlet" y quería actualizarlo a verlet "real". Entonces encontré un artículo y me puse a trabajar. Después de agregar lo que creo que es una buena aproximación, el motor ya no funciona. ¿Alguien puede ayudarme a entender lo que estoy haciendo mal? actualizaciónVerlet La integración está volando mi motor de física
Mi principal de carrocería clase de física, se aplica la fuerza, y aplicar sistemas de 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;
}
Editar: lo he arreglado y funciona como un encanto, pero tengo dos preguntas sobre el código siguiente:
- ¿Es correcto el código de la aplicación de impulso y, de no ser así, cuál debería ser?
- ¿Cómo cambio la propiedad de posición para que la configuración preserve la velocidad actual del cuerpo?
Aquí está el código:
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;
}
¿Por qué no? _acceleration - = impulse; ? –
En realidad, no pensé en eso ... ¡Gracias! – RCIX