From 362e185098ea39fccf7f9c3feaf234254743c0a0 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 13 Sep 2016 09:49:43 -0700 Subject: [PATCH] Revert "When out-of-body have your avatar face toward your HMD." This reverts commit ffb1bae1f08ac2edbbd9fe9ade1c8d39ac68f295. --- interface/src/avatar/MyAvatar.cpp | 74 +++++++------------------- interface/src/avatar/MyAvatar.h | 7 +-- interface/src/avatar/SkeletonModel.cpp | 40 ++++++-------- 3 files changed, 39 insertions(+), 82 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index df9e07ee78..01e749b7b2 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -86,9 +86,9 @@ const float MyAvatar::ZOOM_DEFAULT = 1.5f; extern bool OUTOFBODY_HACK_ENABLE_DEBUG_DRAW_IK_TARGETS; // OUTOFBODY_HACK defined in SkeletonModel.cpp -extern glm::vec3 TRUNCATE_IK_CAPSULE_POSITION; -extern float TRUNCATE_IK_CAPSULE_LENGTH; -extern float TRUNCATE_IK_CAPSULE_RADIUS; +extern const glm::vec3 TRUNCATE_IK_CAPSULE_POSITION; +extern const float TRUNCATE_IK_CAPSULE_LENGTH; +extern const float TRUNCATE_IK_CAPSULE_RADIUS; MyAvatar::MyAvatar(RigPointer rig) : Avatar(rig), @@ -2157,65 +2157,31 @@ void MyAvatar::FollowHelper::prePhysicsUpdate(MyAvatar& myAvatar, const glm::mat _desiredBodyMatrix = desiredBodyMatrix; if (myAvatar.getHMDLeanRecenterEnabled()) { + updateRotationActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); + updateHorizontalActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); + updateVerticalActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); - if (_isOutOfBody) { + glm::mat4 desiredWorldMatrix = myAvatar.getSensorToWorldMatrix() * _desiredBodyMatrix; + glm::mat4 currentWorldMatrix = createMatFromQuatAndPos(myAvatar.getOrientation(), myAvatar.getPosition()); - glm::mat4 desiredWorldMatrix = myAvatar.getSensorToWorldMatrix() * _desiredBodyMatrix; - glm::mat4 currentWorldMatrix = createMatFromQuatAndPos(myAvatar.getOrientation(), myAvatar.getPosition()); - AnimPose followWorldPose(currentWorldMatrix); - - // OUTOFBODY_HACK, only takes horizontal movement into account. - - // horizontal follow + AnimPose followWorldPose(currentWorldMatrix); + if (isActive(Rotation)) { + followWorldPose.rot = glmExtractRotation(desiredWorldMatrix); + } + if (isActive(Horizontal)) { glm::vec3 desiredTranslation = extractTranslation(desiredWorldMatrix); followWorldPose.trans.x = desiredTranslation.x; followWorldPose.trans.z = desiredTranslation.z; + } + if (isActive(Vertical)) { + glm::vec3 desiredTranslation = extractTranslation(desiredWorldMatrix); + followWorldPose.trans.y = desiredTranslation.y; + } - // rotation follow - // face the HMD - glm::vec3 hmdWorldPosition = extractTranslation(myAvatar.getSensorToWorldMatrix() * myAvatar.getHMDSensorMatrix()); - glm::vec3 facing = myAvatar.getPosition() - hmdWorldPosition; - facing.y = 0.0f; - if (glm::length(facing) > EPSILON) { - // turn to face the hmd - followWorldPose.rot = glm::angleAxis(atan2(facing.x, facing.z), Vectors::UNIT_Y); - } else { - followWorldPose.rot = glmExtractRotation(desiredWorldMatrix); - } - + if (isActive()) { myAvatar.getCharacterController()->setFollowParameters(followWorldPose); - } else { - updateRotationActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); - updateHorizontalActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); - updateVerticalActivation(myAvatar, desiredBodyMatrix, currentBodyMatrix); - - glm::mat4 desiredWorldMatrix = myAvatar.getSensorToWorldMatrix() * _desiredBodyMatrix; - glm::mat4 currentWorldMatrix = createMatFromQuatAndPos(myAvatar.getOrientation(), myAvatar.getPosition()); - - AnimPose followWorldPose(currentWorldMatrix); - if (isActive(Rotation)) { - followWorldPose.rot = glmExtractRotation(desiredWorldMatrix); - } - if (isActive(Horizontal)) { - glm::vec3 desiredTranslation = extractTranslation(desiredWorldMatrix); - followWorldPose.trans.x = desiredTranslation.x; - followWorldPose.trans.z = desiredTranslation.z; - } - if (isActive(Vertical)) { - glm::vec3 desiredTranslation = extractTranslation(desiredWorldMatrix); - followWorldPose.trans.y = desiredTranslation.y; - } - - if (isActive()) { - myAvatar.getCharacterController()->setFollowParameters(followWorldPose); - } else { - myAvatar.getCharacterController()->disableFollow(); - } - - glm::mat4 currentWorldMatrixY180 = createMatFromQuatAndPos(myAvatar.getOrientation() * Quaternions::Y_180, myAvatar.getPosition()); - _prevInBodyHMDMatInAvatarSpace = _inBodyHMDMatInAvatarSpace; - _inBodyHMDMatInAvatarSpace = glm::inverse(currentWorldMatrixY180) * myAvatar.getSensorToWorldMatrix() * myAvatar.getHMDSensorMatrix(); + myAvatar.getCharacterController()->disableFollow(); } } else { deactivate(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 4b76c0defa..59a363c483 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -279,9 +279,6 @@ public: virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override; virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override; - bool isOutOfBody() const { return _follow._isOutOfBody; } - glm::mat4 getInBodyHMDMatInAvatarSpace() const { return _follow._prevInBodyHMDMatInAvatarSpace; } - public slots: void increaseSize(); void decreaseSize(); @@ -318,6 +315,8 @@ public slots: glm::vec3 getPositionForAudio(); glm::quat getOrientationForAudio(); + bool isOutOfBody() const { return _follow._isOutOfBody; } + signals: void audioListenerModeChanged(); void transformChanged(); @@ -450,8 +449,6 @@ private: glm::mat4 _desiredBodyMatrix; uint8_t _activeBits { 0 }; bool _isOutOfBody { false }; - glm::mat4 _prevInBodyHMDMatInAvatarSpace; - glm::mat4 _inBodyHMDMatInAvatarSpace; void deactivate(); void deactivate(FollowType type); diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 2bbda480e0..be1d071f6b 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -23,9 +23,9 @@ #include "InterfaceLogging.h" #include "AnimDebugDraw.h" -glm::vec3 TRUNCATE_IK_CAPSULE_POSITION(0.0f, 0.0f, 0.0f); -float TRUNCATE_IK_CAPSULE_LENGTH = 1000.0f; -float TRUNCATE_IK_CAPSULE_RADIUS = 0.5f; +const glm::vec3 TRUNCATE_IK_CAPSULE_POSITION(0.0f, 0.0f, 0.0f); +const float TRUNCATE_IK_CAPSULE_LENGTH = 1000.0f; +const float TRUNCATE_IK_CAPSULE_RADIUS = 0.5f; SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent, RigPointer rig) : Model(rig, parent), @@ -110,8 +110,8 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { Rig::HeadParameters headParams; - glm::mat4 desiredHMDMat; // rig space - glm::mat4 actualHMDMat; // rig space + glm::vec3 hmdPositionInRigSpace; + glm::vec3 truncatedHMDPositionInRigSpace; if (qApp->isHMDMode()) { headParams.isInHMD = true; @@ -120,20 +120,20 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { glm::mat4 worldHMDMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); glm::mat4 rigToWorld = createMatFromQuatAndPos(getRotation(), getTranslation()); glm::mat4 worldToRig = glm::inverse(rigToWorld); - desiredHMDMat = worldToRig * worldHMDMat; + glm::mat4 rigHMDMat = worldToRig * worldHMDMat; + hmdPositionInRigSpace = extractTranslation(rigHMDMat); + // truncate head IK target if it's out of body if (myAvatar->isOutOfBody()) { - // use the last valid in-body hmd matrix for the head yaw. - glm::mat4 hmdYaw = cancelOutRollAndPitch(myAvatar->getInBodyHMDMatInAvatarSpace()); - glm::mat4 hmdPitchAndRoll = glm::inverse(cancelOutRollAndPitch(desiredHMDMat)) * desiredHMDMat; - actualHMDMat = hmdYaw * hmdPitchAndRoll; + truncatedHMDPositionInRigSpace = projectPointOntoCapsule(hmdPositionInRigSpace, TRUNCATE_IK_CAPSULE_POSITION, + TRUNCATE_IK_CAPSULE_LENGTH, TRUNCATE_IK_CAPSULE_RADIUS); } else { - actualHMDMat = desiredHMDMat; + truncatedHMDPositionInRigSpace = hmdPositionInRigSpace; } - headParams.rigHeadPosition = extractTranslation(actualHMDMat); - headParams.rigHeadOrientation = extractRotation(actualHMDMat); + headParams.rigHeadPosition = truncatedHMDPositionInRigSpace; + headParams.rigHeadOrientation = extractRotation(rigHMDMat); headParams.worldHeadOrientation = extractRotation(worldHMDMat); } else { @@ -159,11 +159,8 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { // truncate hand target if (myAvatar->isOutOfBody() && qApp->isHMDMode()) { - glm::mat4 handMat = createMatFromQuatAndPos(handParams.leftOrientation, handParams.leftPosition); - glm::mat4 offset = glm::inverse(desiredHMDMat) * handMat; - handMat = actualHMDMat * offset; - handParams.leftPosition = extractTranslation(handMat); - handParams.leftOrientation = glmExtractRotation(handMat); + glm::vec3 offset = handParams.leftPosition - hmdPositionInRigSpace; + handParams.leftPosition = truncatedHMDPositionInRigSpace + offset; } } else { handParams.isLeftEnabled = false; @@ -177,11 +174,8 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { // truncate hand target if (myAvatar->isOutOfBody() && qApp->isHMDMode()) { - glm::mat4 handMat = createMatFromQuatAndPos(handParams.rightOrientation, handParams.rightPosition); - glm::mat4 offset = glm::inverse(desiredHMDMat) * handMat; - handMat = actualHMDMat * offset; - handParams.rightPosition = extractTranslation(handMat); - handParams.rightOrientation = glmExtractRotation(handMat); + glm::vec3 offset = handParams.rightPosition - hmdPositionInRigSpace; + handParams.rightPosition = truncatedHMDPositionInRigSpace + offset; } } else { handParams.isRightEnabled = false;