mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 06:23:06 +02:00
debugging rotation fix
This commit is contained in:
parent
3894c7c2ff
commit
20c8356bb2
1 changed files with 60 additions and 12 deletions
|
@ -1,6 +1,4 @@
|
||||||
//
|
|
||||||
// ViveControllerManager.cpp
|
|
||||||
// input-plugins/src/input-plugins
|
|
||||||
//
|
//
|
||||||
// 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.
|
||||||
|
@ -23,6 +21,9 @@
|
||||||
#include <UserActivityLogger.h>
|
#include <UserActivityLogger.h>
|
||||||
#include <OffscreenUi.h>
|
#include <OffscreenUi.h>
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
|
#include <glm/ext.hpp>
|
||||||
|
#include <glm/gtx/string_cast.hpp>
|
||||||
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include <controllers/UserInputMapper.h>
|
#include <controllers/UserInputMapper.h>
|
||||||
|
@ -52,11 +53,11 @@ const char* ViveControllerManager::NAME { "OpenVR" };
|
||||||
return glm::
|
return glm::
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
glm::mat4 computeOffset(glm::mat4 defaultRefrence, glm::mat4 defaultJointMat, controller::Pose puckPose) {
|
glm::mat4 computeOffset(glm::mat4 defaultToRefrenceMat, glm::mat4 defaultJointMat, controller::Pose puckPose) {
|
||||||
///qDebug() << "-------------> computing offset <-------------";
|
///qDebug() << "-------------> computing offset <-------------";
|
||||||
glm::mat4 poseMat = createMatFromQuatAndPos(puckPose.rotation, puckPose.translation);
|
glm::mat4 poseMat = createMatFromQuatAndPos(puckPose.rotation, puckPose.translation);
|
||||||
glm::mat4 refrenceJointMat = defaultRefrence * defaultJointMat;
|
glm::mat4 refrenceJointMat = defaultToRefrenceMat * defaultJointMat;
|
||||||
return glm::inverse(poseMat) * refrenceJointMat;
|
return ( glm::inverse(poseMat) * refrenceJointMat);
|
||||||
}
|
}
|
||||||
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) {
|
||||||
controller::Pose firstPose = firstPuck.second;
|
controller::Pose firstPose = firstPuck.second;
|
||||||
|
@ -64,6 +65,12 @@ bool sortPucksYPosition(std::pair<uint32_t, controller::Pose> firstPuck, std::pa
|
||||||
return (firstPose.translation.y < secondPose.translation.y);
|
return (firstPose.translation.y < secondPose.translation.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printPose(controller::Pose pose) {
|
||||||
|
qDebug() << "-------------> printing out controller::Pose <--------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(pose.translation));
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(pose.rotation));
|
||||||
|
}
|
||||||
|
|
||||||
bool ViveControllerManager::isSupported() const {
|
bool ViveControllerManager::isSupported() const {
|
||||||
return openVrSupported();
|
return openVrSupported();
|
||||||
}
|
}
|
||||||
|
@ -223,18 +230,40 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
if ((leftTrigger != _buttonPressedMap.end()) && (rightTrigger != _buttonPressedMap.end())) {
|
if ((leftTrigger != _buttonPressedMap.end()) && (rightTrigger != _buttonPressedMap.end())) {
|
||||||
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 controllerToAvatar = glm::inverse(inputCalibration.avatarMat) * inputCalibration.sensorToWorldMat;
|
qDebug() << " -------------------> begin:::InputDevice::calibrate <--------------------";
|
||||||
glm::mat4 hmdHeadInAvatarSpace = inputCalibration.hmdSensorMat * controllerToAvatar;
|
glm::mat4 worldToAvatarMat = glm::inverse(inputCalibration.avatarMat) * inputCalibration.sensorToWorldMat;
|
||||||
|
glm::mat4 hmdHeadInAvatarSpace = worldToAvatarMat * inputCalibration.hmdSensorMat;
|
||||||
|
|
||||||
// cancel the roll and pitch for the hmd head
|
// cancel the roll and pitch for the hmd head
|
||||||
glm::quat canceledRollAndPitch = cancelOutRollAndPitch(glmExtractRotation(hmdHeadInAvatarSpace));
|
glm::quat canceledRollAndPitch = cancelOutRollAndPitch(glmExtractRotation(hmdHeadInAvatarSpace));
|
||||||
glm::vec3 hmdHeadPosition = extractTranslation(hmdHeadInAvatarSpace);
|
glm::vec3 hmdHeadPosition = extractTranslation(hmdHeadInAvatarSpace);
|
||||||
glm::mat4 hmdHeadMat = createMatFromQuatAndPos(canceledRollAndPitch, hmdHeadPosition);
|
glm::mat4 hmdHeadMat = createMatFromQuatAndPos(canceledRollAndPitch, hmdHeadPosition);
|
||||||
|
glm::mat4 defaultHeadOffset = glm::inverse(inputCalibration.defaultCenterEyeMat) * inputCalibration.defaultHeadMat;
|
||||||
|
glm::mat4 defaultRefrenceXform = hmdHeadMat * defaultHeadOffset;
|
||||||
|
|
||||||
|
glm::quat tmpHmdHeadRotation = glmExtractRotation(hmdHeadMat);
|
||||||
|
/*qDebug() << "----------- hmd head position < ------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(hmdHeadPosition));
|
||||||
|
qDebug() << "<--------------- hmd head roatation <---------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(canceledRollAndPitch));*/
|
||||||
|
|
||||||
//calculate the offset from the centerEye to the head hoint
|
//calculate the offset from the centerEye to the head hoint
|
||||||
glm::mat4 defaultHeadOffset = glm::inverse(inputCalibration.defaultCenterEyeMat) * inputCalibration.defaultHeadMat;
|
//glm::mat4 defaultHeadOffset = glm::inverse(inputCalibration.defaultCenterEyeMat) * inputCalibration.defaultHeadMat;
|
||||||
|
glm::vec3 tmpHeadOffsetPosition = extractTranslation(defaultHeadOffset);
|
||||||
|
glm::quat tmpHeadOffsetRotation = glmExtractRotation(defaultHeadOffset);
|
||||||
|
|
||||||
|
/*qDebug() << "----------------> head offset position <------------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(tmpHeadOffsetPosition));
|
||||||
|
qDebug() << "---------------> head offset rotation <-----------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(tmpHeadOffsetRotation));*/
|
||||||
|
|
||||||
|
glm::vec3 defaultRefrencePosition = extractTranslation(defaultRefrenceXform);
|
||||||
|
glm::quat defaultRefrenceRotation = glmExtractRotation(defaultRefrenceXform);
|
||||||
|
qDebug() << "----------------> defaultToReference position <------------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(defaultRefrencePosition));
|
||||||
|
qDebug() << "---------------> defaultToReference rotation <-----------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(defaultRefrenceRotation));
|
||||||
|
|
||||||
glm::mat4 defaultRefrenceXform = hmdHeadMat * defaultHeadOffset;
|
|
||||||
auto puckCount = _validTrackedObjects.size();
|
auto puckCount = _validTrackedObjects.size();
|
||||||
if (puckCount == 2) {
|
if (puckCount == 2) {
|
||||||
//qDebug() << "-------------< configure feet <-------------";
|
//qDebug() << "-------------< configure feet <-------------";
|
||||||
|
@ -246,7 +275,7 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
//qDebug() << "-------------> configure feet, hips and chest <---------------";
|
//qDebug() << "-------------> configure feet, hips and chest <---------------";
|
||||||
_config = Config::FeetHipsAndChest;
|
_config = Config::FeetHipsAndChest;
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "Could not configure # pucks " << puckCount;
|
//qDebug() << "Could not configure # pucks " << puckCount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,18 +287,33 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
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;
|
||||||
|
|
||||||
|
qDebug() << " --------> Printing out the offset pose <------------";
|
||||||
|
glm::mat4 offset = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, firstFootPose);
|
||||||
|
qDebug() << "----------------> offset Position <------------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(extractTranslation(offset)));
|
||||||
|
qDebug() << "---------------> offset rotation <-----------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(glmExtractRotation(offset)));
|
||||||
_pucksOffset[firstFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, firstFootPose);
|
_pucksOffset[firstFoot.first] = computeOffset(defaultRefrenceXform, 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(defaultRefrenceXform, inputCalibration.defaultRightFoot, secondFootPose);
|
||||||
} else {
|
} else {
|
||||||
_jointToPuckMap[controller::LEFT_FOOT] = secondFoot.first;
|
_jointToPuckMap[controller::LEFT_FOOT] = secondFoot.first;
|
||||||
qDebug() << " --------> Printing out the offset pose <------------";
|
qDebug() << " --------> Printing out the offset pose <------------";
|
||||||
|
glm::mat4 offset = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, secondFootPose);
|
||||||
|
qDebug() << "----------------> offset Position <------------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(extractTranslation(offset)));
|
||||||
|
qDebug() << "---------------> offset rotation <-----------------";
|
||||||
|
qDebug() << QString::fromStdString(glm::to_string(glmExtractRotation(offset)));
|
||||||
_pucksOffset[secondFoot.first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultLeftFoot, secondFootPose);
|
_pucksOffset[secondFoot.first] = computeOffset(defaultRefrenceXform, 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(defaultRefrenceXform, inputCalibration.defaultRightFoot, firstFootPose);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_config == Config::Feet) {
|
if (_config == Config::Feet) {
|
||||||
|
controller::Pose leftPose = addOffsetToPuckPose(controller::LEFT_FOOT);
|
||||||
|
qDebug() << "------------> InputDevice::updateCalibratedLimbs <---------";
|
||||||
|
printPose(leftPose);
|
||||||
// done
|
// done
|
||||||
} else if (_config == Config::FeetAndHips) {
|
} else if (_config == Config::FeetAndHips) {
|
||||||
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
_jointToPuckMap[controller::HIPS] = _validTrackedObjects[2].first;
|
||||||
|
@ -279,7 +323,8 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultRefrenceXform, inputCalibration.defaultHips, _validTrackedObjects[2].second);
|
_pucksOffset[_validTrackedObjects[2].first] = computeOffset(defaultRefrenceXform, 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(defaultRefrenceXform, inputCalibration.defaultSpine2, _validTrackedObjects[3].second);
|
||||||
}
|
}
|
||||||
|
qDebug() << "-------------------> end:::InputDevice::calibrate <--------------------";
|
||||||
_calibrated = true;
|
_calibrated = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -292,6 +337,9 @@ void ViveControllerManager::InputDevice::calibrate(const controller::InputCalibr
|
||||||
|
|
||||||
void ViveControllerManager::InputDevice::updateCalibratedLimbs() {
|
void ViveControllerManager::InputDevice::updateCalibratedLimbs() {
|
||||||
_poseStateMap[controller::LEFT_FOOT] = addOffsetToPuckPose(controller::LEFT_FOOT);
|
_poseStateMap[controller::LEFT_FOOT] = addOffsetToPuckPose(controller::LEFT_FOOT);
|
||||||
|
controller::Pose leftPose = addOffsetToPuckPose(controller::LEFT_FOOT);
|
||||||
|
//qDebug() << "------------> InputDevice::updateCalibratedLimbs <---------";
|
||||||
|
//printPose(leftPose);
|
||||||
_poseStateMap[controller::RIGHT_FOOT] = addOffsetToPuckPose(controller::RIGHT_FOOT);
|
_poseStateMap[controller::RIGHT_FOOT] = addOffsetToPuckPose(controller::RIGHT_FOOT);
|
||||||
_poseStateMap[controller::HIPS] = addOffsetToPuckPose(controller::HIPS);
|
_poseStateMap[controller::HIPS] = addOffsetToPuckPose(controller::HIPS);
|
||||||
_poseStateMap[controller::SPINE2] = addOffsetToPuckPose(controller::SPINE2);
|
_poseStateMap[controller::SPINE2] = addOffsetToPuckPose(controller::SPINE2);
|
||||||
|
|
Loading…
Reference in a new issue