0

私は、力を使って体をウェイポイントに押し込むパスファインディングを行っています。ただし、ウェイポイントに十分近づいたら、力をキャンセルしたいと思います。これどうやってするの?問題の体に加えたすべての力を個別に維持する必要がありますか?

Box2dx(C#/ XNA)を使用しています。

これが私の試みですが、まったく機能しません。

   internal PathProgressionStatus MoveAlongPath(PositionUpdater posUpdater)
    {
        Vector2 nextGoal = posUpdater.Goals.Peek();
        Vector2 currPos = posUpdater.Model.Body.Position;
        float distanceToNextGoal = Vector2.Distance(currPos, nextGoal);
        bool isAtGoal = distanceToNextGoal < PROXIMITY_THRESHOLD;

        Vector2 forceToApply = new Vector2();
        double angleToGoal = Math.Atan2(nextGoal.Y - currPos.Y, nextGoal.X - currPos.X);
        forceToApply.X = (float)Math.Cos(angleToGoal) * posUpdater.Speed;
        forceToApply.Y = (float)Math.Sin(angleToGoal) * posUpdater.Speed;

        float rotation = (float)(angleToGoal + Math.PI / 2);

        posUpdater.Model.Body.Rotation = rotation;

        if (!isAtGoal)
        {
            posUpdater.Model.Body.ApplyForce(forceToApply, posUpdater.Model.Body.Position);
            posUpdater.forcedTowardsGoal = true;
        }

        if (isAtGoal)
        {
            // how can the body be stopped?

            posUpdater.forcedTowardsGoal = false;
            //posUpdater.Model.Body.SetLinearVelocity(new Vector2(0, 0));
            //posUpdater.Model.Body.ApplyForce(-forceToApply, posUpdater.Model.Body.GetPosition());
            posUpdater.Goals.Dequeue();

            if (posUpdater.Goals.Count == 0)
            {
                return PathProgressionStatus.COMPLETE;
            }
        }

アップデート

加えた力を追跡していると、それに作用する可能性のある他の力を考慮できません。

反射を使用して_force直接ゼロに設定することもできますが、それは汚い感じがします。

4

1 に答える 1

0

体の死を止めたい (体に作用するすべての力をキャンセルする) だけなら、単にスリープ状態にすることができます:

posUpdater.Model.Body.SetAwake( false )

これにより、ボディの直線力と角力および速度がクリアされます。また、眠っている体は他の眠っている体と衝突せず、物理学が効果的にオフになっているため、一般に CPU 時間の消費が少なくなります。

死んでしまった体を実際に物理に参加させたい場合は、すぐに目を覚ますだけです。

posUpdater.Model.Body.SetAwake( false )
posUpdater.Model.Body.SetAwake( true)

もちろん、体が他のものと衝突している最中だった場合、これは「不自然な」見た目の結果につながる可能性があります。

于 2010-04-01T22:09:36.300 に答える