mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 14:52:46 +02:00
finally fixed rotation issue
This commit is contained in:
parent
a744db56aa
commit
23c3a75116
2 changed files with 79 additions and 72 deletions
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
//
|
//
|
||||||
// Created by Sam Gondelman on 6/29/15.
|
// Created by Sam Gondelman on 6/29/15.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
|
@ -22,7 +21,6 @@
|
||||||
#include <OffscreenUi.h>
|
#include <OffscreenUi.h>
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
#include <glm/ext.hpp>
|
#include <glm/ext.hpp>
|
||||||
#include <glm/gtx/string_cast.hpp>
|
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,10 +46,10 @@ const quint64 CALIBRATION_TIMELAPSE = 3000000;
|
||||||
|
|
||||||
const char* ViveControllerManager::NAME { "OpenVR" };
|
const char* ViveControllerManager::NAME { "OpenVR" };
|
||||||
|
|
||||||
glm::mat4 computeOffset(glm::mat4 defaultToRefrenceMat, glm::mat4 defaultJointMat, controller::Pose puckPose) {
|
glm::mat4 computeOffset(glm::mat4 defaultToReferenceMat, glm::mat4 defaultJointMat, controller::Pose puckPose) {
|
||||||
glm::mat4 poseMat = createMatFromQuatAndPos(puckPose.rotation, puckPose.translation);
|
glm::mat4 poseMat = createMatFromQuatAndPos(puckPose.rotation, puckPose.translation);
|
||||||
glm::mat4 refrenceJointMat = defaultToRefrenceMat * defaultJointMat;
|
glm::mat4 referenceJointMat = defaultToReferenceMat * defaultJointMat;
|
||||||
return ( glm::inverse(poseMat) * refrenceJointMat);
|
return glm::inverse(poseMat) * referenceJointMat;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sortPucksYPosition(std::pair<uint32_t, controller::Pose> firstPuck, std::pair<uint32_t, controller::Pose> secondPuck) {
|
bool sortPucksYPosition(std::pair<uint32_t, controller::Pose> firstPuck, std::pair<uint32_t, controller::Pose> secondPuck) {
|
||||||
|
@ -130,7 +128,6 @@ void ViveControllerManager::pluginUpdate(float deltaTime, const controller::Inpu
|
||||||
userInputMapper->removeDevice(_inputDevice->_deviceID);
|
userInputMapper->removeDevice(_inputDevice->_deviceID);
|
||||||
_registeredWithInputMapper = false;
|
_registeredWithInputMapper = false;
|
||||||
_inputDevice->_poseStateMap.clear();
|
_inputDevice->_poseStateMap.clear();
|
||||||
//qDebug() << " ----------->>!!!!!!! clear pose state map !!!!!!!<<----------------";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_registeredWithInputMapper && _inputDevice->_trackedControllers > 0) {
|
if (!_registeredWithInputMapper && _inputDevice->_trackedControllers > 0) {
|
||||||
|
@ -217,10 +214,13 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
auto leftTrigger = _buttonPressedMap.find(controller::LT);
|
auto leftTrigger = _buttonPressedMap.find(controller::LT);
|
||||||
auto rightTrigger = _buttonPressedMap.find(controller::RT);
|
auto rightTrigger = _buttonPressedMap.find(controller::RT);
|
||||||
if ((leftTrigger != _buttonPressedMap.end()) && (rightTrigger != _buttonPressedMap.end())) {
|
if ((leftTrigger != _buttonPressedMap.end()) && (rightTrigger != _buttonPressedMap.end())) {
|
||||||
|
if (!_triggersPressedHandled) {
|
||||||
|
_triggersPressedHandled = true;
|
||||||
if (!_calibrated) {
|
if (!_calibrated) {
|
||||||
// conver the hmd head from sensor space to avatar space
|
// conver the hmd head from sensor space to avatar space
|
||||||
glm::mat4 worldToAvatarMat = glm::inverse(inputCalibration.avatarMat) * inputCalibration.sensorToWorldMat;
|
glm::mat4 hmdSensorFlippedMat = inputCalibration.hmdSensorMat * Matrices::Y_180;
|
||||||
glm::mat4 hmdAvatarMat = worldToAvatarMat * inputCalibration.hmdSensorMat;
|
glm::mat4 sensorToAvatarMat = glm::inverse(inputCalibration.avatarMat) * inputCalibration.sensorToWorldMat;
|
||||||
|
glm::mat4 hmdAvatarMat = sensorToAvatarMat * hmdSensorFlippedMat;
|
||||||
|
|
||||||
// cancel the roll and pitch for the hmd head
|
// cancel the roll and pitch for the hmd head
|
||||||
glm::quat hmdRotation = cancelOutRollAndPitch(glmExtractRotation(hmdAvatarMat));
|
glm::quat hmdRotation = cancelOutRollAndPitch(glmExtractRotation(hmdAvatarMat));
|
||||||
|
@ -230,10 +230,10 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
// calculate the offset from the centerOfEye to defaultHeadMat
|
// calculate the offset from the centerOfEye to defaultHeadMat
|
||||||
glm::mat4 defaultHeadOffset = glm::inverse(inputCalibration.defaultCenterEyeMat) * inputCalibration.defaultHeadMat;
|
glm::mat4 defaultHeadOffset = glm::inverse(inputCalibration.defaultCenterEyeMat) * inputCalibration.defaultHeadMat;
|
||||||
|
|
||||||
currentHead *= defaultHeadOffset;
|
currentHead = currentHead * defaultHeadOffset;
|
||||||
|
|
||||||
// calculate the defaultToRefrenceXform
|
// calculate the defaultToRefrenceXform
|
||||||
glm::mat4 defaultRefrenceXform = currentHead * glm::inverse(inputCalibration.defaultHeadMat);
|
glm::mat4 defaultReferenceXform = currentHead * glm::inverse(inputCalibration.defaultHeadMat);
|
||||||
|
|
||||||
auto puckCount = _validTrackedObjects.size();
|
auto puckCount = _validTrackedObjects.size();
|
||||||
if (puckCount == 2) {
|
if (puckCount == 2) {
|
||||||
|
@ -252,34 +252,41 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
auto secondFoot = _validTrackedObjects[1];
|
auto secondFoot = _validTrackedObjects[1];
|
||||||
controller::Pose firstFootPose = firstFoot.second;
|
controller::Pose firstFootPose = firstFoot.second;
|
||||||
controller::Pose secondFootPose = secondFoot.second;
|
controller::Pose secondFootPose = secondFoot.second;
|
||||||
|
|
||||||
if (firstFootPose.translation.x < secondFootPose.translation.x) {
|
if (firstFootPose.translation.x < secondFootPose.translation.x) {
|
||||||
_jointToPuckMap[controller::LEFT_FOOT] = firstFoot.first;
|
_jointToPuckMap[controller::LEFT_FOOT] = firstFoot.first;
|
||||||
_pucksOffset[firstFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, firstFootPose);
|
_pucksOffset[firstFoot.first] = computeOffset(defaultReferenceXform, inputCalibration.defaultLeftFoot, firstFootPose);
|
||||||
_jointToPuckMap[controller::RIGHT_FOOT] = secondFoot.first;
|
_jointToPuckMap[controller::RIGHT_FOOT] = secondFoot.first;
|
||||||
_pucksOffset[secondFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultRightFoot, secondFootPose);
|
_pucksOffset[secondFoot.first] = computeOffset(defaultReferenceXform, inputCalibration.defaultRightFoot, secondFootPose);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_jointToPuckMap[controller::LEFT_FOOT] = secondFoot.first;
|
_jointToPuckMap[controller::LEFT_FOOT] = secondFoot.first;
|
||||||
_pucksOffset[secondFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, secondFootPose);
|
_pucksOffset[secondFoot.first] = computeOffset(defaultReferenceXform, inputCalibration.defaultLeftFoot, secondFootPose);
|
||||||
_jointToPuckMap[controller::RIGHT_FOOT] = firstFoot.first;
|
_jointToPuckMap[controller::RIGHT_FOOT] = firstFoot.first;
|
||||||
_pucksOffset[firstFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultRightFoot, firstFootPose);
|
_pucksOffset[firstFoot.first] = computeOffset(defaultReferenceXform, inputCalibration.defaultRightFoot, firstFootPose);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_config == Config::Feet) {
|
if (_config == Config::Feet) {
|
||||||
// done
|
// done
|
||||||
} else if (_config == Config::FeetAndHips) {
|
} else if (_config == Config::FeetAndHips) {
|
||||||
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
||||||
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultHips, _validTrackedObjects[2].second);
|
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultReferenceXform, inputCalibration.defaultHips, _validTrackedObjects[2].second);
|
||||||
} else if (_config == Config::FeetHipsAndChest) {
|
} else if (_config == Config::FeetHipsAndChest) {
|
||||||
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
||||||
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultHips, _validTrackedObjects[2].second);
|
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultReferenceXform, inputCalibration.defaultHips, _validTrackedObjects[2].second);
|
||||||
_jointToPuckMap[controller::SPINE2] = _validTrackedObjects[3].first;
|
_jointToPuckMap[controller::SPINE2] = _validTrackedObjects[3].first;
|
||||||
_pucksOffset[_validTrackedObjects[3].first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultSpine2, _validTrackedObjects[3].second);
|
_pucksOffset[_validTrackedObjects[3].first] = computeOffset(defaultReferenceXform, inputCalibration.defaultSpine2, _validTrackedObjects[3].second);
|
||||||
}
|
}
|
||||||
_calibrated = true;
|
_calibrated = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
_pucksOffset.clear();
|
||||||
|
_jointToPuckMap.clear();
|
||||||
|
_calibrated = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_triggersPressedHandled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,8 +303,8 @@ controller::Pose ViveControllerManager::InputDevice::addOffsetToPuckPose(int joi
|
||||||
uint32_t puckIndex = puck->second;
|
uint32_t puckIndex = puck->second;
|
||||||
controller::Pose puckPose = _poseStateMap[puckIndex];
|
controller::Pose puckPose = _poseStateMap[puckIndex];
|
||||||
glm::mat4 puckOffset = _pucksOffset[puckIndex];
|
glm::mat4 puckOffset = _pucksOffset[puckIndex];
|
||||||
puckPose.postTransform(puckOffset);
|
controller::Pose newPose = puckPose.postTransform(puckOffset);
|
||||||
return puckPose;
|
return newPose;
|
||||||
|
|
||||||
}
|
}
|
||||||
return controller::Pose();
|
return controller::Pose();
|
||||||
|
|
|
@ -114,7 +114,7 @@ private:
|
||||||
float _leftHapticDuration { 0.0f };
|
float _leftHapticDuration { 0.0f };
|
||||||
float _rightHapticStrength { 0.0f };
|
float _rightHapticStrength { 0.0f };
|
||||||
float _rightHapticDuration { 0.0f };
|
float _rightHapticDuration { 0.0f };
|
||||||
bool _calibrate { false };
|
bool _triggersPressedHandled { false };
|
||||||
bool _calibrated { false };
|
bool _calibrated { false };
|
||||||
mutable std::recursive_mutex _lock;
|
mutable std::recursive_mutex _lock;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue