私は物理エンジンを構築していますが、私はある種の "疑似バレット"を使っていました。だから私は記事を見つけ、働くことになった。私は良い近似だと思うものを追加した後、エンジンはもう動作しません。誰かが私が間違っていることを理解するのを助けることができますか?Verletインテグレーションが物理エンジンを爆破しています
私の主な物理ボディクラスの更新は、力を加えて、インパルスシステムを適用します。
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;
}
編集: が、私はそれを修正しましたし、それは魔法のように動作しますが、私は約2つの質問があります次のコード:
- インパルスアプリケーションコードは正しいですか?
- 位置プロパティを変更すると、ボディの現在の速度が維持されます。ここで
コードです:他人への参照として
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;
}
なぜではないか:_加速 - =衝動; ? –
Actualy didntはそれを考える...ありがとう! – RCIX