Improve crowd speed/acceleration/braking

Changed to values comparable to game.
Added sliders for acceleration and speed.
This commit is contained in:
Kawe Mazidjatari 2022-07-27 20:08:17 +02:00
parent 03698a4a5f
commit 88a29f2770
3 changed files with 23 additions and 8 deletions

View File

@ -105,8 +105,10 @@ CrowdToolState::CrowdToolState() :
m_toolParams.m_optimizeTopo = true; m_toolParams.m_optimizeTopo = true;
m_toolParams.m_obstacleAvoidance = true; m_toolParams.m_obstacleAvoidance = true;
m_toolParams.m_obstacleAvoidanceType = 3.0f; m_toolParams.m_obstacleAvoidanceType = 3.0f;
m_toolParams.m_separation = false; m_toolParams.m_separation = true;
m_toolParams.m_separationWeight = 2.0f; m_toolParams.m_separationWeight = 20.0f;
m_toolParams.m_maxAcceleration = 800.f;
m_toolParams.m_maxSpeed = 200.f;
memset(m_trails, 0, sizeof(m_trails)); memset(m_trails, 0, sizeof(m_trails));
@ -630,10 +632,10 @@ void CrowdToolState::addAgent(const float* p)
memset(&ap, 0, sizeof(ap)); memset(&ap, 0, sizeof(ap));
ap.radius = m_sample->getAgentRadius(); ap.radius = m_sample->getAgentRadius();
ap.height = m_sample->getAgentHeight(); ap.height = m_sample->getAgentHeight();
ap.maxAcceleration = 8.0f; ap.maxAcceleration = m_toolParams.m_maxAcceleration;
ap.maxSpeed = 3.5f; ap.maxSpeed = m_toolParams.m_maxSpeed;
ap.collisionQueryRange = ap.radius * 12.0f; ap.collisionQueryRange = ap.radius * 50.0f;
ap.pathOptimizationRange = ap.radius * 30.0f; ap.pathOptimizationRange = ap.radius * 300.0f;
ap.updateFlags = 0; ap.updateFlags = 0;
if (m_toolParams.m_anticipateTurns) if (m_toolParams.m_anticipateTurns)
ap.updateFlags |= DT_CROWD_ANTICIPATE_TURNS; ap.updateFlags |= DT_CROWD_ANTICIPATE_TURNS;
@ -804,6 +806,8 @@ void CrowdToolState::updateAgentParams()
params.updateFlags = updateFlags; params.updateFlags = updateFlags;
params.obstacleAvoidanceType = obstacleAvoidanceType; params.obstacleAvoidanceType = obstacleAvoidanceType;
params.separationWeight = m_toolParams.m_separationWeight; params.separationWeight = m_toolParams.m_separationWeight;
params.maxAcceleration = m_toolParams.m_maxAcceleration;
params.maxSpeed = m_toolParams.m_maxSpeed;
crowd->updateAgentParameters(i, &params); crowd->updateAgentParameters(i, &params);
} }
} }
@ -924,7 +928,15 @@ void CrowdTool::handleMenu()
params->m_separation = !params->m_separation; params->m_separation = !params->m_separation;
m_state->updateAgentParams(); m_state->updateAgentParams();
} }
if (imguiSlider("Separation Weight", &params->m_separationWeight, 0.0f, 20.0f, 0.01f)) if (imguiSlider("Separation Weight", &params->m_separationWeight, 0.0f, 200.0f, 0.01f))
{
m_state->updateAgentParams();
}
if (imguiSlider("Max Acceleration", &params->m_maxAcceleration, 0.0f, 2000.0f, 0.01f))
{
m_state->updateAgentParams();
}
if (imguiSlider("Max Speed", &params->m_maxSpeed, 0.0f, 2000.0f, 0.01f))
{ {
m_state->updateAgentParams(); m_state->updateAgentParams();
} }

View File

@ -52,6 +52,9 @@ struct CrowdToolParams
float m_obstacleAvoidanceType; float m_obstacleAvoidanceType;
bool m_separation; bool m_separation;
float m_separationWeight; float m_separationWeight;
float m_maxAcceleration;
float m_maxSpeed;
}; };
class CrowdToolState : public SampleToolState class CrowdToolState : public SampleToolState

View File

@ -1200,7 +1200,7 @@ void dtCrowd::update(const float dt, dtCrowdAgentDebugInfo* debug)
calcStraightSteerDirection(ag, dvel); calcStraightSteerDirection(ag, dvel);
// Calculate speed scale, which tells the agent to slowdown at the end of the path. // Calculate speed scale, which tells the agent to slowdown at the end of the path.
const float slowDownRadius = ag->params.radius*2; // TODO: make less hacky. const float slowDownRadius = ag->params.radius*4; // TODO: make less hacky.
const float speedScale = getDistanceToGoal(ag, slowDownRadius) / slowDownRadius; const float speedScale = getDistanceToGoal(ag, slowDownRadius) / slowDownRadius;
ag->desiredSpeed = ag->params.maxSpeed; ag->desiredSpeed = ag->params.maxSpeed;