RecastNavigationで、宛先に到達した後にエージェントをアイドル状態にするにはどうすればよいですか?


8

この質問は、特にRecastナビゲーションライブラリの取り扱いについてです。

でエージェントを追加し、addAgentそのターゲットをで設定しましたrequestMoveTarget。エージェントが宛先に到達すると停止しますが、(別のエージェントによって)押し出されると、ターゲットに戻ろうとします。代わりに、それを停止してアイドル状態にしたいので、他のエージェントがそれを脇に押して歩いたときに、元に戻らないようにします。

(エージェントが目的地に到達したかのように)近くにいることを求めてみresetMoveTargetましたagent.nposagent.targetPos、それは群衆シミュレーションの内部ロジックを壊しているようです-エージェントは古い方向に歩き続けるだけで、止まることはありません。

RecastNavigationでエージェントを停止してアイドル(まだプッシュ可能)になるように適切に指示するにはどうすればよいですか?

回答:


2

ソリューションに関連して上流で修正が行われ、で目的の速度がリセットされましたresetMoveTarget

bool dtCrowd::resetMoveTarget(const int idx)
 {
    if (idx < 0 || idx >= m_maxAgents)
        return false;

    dtCrowdAgent* ag = &m_agents[idx];

    // Initialize request.
    ag->targetRef = 0;
    dtVset(ag->targetPos, 0,0,0);
    dtVset(ag->dvel, 0,0,0); // <<-- This line added
    ag->targetPathqRef = DT_PATHQ_INVALID;
    ag->targetReplan = false;
    ag->targetState = DT_CROWDAGENT_TARGET_NONE;

    return true;
 }

私が思い出せる限り、これは不完全な答えです。よくわかりません。これは以下の私の答えに対する答えですか、それともコメントですか?エージェントの廊下もリセットする必要があるため、エージェントは本当にアイドル状態(プッシュ可能)になります。
Kromster

わかりました、エージェントがプッシュできなくなる問題を忘れていました。再現してみます。
Leif Gruenwoldt、2015年

@KromStern Hmmこれを再現するのに問題があります。cooridorリセットがないと、私のエージェントは他のエージェントによってプッシュできます。必要ですか?
Leif Gruenwoldt

これをresetMoveTargetローカルに追加してみましたが、違いは見られません。ag->corridor.reset(ag->corridor.getFirstPoly(), agent->npos);
Leif Gruenwoldt、2015年

1
何か奇妙な理由で、私もそれを再現することができません。それ以来、何かが変わったようです。とにかく、ご参加ありがとうございます!:)
Kromster

0

確かではありませんが、そのエージェントでゼロベクトルを使用して "requestMoveVelocity"も呼び出すと思います。試してみる。


0

注:この解決策は不必要なようですが、問題が再発する場合に備えて、私はそのままにしておきます。

多くのデコード、試行錯誤を繰り返した後、私はdtCrowd.resetMoveTargetベースとしてそれを変更する方法を見つけました:

procedure TKMTerrainNavigation.AgentTargetClear(aIdx: Integer);
var
  ag: PdtCrowdAgent;
begin
  ag := fRecastCrowd.getAgent(aIdx);

  ag.targetRef := 0;
  dtVset(@ag.targetPos[0], 0, 0, 0);
  ag.targetPathqRef := DT_PATHQ_INVALID;
  ag.targetReplan := False;
  ag.targetState := DT_CROWDAGENT_TARGET_NONE;

  // Reset desired velocity
  dtVset(@ag.dvel[0], 0, 0, 0); 

  // Reset agents corridor so that agent won't try to walk back to his last corner
  ag.ncorners := 0;
end;

PS上記のコードはDelphiにありますが、C ++でも同様に機能するはずです。

Recast Navigationの著者のコメント:

コーナーをリセットする代わりに、廊下をエージェントの現在位置と最初のポリゴンにリセットする必要があります。

ターゲットの位置をエージェントの現在の位置に設定することは、0、0、0に設定するよりも一般的に推奨されます。しかし、あなたは他のすべてもリセットしています、私はそれは大丈夫だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.