fix low velocity filter

This commit is contained in:
Dante Ruiz 2017-05-18 21:22:42 +01:00
parent 90ddc16d09
commit 78f6d2e850
2 changed files with 12 additions and 9 deletions

View file

@ -45,17 +45,19 @@
{
"from": "Vive.RightFoot", "to" : "Standard.RightFoot",
"filters" : [{"type" : "lowVelocity", "rotation" : 1.0, "translation": 1.0}]
,"when": [ "Application.InHMD"]
"filters" : [{"type" : "lowVelocity", "rotation" : 1.0, "translation": 1.0}],
"when": [ "Application.InHMD"]
},
{
"from": "Vive.Hips", "to" : "Standard.Hips",
"filters" : [{"type" : "lowVelocity", "rotation" : 0.01, "translation": 0.01}],
"when": [ "Application.InHMD"]
},
{
"from": "Vive.Spine2", "to" : "Standard.Spine2",
"filters" : [{"type" : "lowVelocity", "rotation" : 0.01, "translation": 0.01}],
"when": [ "Application.InHMD"]
},

View file

@ -22,20 +22,21 @@ namespace controller {
Pose LowVelocityFilter::apply(Pose newPose) const {
auto userInputMapper = DependencyManager::get<UserInputMapper>();
const InputCalibrationData calibrationData = userInputMapper->getInputCalibrationData();
glm::mat4 sensorToAvatarMat = glm::inverse(calibrationData.avatarMat) * calibrationData.sensorToWorldMat;
glm::mat4 avatarToSensorMat = glm::inverse(calibrationData.sensorToWorldMat) * calibrationData.avatarMat;
Pose finalPose = newPose;
if (finalPose.isValid() && _oldPose.isValid()) {
Pose sensorPose = finalPose.transform(calibrationData.avatarMat);
Pose lastPose = _oldPose.transform(calibrationData.avatarMat);
Pose sensorPose = finalPose.transform(avatarToSensorMat);
Pose lastPose = _oldPose;
float rotationFilter = glm::clamp(1.0f - (glm::length(lastPose.getVelocity() / _rotationConstant)), 0.0f, 1.0f);
float translationFilter = glm::clamp(1.0f - (glm::length(lastPose.getVelocity() / _translationConstant)), 0.0f, 1.0f);
sensorPose.translation = lastPose.getTranslation() * translationFilter + sensorPose.getTranslation() * (1.0f - translationFilter);
sensorPose.rotation = safeMix(lastPose.getRotation(), sensorPose.getRotation(), 1.0f - rotationFilter);
finalPose = sensorPose.transform(glm::inverse(calibrationData.avatarMat));
finalPose.valid = true;
finalPose = sensorPose.transform(sensorToAvatarMat);
}
_oldPose = finalPose;
_oldPose = finalPose.transform(avatarToSensorMat);
return finalPose;
}
@ -51,5 +52,5 @@ namespace controller {
}
return false;
}
}