more prep for shifting avatar during HMD motion

This commit is contained in:
Andrew Meadows 2015-10-22 11:46:55 -07:00
parent 24c2f538a4
commit 43aac813da
5 changed files with 27 additions and 12 deletions

View file

@ -114,7 +114,6 @@ MyAvatar::MyAvatar(RigPointer rig) :
,_hmdAtRestDetector(glm::vec3(0), glm::quat()) ,_hmdAtRestDetector(glm::vec3(0), glm::quat())
#else #else
,_avatarOffsetFromHMD(0.0f) ,_avatarOffsetFromHMD(0.0f)
,_hmdVelocity(0.0f)
#endif // OLD_HMD_TRACKER #endif // OLD_HMD_TRACKER
{ {
for (int i = 0; i < MAX_DRIVE_KEYS; i++) { for (int i = 0; i < MAX_DRIVE_KEYS; i++) {
@ -375,9 +374,16 @@ void MyAvatar::updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix) {
} }
followHMD(deltaTime); followHMD(deltaTime);
#else
// TODO adebug BOOKMARK -- this is where we need to add the new code for HMD_TRACKER
#endif // OLD_HMD_TRACKER #endif // OLD_HMD_TRACKER
} }
glm::vec3 MyAvatar::getHMDCorrectionVelocity() const {
// TODO: impelement this
return Vectors::ZERO;
}
#ifdef OLD_HMD_TRACKER #ifdef OLD_HMD_TRACKER
void MyAvatar::beginFollowingHMD() { void MyAvatar::beginFollowingHMD() {
// begin homing toward derived body position. // begin homing toward derived body position.
@ -433,10 +439,6 @@ void MyAvatar::followHMD(float deltaTime) {
_bodySensorMatrix = createMatFromQuatAndPos(rot, pos); _bodySensorMatrix = createMatFromQuatAndPos(rot, pos);
} }
} }
}
#else
void MyAvatar::harvestHMDOffset(glm::vec3 offset) {
} }
#endif // USE_OLD #endif // USE_OLD
@ -1292,7 +1294,7 @@ void MyAvatar::prepareForPhysicsSimulation() {
relayDriveKeysToCharacterController(); relayDriveKeysToCharacterController();
_characterController.setTargetVelocity(getTargetVelocity()); _characterController.setTargetVelocity(getTargetVelocity());
_characterController.setAvatarPositionAndOrientation(getPosition(), getOrientation()); _characterController.setAvatarPositionAndOrientation(getPosition(), getOrientation());
//_characterController.setHMDVelocity(hmdVelocity); _characterController.setHMDVelocity(getHMDCorrectionVelocity());
} }
void MyAvatar::harvestResultsFromPhysicsSimulation() { void MyAvatar::harvestResultsFromPhysicsSimulation() {
@ -1301,6 +1303,9 @@ void MyAvatar::harvestResultsFromPhysicsSimulation() {
_characterController.getAvatarPositionAndOrientation(position, orientation); _characterController.getAvatarPositionAndOrientation(position, orientation);
nextAttitude(position, orientation); nextAttitude(position, orientation);
setVelocity(_characterController.getLinearVelocity()); setVelocity(_characterController.getLinearVelocity());
// adebug TODO: harvest HMD shift here
//glm::vec3 hmdShift = _characterController.getHMDShift();
} }
QString MyAvatar::getScriptedMotorFrame() const { QString MyAvatar::getScriptedMotorFrame() const {

View file

@ -76,6 +76,8 @@ public:
// as it moves through the world. // as it moves through the world.
void updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix); void updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix);
glm::vec3 getHMDCorrectionVelocity() const;
// best called at end of main loop, just before rendering. // best called at end of main loop, just before rendering.
// update sensor to world matrix from current body position and hmd sensor. // update sensor to world matrix from current body position and hmd sensor.
// This is so the correct camera can be used for rendering. // This is so the correct camera can be used for rendering.
@ -272,8 +274,6 @@ private:
void beginFollowingHMD(); void beginFollowingHMD();
bool shouldFollowHMD() const; bool shouldFollowHMD() const;
void followHMD(float deltaTime); void followHMD(float deltaTime);
#else
void harvestHMDOffset(glm::vec3 offset);
#endif #endif
bool cameraInsideHead() const; bool cameraInsideHead() const;
@ -376,7 +376,6 @@ private:
bool _lastIsMoving { false }; bool _lastIsMoving { false };
#else #else
glm::vec3 _avatarOffsetFromHMD; glm::vec3 _avatarOffsetFromHMD;
glm::vec3 _hmdVelocity;
#endif // OLD_HMD_TRACKER #endif // OLD_HMD_TRACKER
}; };

