mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 08:21:24 +02:00
enable vertical thrust while walking
This commit is contained in:
parent
8e3b31a5e5
commit
9b7bf97891
1 changed files with 24 additions and 30 deletions
|
@ -187,40 +187,34 @@ void CharacterController::playerStep(btCollisionWorld* dynaWorld, btScalar dt) {
|
||||||
desiredVelocity = btVector3(0.0f, 0.0f, 0.0f);
|
desiredVelocity = btVector3(0.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decompose into horizontal and vertical components.
|
|
||||||
btVector3 actualVertVelocity = actualVelocity.dot(_currentUp) * _currentUp;
|
|
||||||
btVector3 actualHorizVelocity = actualVelocity - actualVertVelocity;
|
|
||||||
btVector3 desiredVertVelocity = desiredVelocity.dot(_currentUp) * _currentUp;
|
|
||||||
btVector3 desiredHorizVelocity = desiredVelocity - desiredVertVelocity;
|
|
||||||
|
|
||||||
btVector3 finalVelocity;
|
btVector3 finalVelocity;
|
||||||
|
const btScalar FLY_ACCELERATION_TIMESCALE = 0.2f;
|
||||||
|
|
||||||
switch (_state) {
|
if (_state == State::Hover) {
|
||||||
case State::Ground:
|
// simple case
|
||||||
case State::Takeoff:
|
btScalar tau = dt / FLY_ACCELERATION_TIMESCALE;
|
||||||
{
|
finalVelocity = tau * desiredVelocity + (1.0f - tau) * actualVelocity;
|
||||||
// horizontal ground control
|
} else {
|
||||||
const btScalar WALK_ACCELERATION_TIMESCALE = 0.1f;
|
// ground states require special handling of horizontal and vertical components
|
||||||
btScalar tau = dt / WALK_ACCELERATION_TIMESCALE;
|
btVector3 actualVertVelocity = actualVelocity.dot(_currentUp) * _currentUp;
|
||||||
finalVelocity = tau * desiredHorizVelocity + (1.0f - tau) * actualHorizVelocity + actualVertVelocity;
|
btVector3 actualHorizVelocity = actualVelocity - actualVertVelocity;
|
||||||
|
btVector3 desiredVertVelocity = desiredVelocity.dot(_currentUp) * _currentUp;
|
||||||
|
btVector3 desiredHorizVelocity = desiredVelocity - desiredVertVelocity;
|
||||||
|
|
||||||
|
// horizontal part
|
||||||
|
const btScalar WALK_ACCELERATION_TIMESCALE = 0.1f;
|
||||||
|
const btScalar IN_AIR_ACCELERATION_TIMESCALE = 2.0f;
|
||||||
|
btScalar timescale = (_state == State::InAir) ? IN_AIR_ACCELERATION_TIMESCALE : WALK_ACCELERATION_TIMESCALE;
|
||||||
|
btScalar tau = dt / timescale;
|
||||||
|
finalVelocity = tau * desiredHorizVelocity + (1.0f - tau) * actualHorizVelocity;
|
||||||
|
|
||||||
|
// only blend vertical part if the target velocity has non-zero vertical component
|
||||||
|
const btScalar MIN_VERT_TARGET_SPEED_SQUARED = 1.0e-6; // 1mm/sec
|
||||||
|
if (desiredVertVelocity.length2() > MIN_VERT_TARGET_SPEED_SQUARED) {
|
||||||
|
tau = dt / FLY_ACCELERATION_TIMESCALE;
|
||||||
|
finalVelocity += tau * desiredVertVelocity + (1.0f - tau) * actualVertVelocity;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case State::InAir:
|
|
||||||
{
|
|
||||||
// horizontal air control
|
|
||||||
const btScalar IN_AIR_ACCELERATION_TIMESCALE = 2.0f;
|
|
||||||
btScalar tau = dt / IN_AIR_ACCELERATION_TIMESCALE;
|
|
||||||
finalVelocity = tau * desiredHorizVelocity + (1.0f - tau) * actualHorizVelocity + actualVertVelocity;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case State::Hover:
|
|
||||||
{
|
|
||||||
// vertical and horizontal air control
|
|
||||||
const btScalar FLY_ACCELERATION_TIMESCALE = 0.2f;
|
|
||||||
btScalar tau = dt / FLY_ACCELERATION_TIMESCALE;
|
|
||||||
finalVelocity = tau * desiredVelocity + (1.0f - tau) * actualVelocity;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_rigidBody->setLinearVelocity(finalVelocity + _parentVelocity);
|
_rigidBody->setLinearVelocity(finalVelocity + _parentVelocity);
|
||||||
|
|
Loading…
Reference in a new issue