mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 10:47:11 +02:00
Store sixense data in meters not millimeters
This commit is contained in:
parent
49dedb72c9
commit
efb3edf400
3 changed files with 16 additions and 12 deletions
|
@ -22,9 +22,9 @@ const int CALIBRATION_STATE_Z = 3;
|
||||||
const int CALIBRATION_STATE_COMPLETE = 4;
|
const int CALIBRATION_STATE_COMPLETE = 4;
|
||||||
|
|
||||||
// default (expected) location of neck in sixense space
|
// default (expected) location of neck in sixense space
|
||||||
const float NECK_X = 250.f; // millimeters
|
const float NECK_X = 0.25f; // meters
|
||||||
const float NECK_Y = 300.f; // millimeters
|
const float NECK_Y = 0.3f; // meters
|
||||||
const float NECK_Z = 300.f; // millimeters
|
const float NECK_Z = 0.3f; // meters
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SixenseManager::SixenseManager() {
|
SixenseManager::SixenseManager() {
|
||||||
|
@ -107,7 +107,10 @@ void SixenseManager::update(float deltaTime) {
|
||||||
palm->setTrigger(data->trigger);
|
palm->setTrigger(data->trigger);
|
||||||
palm->setJoystick(data->joystick_x, data->joystick_y);
|
palm->setJoystick(data->joystick_x, data->joystick_y);
|
||||||
|
|
||||||
|
// NOTE: Sixense API returns pos data in millimeters but we IMMEDIATELY convert to meters.
|
||||||
glm::vec3 position(data->pos[0], data->pos[1], data->pos[2]);
|
glm::vec3 position(data->pos[0], data->pos[1], data->pos[2]);
|
||||||
|
position *= METERS_PER_MILLIMETER;
|
||||||
|
|
||||||
// Transform the measured position into body frame.
|
// Transform the measured position into body frame.
|
||||||
glm::vec3 neck = _neckBase;
|
glm::vec3 neck = _neckBase;
|
||||||
// Zeroing y component of the "neck" effectively raises the measured position a little bit.
|
// Zeroing y component of the "neck" effectively raises the measured position a little bit.
|
||||||
|
@ -122,7 +125,7 @@ void SixenseManager::update(float deltaTime) {
|
||||||
// Compute current velocity from position change
|
// Compute current velocity from position change
|
||||||
glm::vec3 rawVelocity;
|
glm::vec3 rawVelocity;
|
||||||
if (deltaTime > 0.f) {
|
if (deltaTime > 0.f) {
|
||||||
rawVelocity = (position - palm->getRawPosition()) * (METERS_PER_MILLIMETER / deltaTime);
|
rawVelocity = (position - palm->getRawPosition()) / deltaTime;
|
||||||
} else {
|
} else {
|
||||||
rawVelocity = glm::vec3(0.0f);
|
rawVelocity = glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
@ -138,12 +141,12 @@ void SixenseManager::update(float deltaTime) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store the one fingertip in the palm structure so we can track velocity
|
// Store the one fingertip in the palm structure so we can track velocity
|
||||||
const float FINGER_LENGTH = 300.0f; // meters
|
const float FINGER_LENGTH = 0.3f; // meters
|
||||||
const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH);
|
const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH);
|
||||||
const glm::vec3 newTipPosition = position + rotation * FINGER_VECTOR;
|
const glm::vec3 newTipPosition = position + rotation * FINGER_VECTOR;
|
||||||
glm::vec3 oldTipPosition = palm->getTipRawPosition();
|
glm::vec3 oldTipPosition = palm->getTipRawPosition();
|
||||||
if (deltaTime > 0.f) {
|
if (deltaTime > 0.f) {
|
||||||
palm->setTipVelocity((newTipPosition - oldTipPosition) * (METERS_PER_MILLIMETER / deltaTime));
|
palm->setTipVelocity((newTipPosition - oldTipPosition) / deltaTime);
|
||||||
} else {
|
} else {
|
||||||
palm->setTipVelocity(glm::vec3(0.f));
|
palm->setTipVelocity(glm::vec3(0.f));
|
||||||
}
|
}
|
||||||
|
@ -173,8 +176,8 @@ void SixenseManager::update(float deltaTime) {
|
||||||
// (4) move arms a bit forward (Z)
|
// (4) move arms a bit forward (Z)
|
||||||
// (5) release BUTTON_FWD on both hands
|
// (5) release BUTTON_FWD on both hands
|
||||||
|
|
||||||
const float MINIMUM_ARM_REACH = 300.f; // millimeters
|
const float MINIMUM_ARM_REACH = 0.3f; // meters
|
||||||
const float MAXIMUM_NOISE_LEVEL = 50.f; // millimeters
|
const float MAXIMUM_NOISE_LEVEL = 0.05f; // meters
|
||||||
const quint64 LOCK_DURATION = USECS_PER_SECOND / 4; // time for lock to be acquired
|
const quint64 LOCK_DURATION = USECS_PER_SECOND / 4; // time for lock to be acquired
|
||||||
|
|
||||||
void SixenseManager::updateCalibration(const sixenseControllerData* controllers) {
|
void SixenseManager::updateCalibration(const sixenseControllerData* controllers) {
|
||||||
|
@ -214,10 +217,13 @@ void SixenseManager::updateCalibration(const sixenseControllerData* controllers)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: Sixense API returns pos data in millimeters but we IMMEDIATELY convert to meters.
|
||||||
const float* pos = dataLeft->pos;
|
const float* pos = dataLeft->pos;
|
||||||
glm::vec3 positionLeft(pos[0], pos[1], pos[2]);
|
glm::vec3 positionLeft(pos[0], pos[1], pos[2]);
|
||||||
|
positionLeft *= METERS_PER_MILLIMETER;
|
||||||
pos = dataRight->pos;
|
pos = dataRight->pos;
|
||||||
glm::vec3 positionRight(pos[0], pos[1], pos[2]);
|
glm::vec3 positionRight(pos[0], pos[1], pos[2]);
|
||||||
|
positionRight *= METERS_PER_MILLIMETER;
|
||||||
|
|
||||||
if (_calibrationState == CALIBRATION_STATE_IDLE) {
|
if (_calibrationState == CALIBRATION_STATE_IDLE) {
|
||||||
float reach = glm::distance(positionLeft, positionRight);
|
float reach = glm::distance(positionLeft, positionRight);
|
||||||
|
|
|
@ -27,7 +27,7 @@ HandData::HandData(AvatarData* owningAvatar) :
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 HandData::worldToLocalVector(const glm::vec3& worldVector) const {
|
glm::vec3 HandData::worldToLocalVector(const glm::vec3& worldVector) const {
|
||||||
return glm::inverse(getBaseOrientation()) * worldVector / LEAP_UNIT_SCALE;
|
return glm::inverse(getBaseOrientation()) * worldVector;
|
||||||
}
|
}
|
||||||
|
|
||||||
PalmData& HandData::addNewPalm() {
|
PalmData& HandData::addNewPalm() {
|
||||||
|
|
|
@ -30,8 +30,6 @@ const int NUM_FINGERS = NUM_HANDS * NUM_FINGERS_PER_HAND;
|
||||||
const int LEAPID_INVALID = -1;
|
const int LEAPID_INVALID = -1;
|
||||||
const int SIXENSEID_INVALID = -1;
|
const int SIXENSEID_INVALID = -1;
|
||||||
|
|
||||||
const float LEAP_UNIT_SCALE = 0.001f; ///< convert mm to meters
|
|
||||||
|
|
||||||
const int SIXENSE_CONTROLLER_ID_LEFT_HAND = 0;
|
const int SIXENSE_CONTROLLER_ID_LEFT_HAND = 0;
|
||||||
const int SIXENSE_CONTROLLER_ID_RIGHT_HAND = 1;
|
const int SIXENSE_CONTROLLER_ID_RIGHT_HAND = 1;
|
||||||
|
|
||||||
|
@ -42,7 +40,7 @@ public:
|
||||||
|
|
||||||
// position conversion
|
// position conversion
|
||||||
glm::vec3 localToWorldPosition(const glm::vec3& localPosition) {
|
glm::vec3 localToWorldPosition(const glm::vec3& localPosition) {
|
||||||
return getBasePosition() + getBaseOrientation() * localPosition * LEAP_UNIT_SCALE;
|
return getBasePosition() + getBaseOrientation() * localPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 localToWorldDirection(const glm::vec3& localVector) {
|
glm::vec3 localToWorldDirection(const glm::vec3& localVector) {
|
||||||
|
|
Loading…
Reference in a new issue