From e37387f45c4e1f80ac431406dbd332fc0d8c7356 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 31 May 2017 14:01:09 -0700 Subject: [PATCH] sync --- interface/src/Application.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 18 +++++++++--------- interface/src/avatar/MySkeletonModel.cpp | 3 ++- .../src/scripting/HMDScriptingInterface.cpp | 3 ++- plugins/oculus/src/OculusControllerManager.cpp | 9 ++++----- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 17f9b03346..13c3605320 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3992,7 +3992,7 @@ void Application::updateMyAvatarLookAtPosition() { // I am not looking at anyone else, so just look forward if (isHMD) { glm::mat4 worldHMDMat = myAvatar->getSensorToWorldMatrix() * - (glm::mat4)myAvatar->getHeadControllerPoseInSensorFrame(); + (glm::mat4)myAvatar->getHeadControllerPoseInSensorFrame() * Matrices::Y_180; lookAtSpot = transformPoint(worldHMDMat, glm::vec3(0.0f, 0.0f, -TREE_SCALE)); } else { lookAtSpot = myAvatar->getHead()->getEyePosition() + diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 11c8c5b186..e2aadbc365 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -2328,9 +2328,9 @@ glm::quat MyAvatar::getWorldBodyOrientation() const { glm::mat4 MyAvatar::deriveBodyFromHMDSensor() const { // HMD is in sensor space. - const glm::vec3 hmdPosition = getHeadControllerPoseInSensorFrame(); - const glm::quat hmdOrientation = getHeadControllerPoseInSensorFrame(); - const glm::quat hmdOrientationYawOnly = cancelOutRollAndPitch(hmdOrientation); + const glm::vec3 headPosition = getHeadControllerPoseInSensorFrame(); + const glm::quat headOrientation = (glm::quat)getHeadControllerPoseInSensorFrame() * Quaternions::Y_180; + const glm::quat headOrientationYawOnly = cancelOutRollAndPitch(headOrientation); const Rig& rig = _skeletonModel->getRig(); int rightEyeIndex = rig.indexOfJoint("RightEye"); @@ -2353,12 +2353,12 @@ glm::mat4 MyAvatar::deriveBodyFromHMDSensor() const { // eyeToNeck offset is relative full HMD orientation. // while neckToRoot offset is only relative to HMDs yaw. - // Y_180 is necessary because rig is z forward and hmdOrientation is -z forward - glm::vec3 eyeToNeck = hmdOrientation * Quaternions::Y_180 * (localNeck - localEyes); - glm::vec3 neckToRoot = hmdOrientationYawOnly * Quaternions::Y_180 * -localNeck; - glm::vec3 bodyPos = hmdPosition + eyeToNeck + neckToRoot; + // Y_180 is necessary because rig is z forward and headOrientation is -z forward + glm::vec3 eyeToNeck = headOrientation * Quaternions::Y_180 * (localNeck - localEyes); + glm::vec3 neckToRoot = headOrientationYawOnly * Quaternions::Y_180 * -localNeck; + glm::vec3 bodyPos = headPosition + eyeToNeck + neckToRoot; - return createMatFromQuatAndPos(hmdOrientationYawOnly, bodyPos); + return createMatFromQuatAndPos(headOrientationYawOnly, bodyPos); } glm::vec3 MyAvatar::getPositionForAudio() { @@ -2474,7 +2474,7 @@ bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, co } else { const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); - return glm::dot(myAvatar.getHeadControllerFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; + return glm::dot(myAvatar.getHeadControllerFacingMovingAverage() * -1.0f, bodyFacing) < FOLLOW_ROTATION_THRESHOLD; } } diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 84e4a9ff83..20b9ee2850 100644 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -59,7 +59,8 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { } else { if (qApp->isHMDMode()) { // get HMD position from sensor space into world space, and back into rig space - glm::mat4 worldHMDMat = myAvatar->getHeadControllerPoseInWorldFrame(); + // glm::mat4 worldHMDMat = myAvatar->getHeadControllerPoseInWorldFrame(); + glm::mat4 worldHMDMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); glm::mat4 rigToWorld = createMatFromQuatAndPos(getRotation(), getTranslation()); glm::mat4 worldToRig = glm::inverse(rigToWorld); glm::mat4 rigHMDMat = worldToRig * worldHMDMat; diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index d347b72d7b..ecc207a519 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -122,7 +122,8 @@ bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { glm::mat4 HMDScriptingInterface::getWorldHMDMatrix() const { auto myAvatar = DependencyManager::get()->getMyAvatar(); - return myAvatar->getSensorToWorldMatrix() * (glm::mat4)myAvatar->getHeadControllerPoseInSensorFrame(); + // return myAvatar->getSensorToWorldMatrix() * (glm::mat4)myAvatar->getHeadControllerPoseInSensorFrame(); + return myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); } glm::vec3 HMDScriptingInterface::getPosition() const { diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index 6042968ffc..0236ea1e62 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -19,6 +19,8 @@ #include #include +#include +#include #include @@ -313,19 +315,16 @@ void OculusControllerManager::TouchDevice::handleHeadPose(float deltaTime, auto poseId = controller::HEAD; auto& pose = _poseStateMap[poseId]; + static const glm::quat yFlip = glm::angleAxis(PI, Vectors::UNIT_Y); pose.translation = toGlm(headPose.ThePose.Position); - pose.rotation = toGlm(headPose.ThePose.Orientation); + pose.rotation = toGlm(headPose.ThePose.Orientation) * yFlip; pose.angularVelocity = toGlm(headPose.AngularVelocity); pose.velocity = toGlm(headPose.LinearVelocity); pose.valid = true; - qDebug() << "handleHeadPose" << pose.translation.x << pose.translation.y << pose.translation.z; - // transform into avatar frame glm::mat4 controllerToAvatar = glm::inverse(inputCalibrationData.avatarMat) * inputCalibrationData.sensorToWorldMat; pose = pose.transform(controllerToAvatar); - - qDebug() << "handleHeadPose after" << pose.translation.x << pose.translation.y << pose.translation.z; } void OculusControllerManager::TouchDevice::handleRotationForUntrackedHand(const controller::InputCalibrationData& inputCalibrationData,