View file

@ -16,7 +16,6 @@
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h> #include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
#include <LinearMath/btDefaultMotionState.h> #include <LinearMath/btDefaultMotionState.h>
#include <BulletUtil.h>
#include <GLMHelpers.h> #include <GLMHelpers.h>
#include <PhysicsLogging.h> #include <PhysicsLogging.h>
#include <PhysicsCollisionGroups.h> #include <PhysicsCollisionGroups.h>
@ -161,6 +160,17 @@ void MyCharacterController::playerStep(btCollisionWorld* dynaWorld, btScalar dt)
_rigidBody->setLinearVelocity(actualVelocity + tau * velocityCorrection); _rigidBody->setLinearVelocity(actualVelocity + tau * velocityCorrection);
} }
} }
// Rather than add _hmdVelocity to the velocity of the RigidBody, we explicitly teleport
// the RigidBody forward according to the formula: distance = rate * time
if (_hmdVelocity.length2() > 0.0f) {
btTransform bodyTransform = _rigidBody->getWorldTransform();
bodyTransform.setOrigin(bodyTransform.getOrigin() + dt * _hmdVelocity);
_rigidBody->setWorldTransform(bodyTransform);
}
// MyAvatar will ask us how far we stepped for HMD motion, which will depend on how
// much time has accumulated in _lastStepDuration.
_lastStepDuration += dt;
} }
void MyCharacterController::jump() { void MyCharacterController::jump() {
@ -390,6 +400,7 @@ void MyCharacterController::preSimulation() {
} }
} }
} }
_lastStepDuration = 0.0f;
} }
void MyCharacterController::postSimulation() { void MyCharacterController::postSimulation() {

View file

@ -16,6 +16,7 @@
#include <btBulletDynamicsCommon.h> #include <btBulletDynamicsCommon.h>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <BulletUtil.h>
#include <CharacterController.h> #include <CharacterController.h>
#include <SharedUtil.h> #include <SharedUtil.h>
@ -48,7 +49,6 @@ public:
// overrides from CharacterController // overrides from CharacterController
virtual void preSimulation() override; virtual void preSimulation() override;
virtual void postSimulation() override; virtual void postSimulation() override;
virtual void incrementSimulationTime(btScalar timeStep) override { _lastStepDuration += timeStep; }
bool isHovering() const { return _isHovering; } bool isHovering() const { return _isHovering; }
void setHovering(bool enabled); void setHovering(bool enabled);
@ -65,6 +65,7 @@ public:
void setTargetVelocity(const glm::vec3& velocity); void setTargetVelocity(const glm::vec3& velocity);
void setHMDVelocity(const glm::vec3& velocity); void setHMDVelocity(const glm::vec3& velocity);
glm::vec3 getHMDShift() const { return _lastStepDuration * bulletToGLM(_hmdVelocity); }
glm::vec3 getLinearVelocity() const; glm::vec3 getLinearVelocity() const;

View file

@ -36,7 +36,6 @@ public:
virtual void updateShapeIfNecessary() = 0; virtual void updateShapeIfNecessary() = 0;
virtual void preSimulation() = 0; virtual void preSimulation() = 0;
virtual void incrementSimulationTime(btScalar stepTime) = 0;
virtual void postSimulation() = 0; virtual void postSimulation() = 0;
virtual void setWalkDirection(const btVector3 &walkDirection) { assert(false); } virtual void setWalkDirection(const btVector3 &walkDirection) { assert(false); }