Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Verlet集成正在摧毁我的物理引擎_C#_.net_Xna_Physics - Fatal编程技术网

C# Verlet集成正在摧毁我的物理引擎

C# Verlet集成正在摧毁我的物理引擎,c#,.net,xna,physics,C#,.net,Xna,Physics,我正在建立一个物理引擎,我有一些“伪维莱特”的东西,我想升级到“真正的”维莱特。于是我找到了一篇文章,开始工作。在我添加了我认为是一个很好的近似值后,引擎不再工作了。有人能帮我理解我做错了什么吗 我的主要物理身体课程的更新、应用力和应用脉冲系统: public void Update(float timestepLength) { if (!this._isStatic) { Vector2 velocity = Vector2.Subtract(_positi

我正在建立一个物理引擎,我有一些“伪维莱特”的东西,我想升级到“真正的”维莱特。于是我找到了一篇文章,开始工作。在我添加了我认为是一个很好的近似值后,引擎不再工作了。有人能帮我理解我做错了什么吗

我的主要物理身体课程的更新、应用力和应用脉冲系统:

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;
}
编辑: 我已经修复了它,它就像一个符咒一样工作,但我对以下代码有两个问题:

  • 脉冲应用程序代码正确吗?如果不正确,应该是什么
  • 如何更改“位置”属性,以便将其设置为保留实体的当前速度
代码如下:

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;
}

作为对他人的参考。。。你可能提到的verlet论文是这样的:由创建杀手的团队制作,是最早使用碎布玩偶物理学的团队之一

无论如何。。。他们使用的原始代码是:

 void ParticleSystem::Verlet() {
       for(int i=0; i<NUM_PARTICLES; i++) {
             Vector3& x = m_x[i];
             Vector3 temp = x;
             Vector3& oldx = m_oldx[i];
             Vector3& a = m_a[i];
             x += x-oldx+a*fTimeStep*fTimeStep;
             oldx = temp;
       }
 }
void ParticleSystem::Verlet(){

对于(int i=0;i为什么不:_加速度-=pulse;?实际上我没有想到这一点……谢谢!我实际上是在使用它作为基础。发生的是,粒子根本不运动(在线性重力作用下),如果我用_加速度=Vector2.Zero;
行替换为_加速度=Vector2.Multiply(_加速度,1-_线性抹布);它的行为非常不寻常(粒子开始移动,然后当它们碰到一个约束,该约束将它们连接到一个它们从屏幕上倾斜下来的区域时,我怀疑它们的值很快就会被设置为NaN)。gamedev引用的文章后来移动到