From 245729cba8eb81827c57c2c844b360013837bbb3 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 1 Apr 2015 13:47:40 -0700 Subject: [PATCH 1/5] fix for avatar unable to jump into hover on mac --- interface/src/Application.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7bab72ff0d..b58b253964 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -970,9 +970,7 @@ void Application::keyPressEvent(QKeyEvent* event) { case Qt::Key_E: case Qt::Key_PageUp: - if (!_myAvatar->getDriveKeys(UP)) { - _myAvatar->jump(); - } + _myAvatar->jump(); _myAvatar->setDriveKeys(UP, 1.0f); break; From 0249b8c9c5927fcd52d5cdc4fe059335f1bba7e0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 1 Apr 2015 13:56:05 -0700 Subject: [PATCH 2/5] fix backwards comparison logic --- libraries/physics/src/CharacterController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index f8c8e31ece..6705aab828 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -696,7 +696,7 @@ void CharacterController::jump() { } else { quint64 now = usecTimestampNow(); const quint64 JUMP_TO_HOVER_PERIOD = USECS_PER_SECOND; - if (now - _jumpToHoverStart < JUMP_TO_HOVER_PERIOD) { + if (now - _jumpToHoverStart > JUMP_TO_HOVER_PERIOD) { _isHovering = true; } } From b37384d7590726c49773ec38a2cc2665ef10cc21 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 1 Apr 2015 15:13:27 -0700 Subject: [PATCH 3/5] exit hover now not quite automatic when over floor remove MyAvatar::jump() method for more general API --- interface/src/Application.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 9 ++++++++ interface/src/avatar/MyAvatar.h | 3 ++- libraries/physics/src/CharacterController.cpp | 23 +++++++++++++++---- libraries/physics/src/CharacterController.h | 2 ++ 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b58b253964..dfc966de8e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -970,7 +970,6 @@ void Application::keyPressEvent(QKeyEvent* event) { case Qt::Key_E: case Qt::Key_PageUp: - _myAvatar->jump(); _myAvatar->setDriveKeys(UP, 1.0f); break; @@ -2205,6 +2204,7 @@ void Application::update(float deltaTime) { { PerformanceTimer perfTimer("physics"); + _myAvatar->relayDriveKeysToCharacterController(); _physicsEngine.stepSimulation(); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 26b777b35b..87ebac366c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1452,3 +1452,12 @@ void MyAvatar::clearDriveKeys() { _driveKeys[i] = 0.0f; } } + +void MyAvatar::relayDriveKeysToCharacterController() { + if (_driveKeys[UP] > 0.0f) { + _characterController.jump(); + } + if (_driveKeys[DOWN] > 0.0f) { + _characterController.stopHover(); + } +} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 99c0bdb5df..2bc3a4e4ba 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -87,8 +87,9 @@ public: void clearDriveKeys(); void setDriveKeys(int key, float val) { _driveKeys[key] = val; }; bool getDriveKeys(int key) { return _driveKeys[key] != 0.0f; }; - void jump() { _characterController.jump(); } + void relayDriveKeysToCharacterController(); + bool isMyAvatar() { return true; } bool isLookingAtLeftEye(); diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 6705aab828..562d3f204e 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -26,6 +26,7 @@ const uint32_t PENDING_FLAG_ADD_TO_SIMULATION = 1U << 0; const uint32_t PENDING_FLAG_REMOVE_FROM_SIMULATION = 1U << 1; const uint32_t PENDING_FLAG_UPDATE_SHAPE = 1U << 2; const uint32_t PENDING_FLAG_JUMP = 1U << 3; +const uint32_t PENDING_FLAG_STOP_HOVER = 1U << 4; // static helper method static btVector3 getNormalizedVector(const btVector3& v) { @@ -214,7 +215,7 @@ btVector3 CharacterController::perpindicularComponent(const btVector3& direction const btVector3 LOCAL_UP_AXIS(0.0f, 1.0f, 0.0f); const float DEFAULT_GRAVITY = 5.0f; const float TERMINAL_VELOCITY = 55.0f; -const float JUMP_SPEED = 5.0f; +const float JUMP_SPEED = 4.0f; CharacterController::CharacterController(AvatarData* avatarData) { assert(avatarData); @@ -229,8 +230,8 @@ CharacterController::CharacterController(AvatarData* avatarData) { _velocityTimeInterval = 0.0f; _verticalVelocity = 0.0f; _verticalOffset = 0.0f; - _gravity = DEFAULT_GRAVITY; // slower than Earth's - _maxFallSpeed = TERMINAL_VELOCITY; // Terminal velocity of a sky diver in m/s. + _gravity = DEFAULT_GRAVITY; + _maxFallSpeed = TERMINAL_VELOCITY; _jumpSpeed = JUMP_SPEED; _isOnGround = false; _isJumping = false; @@ -362,15 +363,18 @@ void CharacterController::scanDown(btCollisionWorld* world) { btVector3 start = _currentPosition; const btScalar MAX_SCAN_HEIGHT = 20.0f + _halfHeight + _radius; // closest possible floor for disabling hover - const btScalar MIN_HOVER_HEIGHT = 3.0f + _halfHeight + _radius; // distance to floor for enabling hover + const btScalar MIN_HOVER_HEIGHT = 2.0f + _halfHeight + _radius; // distance to floor for enabling hover btVector3 end = start - MAX_SCAN_HEIGHT * _currentUp; world->rayTest(start, end, callback); if (!callback.hasHit()) { _isHovering = true; - } else if (_isHovering && callback.m_closestHitFraction * MAX_SCAN_HEIGHT < MIN_HOVER_HEIGHT) { + } else if (_isHovering && + callback.m_closestHitFraction * MAX_SCAN_HEIGHT < MIN_HOVER_HEIGHT && + (_pendingFlags & PENDING_FLAG_STOP_HOVER)) { _isHovering = false; } + _pendingFlags &= ~ PENDING_FLAG_STOP_HOVER; } void CharacterController::stepUp(btCollisionWorld* world) { @@ -529,6 +533,7 @@ void CharacterController::stepDown(btCollisionWorld* collisionWorld, btScalar dt _verticalVelocity = 0.0f; _verticalOffset = 0.0f; _isJumping = false; + _isHovering = false; _isOnGround = true; } else if (!_isJumping) { // sweep again for floor within downStep threshold @@ -555,6 +560,7 @@ void CharacterController::stepDown(btCollisionWorld* collisionWorld, btScalar dt _verticalVelocity = 0.0f; _verticalOffset = 0.0f; _isJumping = false; + _isHovering = false; _isOnGround = true; } else { // nothing to step down on @@ -583,6 +589,7 @@ void CharacterController::reset(btCollisionWorld* collisionWorld) { _verticalOffset = 0.0; _isOnGround = false; _isJumping = false; + _isHovering = true; _walkDirection.setValue(0,0,0); _velocityTimeInterval = 0.0; @@ -698,11 +705,16 @@ void CharacterController::jump() { const quint64 JUMP_TO_HOVER_PERIOD = USECS_PER_SECOND; if (now - _jumpToHoverStart > JUMP_TO_HOVER_PERIOD) { _isHovering = true; + _verticalVelocity = 0.0f; } } } } +void CharacterController::stopHover() { + _pendingFlags |= PENDING_FLAG_STOP_HOVER; +} + void CharacterController::setGravity(btScalar gravity) { _gravity = gravity; } @@ -781,6 +793,7 @@ void CharacterController::setEnabled(bool enabled) { // Setting the ADD bit here works for all cases so we don't even bother checking other bits. _pendingFlags |= PENDING_FLAG_ADD_TO_SIMULATION; _isHovering = true; + _verticalVelocity = 0.0f; } else { if (_dynamicsWorld) { _pendingFlags |= PENDING_FLAG_REMOVE_FROM_SIMULATION; diff --git a/libraries/physics/src/CharacterController.h b/libraries/physics/src/CharacterController.h index e4e73b6d3f..5c74c874eb 100644 --- a/libraries/physics/src/CharacterController.h +++ b/libraries/physics/src/CharacterController.h @@ -148,6 +148,8 @@ public: virtual void jump(); virtual bool onGround() const; + void stopHover(); + void setMaxFallSpeed(btScalar speed); void setJumpSpeed(btScalar jumpSpeed); void setMaxJumpHeight(btScalar maxJumpHeight); From f804b2311d091b9a40aedcae57e998df75747ce2 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 2 Apr 2015 08:40:47 -0700 Subject: [PATCH 4/5] remove hover-friendly behavior --- interface/src/avatar/MyAvatar.cpp | 3 --- libraries/physics/src/CharacterController.cpp | 12 ++---------- libraries/physics/src/CharacterController.h | 2 -- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 87ebac366c..f92523c58f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1457,7 +1457,4 @@ void MyAvatar::relayDriveKeysToCharacterController() { if (_driveKeys[UP] > 0.0f) { _characterController.jump(); } - if (_driveKeys[DOWN] > 0.0f) { - _characterController.stopHover(); - } } diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 562d3f204e..9188ce8fc0 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -26,7 +26,6 @@ const uint32_t PENDING_FLAG_ADD_TO_SIMULATION = 1U << 0; const uint32_t PENDING_FLAG_REMOVE_FROM_SIMULATION = 1U << 1; const uint32_t PENDING_FLAG_UPDATE_SHAPE = 1U << 2; const uint32_t PENDING_FLAG_JUMP = 1U << 3; -const uint32_t PENDING_FLAG_STOP_HOVER = 1U << 4; // static helper method static btVector3 getNormalizedVector(const btVector3& v) { @@ -363,18 +362,15 @@ void CharacterController::scanDown(btCollisionWorld* world) { btVector3 start = _currentPosition; const btScalar MAX_SCAN_HEIGHT = 20.0f + _halfHeight + _radius; // closest possible floor for disabling hover - const btScalar MIN_HOVER_HEIGHT = 2.0f + _halfHeight + _radius; // distance to floor for enabling hover + const btScalar MIN_HOVER_HEIGHT = 3.0f + _halfHeight + _radius; // distance to floor for enabling hover btVector3 end = start - MAX_SCAN_HEIGHT * _currentUp; world->rayTest(start, end, callback); if (!callback.hasHit()) { _isHovering = true; - } else if (_isHovering && - callback.m_closestHitFraction * MAX_SCAN_HEIGHT < MIN_HOVER_HEIGHT && - (_pendingFlags & PENDING_FLAG_STOP_HOVER)) { + } else if (_isHovering && callback.m_closestHitFraction * MAX_SCAN_HEIGHT < MIN_HOVER_HEIGHT) { _isHovering = false; } - _pendingFlags &= ~ PENDING_FLAG_STOP_HOVER; } void CharacterController::stepUp(btCollisionWorld* world) { @@ -711,10 +707,6 @@ void CharacterController::jump() { } } -void CharacterController::stopHover() { - _pendingFlags |= PENDING_FLAG_STOP_HOVER; -} - void CharacterController::setGravity(btScalar gravity) { _gravity = gravity; } diff --git a/libraries/physics/src/CharacterController.h b/libraries/physics/src/CharacterController.h index 5c74c874eb..e4e73b6d3f 100644 --- a/libraries/physics/src/CharacterController.h +++ b/libraries/physics/src/CharacterController.h @@ -148,8 +148,6 @@ public: virtual void jump(); virtual bool onGround() const; - void stopHover(); - void setMaxFallSpeed(btScalar speed); void setJumpSpeed(btScalar jumpSpeed); void setMaxJumpHeight(btScalar maxJumpHeight); From f4f219ca36d76ad18412eb9c62b907e7317f2d76 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 2 Apr 2015 09:03:33 -0700 Subject: [PATCH 5/5] tweak jump velocity and hover transition --- libraries/physics/src/CharacterController.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 9188ce8fc0..cdff02820d 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -214,7 +214,7 @@ btVector3 CharacterController::perpindicularComponent(const btVector3& direction const btVector3 LOCAL_UP_AXIS(0.0f, 1.0f, 0.0f); const float DEFAULT_GRAVITY = 5.0f; const float TERMINAL_VELOCITY = 55.0f; -const float JUMP_SPEED = 4.0f; +const float JUMP_SPEED = 3.5f; CharacterController::CharacterController(AvatarData* avatarData) { assert(avatarData); @@ -633,8 +633,13 @@ void CharacterController::playerStep(btCollisionWorld* collisionWorld, btScalar // Update fall velocity. if (_isHovering) { - const btScalar HOVER_RELAXATION_TIMESCALE = 1.0f; - _verticalVelocity *= (1.0f - dt / HOVER_RELAXATION_TIMESCALE); + const btScalar MIN_HOVER_VERTICAL_VELOCITY = 0.1f; + if (fabsf(_verticalVelocity) < MIN_HOVER_VERTICAL_VELOCITY) { + _verticalVelocity = 0.0f; + } else { + const btScalar HOVER_RELAXATION_TIMESCALE = 0.8f; + _verticalVelocity *= (1.0f - dt / HOVER_RELAXATION_TIMESCALE); + } } else { _verticalVelocity -= _gravity * dt; if (_verticalVelocity > _jumpSpeed) { @@ -701,7 +706,6 @@ void CharacterController::jump() { const quint64 JUMP_TO_HOVER_PERIOD = USECS_PER_SECOND; if (now - _jumpToHoverStart > JUMP_TO_HOVER_PERIOD) { _isHovering = true; - _verticalVelocity = 0.0f; } } }