mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-03 01:10:39 +02:00
Merge pull request #7997 from SamGondelman/touchFixes
Corrected Oculus Touch coordinate system so that hands track properly
This commit is contained in:
commit
69ae33ad9a
7 changed files with 184 additions and 58 deletions
|
@ -1,22 +1,40 @@
|
||||||
{
|
{
|
||||||
"name": "Oculus Touch to Standard",
|
"name": "Oculus Touch to Standard",
|
||||||
"channels": [
|
"channels": [
|
||||||
{ "from": "OculusTouch.LY", "filters": "invert", "to": "Standard.LY" },
|
{ "from": "OculusTouch.A", "to": "Standard.A" },
|
||||||
{ "from": "OculusTouch.LX", "to": "Standard.LX" },
|
{ "from": "OculusTouch.B", "to": "Standard.B" },
|
||||||
|
{ "from": "OculusTouch.X", "to": "Standard.X" },
|
||||||
|
{ "from": "OculusTouch.Y", "to": "Standard.Y" },
|
||||||
|
|
||||||
|
{ "from": "OculusTouch.LY", "filters": "invert", "to": "Standard.LY" },
|
||||||
|
{ "from": "OculusTouch.LX", "to": "Standard.LX" },
|
||||||
{ "from": "OculusTouch.LT", "to": "Standard.LT" },
|
{ "from": "OculusTouch.LT", "to": "Standard.LT" },
|
||||||
|
{ "from": "OculusTouch.LS", "to": "Standard.LS" },
|
||||||
|
{ "from": "OculusTouch.LeftGrip", "to": "Standard.LeftGrip" },
|
||||||
|
{ "from": "OculusTouch.LeftHand", "to": "Standard.LeftHand" },
|
||||||
|
|
||||||
{ "from": "OculusTouch.RY", "filters": "invert", "to": "Standard.RY" },
|
{ "from": "OculusTouch.RY", "filters": "invert", "to": "Standard.RY" },
|
||||||
{ "from": "OculusTouch.RX", "to": "Standard.RX" },
|
{ "from": "OculusTouch.RX", "to": "Standard.RX" },
|
||||||
|
|
||||||
{ "from": "OculusTouch.RT", "to": "Standard.RT" },
|
{ "from": "OculusTouch.RT", "to": "Standard.RT" },
|
||||||
{ "from": "OculusTouch.RB", "to": "Standard.RB" },
|
|
||||||
{ "from": "OculusTouch.RS", "to": "Standard.RS" },
|
{ "from": "OculusTouch.RS", "to": "Standard.RS" },
|
||||||
|
{ "from": "OculusTouch.RightGrip", "to": "Standard.RightGrip" },
|
||||||
|
{ "from": "OculusTouch.RightHand", "to": "Standard.RightHand" },
|
||||||
|
|
||||||
{ "from": "OculusTouch.LeftApplicationMenu", "to": "Standard.Back" },
|
{ "from": "OculusTouch.LeftApplicationMenu", "to": "Standard.Back" },
|
||||||
{ "from": "OculusTouch.RightApplicationMenu", "to": "Standard.Start" },
|
{ "from": "OculusTouch.RightApplicationMenu", "to": "Standard.Start" },
|
||||||
|
|
||||||
{ "from": "OculusTouch.LeftHand", "to": "Standard.LeftHand" },
|
{ "from": "OculusTouch.LeftPrimaryThumbTouch", "to": "Standard.LeftPrimaryThumbTouch" },
|
||||||
{ "from": "OculusTouch.RightHand", "to": "Standard.RightHand" }
|
{ "from": "OculusTouch.LeftSecondaryThumbTouch", "to": "Standard.LeftSecondaryThumbTouch" },
|
||||||
|
{ "from": "OculusTouch.RightPrimaryThumbTouch", "to": "Standard.RightPrimaryThumbTouch" },
|
||||||
|
{ "from": "OculusTouch.RightSecondaryThumbTouch", "to": "Standard.RightSecondaryThumbTouch" },
|
||||||
|
{ "from": "OculusTouch.LeftPrimaryIndexTouch", "to": "Standard.LeftPrimaryIndexTouch" },
|
||||||
|
{ "from": "OculusTouch.RightPrimaryIndexTouch", "to": "Standard.RightPrimaryIndexTouch" },
|
||||||
|
{ "from": "OculusTouch.LSTouch", "to": "Standard.LSTouch" },
|
||||||
|
{ "from": "OculusTouch.RSTouch", "to": "Standard.RSTouch" },
|
||||||
|
{ "from": "OculusTouch.LeftThumbUp", "to": "Standard.LeftThumbUp" },
|
||||||
|
{ "from": "OculusTouch.RightThumbUp", "to": "Standard.RightThumbUp" },
|
||||||
|
{ "from": "OculusTouch.LeftIndexPoint", "to": "Standard.LeftIndexPoint" },
|
||||||
|
{ "from": "OculusTouch.RightIndexPoint", "to": "Standard.RightIndexPoint" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{ "from": "Vive.LX", "when": "Vive.LSOuter", "to": "Standard.LX" },
|
{ "from": "Vive.LX", "when": "Vive.LSOuter", "to": "Standard.LX" },
|
||||||
|
|
||||||
{ "from": "Vive.LT", "to": "Standard.LT" },
|
{ "from": "Vive.LT", "to": "Standard.LT" },
|
||||||
{ "from": "Vive.LeftGrip", "to": "Standard.LB" },
|
{ "from": "Vive.LeftGrip", "to": "Standard.LeftGrip" },
|
||||||
{ "from": "Vive.LS", "to": "Standard.LS" },
|
{ "from": "Vive.LS", "to": "Standard.LS" },
|
||||||
{ "from": "Vive.LSTouch", "to": "Standard.LSTouch" },
|
{ "from": "Vive.LSTouch", "to": "Standard.LSTouch" },
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
{ "from": "Vive.RX", "when": "Vive.RSOuter", "to": "Standard.RX" },
|
{ "from": "Vive.RX", "when": "Vive.RSOuter", "to": "Standard.RX" },
|
||||||
|
|
||||||
{ "from": "Vive.RT", "to": "Standard.RT" },
|
{ "from": "Vive.RT", "to": "Standard.RT" },
|
||||||
{ "from": "Vive.RightGrip", "to": "Standard.RB" },
|
{ "from": "Vive.RightGrip", "to": "Standard.RightGrip" },
|
||||||
{ "from": "Vive.RS", "to": "Standard.RS" },
|
{ "from": "Vive.RS", "to": "Standard.RS" },
|
||||||
{ "from": "Vive.RSTouch", "to": "Standard.RSTouch" },
|
{ "from": "Vive.RSTouch", "to": "Standard.RSTouch" },
|
||||||
|
|
||||||
|
|
|
@ -66,9 +66,7 @@ namespace controller {
|
||||||
RIGHT_SECONDARY_INDEX_TOUCH,
|
RIGHT_SECONDARY_INDEX_TOUCH,
|
||||||
RIGHT_INDEX_POINT,
|
RIGHT_INDEX_POINT,
|
||||||
|
|
||||||
LEFT_GRIP,
|
|
||||||
LEFT_GRIP_TOUCH,
|
LEFT_GRIP_TOUCH,
|
||||||
RIGHT_GRIP,
|
|
||||||
RIGHT_GRIP_TOUCH,
|
RIGHT_GRIP_TOUCH,
|
||||||
|
|
||||||
NUM_STANDARD_BUTTONS
|
NUM_STANDARD_BUTTONS
|
||||||
|
@ -85,9 +83,9 @@ namespace controller {
|
||||||
// Triggers
|
// Triggers
|
||||||
LT,
|
LT,
|
||||||
RT,
|
RT,
|
||||||
// Grips (Oculus touch squeeze)
|
// Grips
|
||||||
LG,
|
LEFT_GRIP,
|
||||||
RG,
|
RIGHT_GRIP,
|
||||||
NUM_STANDARD_AXES,
|
NUM_STANDARD_AXES,
|
||||||
LZ = LT,
|
LZ = LT,
|
||||||
RZ = RT
|
RZ = RT
|
||||||
|
|
|
@ -120,14 +120,14 @@ static const std::vector<std::pair<ovrButton, StandardButtonChannel>> BUTTON_MAP
|
||||||
{ ovrButton_B, B },
|
{ ovrButton_B, B },
|
||||||
{ ovrButton_LThumb, LS },
|
{ ovrButton_LThumb, LS },
|
||||||
{ ovrButton_RThumb, RS },
|
{ ovrButton_RThumb, RS },
|
||||||
{ ovrButton_LShoulder, LB },
|
//{ ovrButton_LShoulder, LB },
|
||||||
{ ovrButton_RShoulder, RB },
|
//{ ovrButton_RShoulder, RB },
|
||||||
} };
|
} };
|
||||||
|
|
||||||
static const std::vector<std::pair<ovrTouch, StandardButtonChannel>> TOUCH_MAP { {
|
static const std::vector<std::pair<ovrTouch, StandardButtonChannel>> TOUCH_MAP { {
|
||||||
{ ovrTouch_X, LEFT_SECONDARY_THUMB_TOUCH },
|
{ ovrTouch_X, LEFT_PRIMARY_THUMB_TOUCH },
|
||||||
{ ovrTouch_Y, LEFT_SECONDARY_THUMB_TOUCH },
|
{ ovrTouch_Y, LEFT_SECONDARY_THUMB_TOUCH },
|
||||||
{ ovrTouch_A, RIGHT_SECONDARY_THUMB_TOUCH },
|
{ ovrTouch_A, RIGHT_PRIMARY_THUMB_TOUCH },
|
||||||
{ ovrTouch_B, RIGHT_SECONDARY_THUMB_TOUCH },
|
{ ovrTouch_B, RIGHT_SECONDARY_THUMB_TOUCH },
|
||||||
{ ovrTouch_LIndexTrigger, LEFT_PRIMARY_INDEX_TOUCH },
|
{ ovrTouch_LIndexTrigger, LEFT_PRIMARY_INDEX_TOUCH },
|
||||||
{ ovrTouch_RIndexTrigger, RIGHT_PRIMARY_INDEX_TOUCH },
|
{ ovrTouch_RIndexTrigger, RIGHT_PRIMARY_INDEX_TOUCH },
|
||||||
|
@ -183,6 +183,8 @@ void OculusControllerManager::TouchDevice::update(float deltaTime, const control
|
||||||
++numTrackedControllers;
|
++numTrackedControllers;
|
||||||
if (REQUIRED_HAND_STATUS == (tracking.HandStatusFlags[hand] & REQUIRED_HAND_STATUS)) {
|
if (REQUIRED_HAND_STATUS == (tracking.HandStatusFlags[hand] & REQUIRED_HAND_STATUS)) {
|
||||||
handlePose(deltaTime, inputCalibrationData, hand, tracking.HandPoses[hand]);
|
handlePose(deltaTime, inputCalibrationData, hand, tracking.HandPoses[hand]);
|
||||||
|
} else {
|
||||||
|
_poseStateMap[hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND].valid = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
using namespace controller;
|
using namespace controller;
|
||||||
|
@ -191,12 +193,12 @@ void OculusControllerManager::TouchDevice::update(float deltaTime, const control
|
||||||
_axisStateMap[LX] = inputState.Thumbstick[ovrHand_Left].x;
|
_axisStateMap[LX] = inputState.Thumbstick[ovrHand_Left].x;
|
||||||
_axisStateMap[LY] = inputState.Thumbstick[ovrHand_Left].y;
|
_axisStateMap[LY] = inputState.Thumbstick[ovrHand_Left].y;
|
||||||
_axisStateMap[LT] = inputState.IndexTrigger[ovrHand_Left];
|
_axisStateMap[LT] = inputState.IndexTrigger[ovrHand_Left];
|
||||||
_axisStateMap[LG] = inputState.HandTrigger[ovrHand_Left];
|
_axisStateMap[LEFT_GRIP] = inputState.HandTrigger[ovrHand_Left];
|
||||||
|
|
||||||
_axisStateMap[RX] = inputState.Thumbstick[ovrHand_Right].x;
|
_axisStateMap[RX] = inputState.Thumbstick[ovrHand_Right].x;
|
||||||
_axisStateMap[RY] = inputState.Thumbstick[ovrHand_Right].y;
|
_axisStateMap[RY] = inputState.Thumbstick[ovrHand_Right].y;
|
||||||
_axisStateMap[RT] = inputState.IndexTrigger[ovrHand_Right];
|
_axisStateMap[RT] = inputState.IndexTrigger[ovrHand_Right];
|
||||||
_axisStateMap[RG] = inputState.HandTrigger[ovrHand_Right];
|
_axisStateMap[RIGHT_GRIP] = inputState.HandTrigger[ovrHand_Right];
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
for (const auto& pair : BUTTON_MAP) {
|
for (const auto& pair : BUTTON_MAP) {
|
||||||
|
@ -220,38 +222,142 @@ void OculusControllerManager::TouchDevice::focusOutEvent() {
|
||||||
void OculusControllerManager::TouchDevice::handlePose(float deltaTime,
|
void OculusControllerManager::TouchDevice::handlePose(float deltaTime,
|
||||||
const controller::InputCalibrationData& inputCalibrationData, ovrHandType hand,
|
const controller::InputCalibrationData& inputCalibrationData, ovrHandType hand,
|
||||||
const ovrPoseStatef& handPose) {
|
const ovrPoseStatef& handPose) {
|
||||||
|
// When the sensor-to-world rotation is identity the coordinate axes look like this:
|
||||||
|
//
|
||||||
|
// user
|
||||||
|
// forward
|
||||||
|
// -z
|
||||||
|
// |
|
||||||
|
// y| user
|
||||||
|
// y o----x right
|
||||||
|
// o-----x user
|
||||||
|
// | up
|
||||||
|
// |
|
||||||
|
// z
|
||||||
|
//
|
||||||
|
// Rift
|
||||||
|
|
||||||
|
// From ABOVE the hand canonical axes looks like this:
|
||||||
|
//
|
||||||
|
// | | | | y | | | |
|
||||||
|
// | | | | | | | | |
|
||||||
|
// | | | | |
|
||||||
|
// |left | / x---- + \ |right|
|
||||||
|
// | _/ z \_ |
|
||||||
|
// | | | |
|
||||||
|
// | | | |
|
||||||
|
//
|
||||||
|
|
||||||
|
// So when the user is in Rift space facing the -zAxis with hands outstretched and palms down
|
||||||
|
// the rotation to align the Touch axes with those of the hands is:
|
||||||
|
//
|
||||||
|
// touchToHand = halfTurnAboutY * quaterTurnAboutX
|
||||||
|
|
||||||
|
// Due to how the Touch controllers fit into the palm there is an offset that is different for each hand.
|
||||||
|
// You can think of this offset as the inverse of the measured rotation when the hands are posed, such that
|
||||||
|
// the combination (measurement * offset) is identity at this orientation.
|
||||||
|
//
|
||||||
|
// Qoffset = glm::inverse(deltaRotation when hand is posed fingers forward, palm down)
|
||||||
|
//
|
||||||
|
// An approximate offset for the Touch can be obtained by inspection:
|
||||||
|
//
|
||||||
|
// Qoffset = glm::inverse(glm::angleAxis(sign * PI/2.0f, zAxis) * glm::angleAxis(PI/4.0f, xAxis))
|
||||||
|
//
|
||||||
|
// So the full equation is:
|
||||||
|
//
|
||||||
|
// Q = combinedMeasurement * touchToHand
|
||||||
|
//
|
||||||
|
// Q = (deltaQ * QOffset) * (yFlip * quarterTurnAboutX)
|
||||||
|
//
|
||||||
|
// Q = (deltaQ * inverse(deltaQForAlignedHand)) * (yFlip * quarterTurnAboutX)
|
||||||
|
|
||||||
auto poseId = hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND;
|
auto poseId = hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND;
|
||||||
auto& pose = _poseStateMap[poseId];
|
auto& pose = _poseStateMap[poseId];
|
||||||
|
|
||||||
|
static const glm::quat yFlip = glm::angleAxis(PI, Vectors::UNIT_Y);
|
||||||
|
static const glm::quat quarterX = glm::angleAxis(PI_OVER_TWO, Vectors::UNIT_X);
|
||||||
|
static const glm::quat touchToHand = yFlip * quarterX;
|
||||||
|
|
||||||
|
static const glm::quat leftQuarterZ = glm::angleAxis(-PI_OVER_TWO, Vectors::UNIT_Z);
|
||||||
|
static const glm::quat rightQuarterZ = glm::angleAxis(PI_OVER_TWO, Vectors::UNIT_Z);
|
||||||
|
static const glm::quat eighthX = glm::angleAxis(PI / 4.0f, Vectors::UNIT_X);
|
||||||
|
|
||||||
|
static const glm::quat leftRotationOffset = glm::inverse(leftQuarterZ * eighthX) * touchToHand;
|
||||||
|
static const glm::quat rightRotationOffset = glm::inverse(rightQuarterZ * eighthX) * touchToHand;
|
||||||
|
|
||||||
|
static const float CONTROLLER_LENGTH_OFFSET = 0.0762f; // three inches
|
||||||
|
static const glm::vec3 CONTROLLER_OFFSET = glm::vec3(CONTROLLER_LENGTH_OFFSET / 2.0f,
|
||||||
|
CONTROLLER_LENGTH_OFFSET / 2.0f,
|
||||||
|
CONTROLLER_LENGTH_OFFSET * 2.0f);
|
||||||
|
static const glm::vec3 leftTranslationOffset = glm::vec3(-1.0f, 1.0f, 1.0f) * CONTROLLER_OFFSET;
|
||||||
|
static const glm::vec3 rightTranslationOffset = CONTROLLER_OFFSET;
|
||||||
|
|
||||||
|
auto translationOffset = (hand == ovrHand_Left ? leftTranslationOffset : rightTranslationOffset);
|
||||||
|
auto rotationOffset = (hand == ovrHand_Left ? leftRotationOffset : rightRotationOffset);
|
||||||
|
|
||||||
|
glm::quat rotation = toGlm(handPose.ThePose.Orientation);
|
||||||
|
|
||||||
pose.translation = toGlm(handPose.ThePose.Position);
|
pose.translation = toGlm(handPose.ThePose.Position);
|
||||||
pose.rotation = toGlm(handPose.ThePose.Orientation);
|
pose.translation += rotation * translationOffset;
|
||||||
|
pose.rotation = rotation * rotationOffset;
|
||||||
pose.angularVelocity = toGlm(handPose.AngularVelocity);
|
pose.angularVelocity = toGlm(handPose.AngularVelocity);
|
||||||
pose.velocity = toGlm(handPose.LinearVelocity);
|
pose.velocity = toGlm(handPose.LinearVelocity);
|
||||||
|
pose.valid = true;
|
||||||
|
|
||||||
|
// transform into avatar frame
|
||||||
|
glm::mat4 controllerToAvatar = glm::inverse(inputCalibrationData.avatarMat) * inputCalibrationData.sensorToWorldMat;
|
||||||
|
pose = pose.transform(controllerToAvatar);
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailableInputs() const {
|
controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailableInputs() const {
|
||||||
using namespace controller;
|
using namespace controller;
|
||||||
QVector<Input::NamedPair> availableInputs{
|
QVector<Input::NamedPair> availableInputs{
|
||||||
// Trackpad analogs
|
// buttons
|
||||||
|
makePair(A, "A"),
|
||||||
|
makePair(B, "B"),
|
||||||
|
makePair(X, "X"),
|
||||||
|
makePair(Y, "Y"),
|
||||||
|
|
||||||
|
// trackpad analogs
|
||||||
makePair(LX, "LX"),
|
makePair(LX, "LX"),
|
||||||
makePair(LY, "LY"),
|
makePair(LY, "LY"),
|
||||||
makePair(RX, "RX"),
|
makePair(RX, "RX"),
|
||||||
makePair(RY, "RY"),
|
makePair(RY, "RY"),
|
||||||
// trigger analogs
|
|
||||||
|
// triggers
|
||||||
makePair(LT, "LT"),
|
makePair(LT, "LT"),
|
||||||
makePair(RT, "RT"),
|
makePair(RT, "RT"),
|
||||||
|
|
||||||
makePair(LB, "LB"),
|
// trigger buttons
|
||||||
makePair(RB, "RB"),
|
//makePair(LB, "LB"),
|
||||||
|
//makePair(RB, "RB"),
|
||||||
|
|
||||||
|
// side grip triggers
|
||||||
|
makePair(LEFT_GRIP, "LeftGrip"),
|
||||||
|
makePair(RIGHT_GRIP, "RightGrip"),
|
||||||
|
|
||||||
|
// joystick buttons
|
||||||
makePair(LS, "LS"),
|
makePair(LS, "LS"),
|
||||||
makePair(RS, "RS"),
|
makePair(RS, "RS"),
|
||||||
|
|
||||||
makePair(LEFT_HAND, "LeftHand"),
|
makePair(LEFT_HAND, "LeftHand"),
|
||||||
makePair(RIGHT_HAND, "RightHand"),
|
makePair(RIGHT_HAND, "RightHand"),
|
||||||
|
|
||||||
makePair(LEFT_PRIMARY_THUMB, "LeftPrimaryThumb"),
|
makePair(LEFT_PRIMARY_THUMB_TOUCH, "LeftPrimaryThumbTouch"),
|
||||||
makePair(LEFT_SECONDARY_THUMB, "LeftSecondaryThumb"),
|
makePair(LEFT_SECONDARY_THUMB_TOUCH, "LeftSecondaryThumbTouch"),
|
||||||
makePair(RIGHT_PRIMARY_THUMB, "RightPrimaryThumb"),
|
makePair(RIGHT_PRIMARY_THUMB_TOUCH, "RightPrimaryThumbTouch"),
|
||||||
makePair(RIGHT_SECONDARY_THUMB, "RightSecondaryThumb"),
|
makePair(RIGHT_SECONDARY_THUMB_TOUCH, "RightSecondaryThumbTouch"),
|
||||||
|
makePair(LEFT_PRIMARY_INDEX_TOUCH, "LeftPrimaryIndexTouch"),
|
||||||
|
makePair(RIGHT_PRIMARY_INDEX_TOUCH, "RightPrimaryIndexTouch"),
|
||||||
|
makePair(LS_TOUCH, "LSTouch"),
|
||||||
|
makePair(RS_TOUCH, "RSTouch"),
|
||||||
|
makePair(LEFT_THUMB_UP, "LeftThumbUp"),
|
||||||
|
makePair(RIGHT_THUMB_UP, "RightThumbUp"),
|
||||||
|
makePair(LEFT_INDEX_POINT, "LeftIndexPoint"),
|
||||||
|
makePair(RIGHT_INDEX_POINT, "RightIndexPoint"),
|
||||||
|
|
||||||
|
makePair(BACK, "LeftApplicationMenu"),
|
||||||
|
makePair(START, "RightApplicationMenu"),
|
||||||
};
|
};
|
||||||
return availableInputs;
|
return availableInputs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,7 +347,7 @@ void ViveControllerManager::InputDevice::handleButtonEvent(float deltaTime, uint
|
||||||
if (button == vr::k_EButton_ApplicationMenu) {
|
if (button == vr::k_EButton_ApplicationMenu) {
|
||||||
_buttonPressedMap.insert(isLeftHand ? LEFT_APP_MENU : RIGHT_APP_MENU);
|
_buttonPressedMap.insert(isLeftHand ? LEFT_APP_MENU : RIGHT_APP_MENU);
|
||||||
} else if (button == vr::k_EButton_Grip) {
|
} else if (button == vr::k_EButton_Grip) {
|
||||||
_buttonPressedMap.insert(isLeftHand ? LEFT_GRIP : RIGHT_GRIP);
|
_axisStateMap[isLeftHand ? LEFT_GRIP : RIGHT_GRIP] = 1.0f;
|
||||||
} else if (button == vr::k_EButton_SteamVR_Trigger) {
|
} else if (button == vr::k_EButton_SteamVR_Trigger) {
|
||||||
_buttonPressedMap.insert(isLeftHand ? LT : RT);
|
_buttonPressedMap.insert(isLeftHand ? LT : RT);
|
||||||
} else if (button == vr::k_EButton_SteamVR_Touchpad) {
|
} else if (button == vr::k_EButton_SteamVR_Touchpad) {
|
||||||
|
|
|
@ -265,9 +265,11 @@ eventMapping.from(Controller.Standard.RightSecondaryThumb).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.LT).peek().to(goActive);
|
eventMapping.from(Controller.Standard.LT).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.LB).peek().to(goActive);
|
eventMapping.from(Controller.Standard.LB).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.LS).peek().to(goActive);
|
eventMapping.from(Controller.Standard.LS).peek().to(goActive);
|
||||||
|
eventMapping.from(Controller.Standard.LeftGrip).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.RT).peek().to(goActive);
|
eventMapping.from(Controller.Standard.RT).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.RB).peek().to(goActive);
|
eventMapping.from(Controller.Standard.RB).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.RS).peek().to(goActive);
|
eventMapping.from(Controller.Standard.RS).peek().to(goActive);
|
||||||
|
eventMapping.from(Controller.Standard.RightGrip).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.Back).peek().to(goActive);
|
eventMapping.from(Controller.Standard.Back).peek().to(goActive);
|
||||||
eventMapping.from(Controller.Standard.Start).peek().to(goActive);
|
eventMapping.from(Controller.Standard.Start).peek().to(goActive);
|
||||||
Controller.enableMapping(eventMappingName);
|
Controller.enableMapping(eventMappingName);
|
||||||
|
|
|
@ -271,7 +271,7 @@ function MyController(hand) {
|
||||||
|
|
||||||
this.triggerValue = 0; // rolling average of trigger value
|
this.triggerValue = 0; // rolling average of trigger value
|
||||||
this.rawTriggerValue = 0;
|
this.rawTriggerValue = 0;
|
||||||
this.rawBumperValue = 0;
|
this.rawSecondaryValue = 0;
|
||||||
this.rawThumbValue = 0;
|
this.rawThumbValue = 0;
|
||||||
|
|
||||||
//for visualizations
|
//for visualizations
|
||||||
|
@ -509,10 +509,10 @@ function MyController(hand) {
|
||||||
var searchSphereLocation = Vec3.sum(distantPickRay.origin,
|
var searchSphereLocation = Vec3.sum(distantPickRay.origin,
|
||||||
Vec3.multiply(distantPickRay.direction, this.searchSphereDistance));
|
Vec3.multiply(distantPickRay.direction, this.searchSphereDistance));
|
||||||
this.searchSphereOn(searchSphereLocation, SEARCH_SPHERE_SIZE * this.searchSphereDistance,
|
this.searchSphereOn(searchSphereLocation, SEARCH_SPHERE_SIZE * this.searchSphereDistance,
|
||||||
(this.triggerSmoothedGrab() || this.bumperSqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
|
(this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
|
||||||
if ((USE_OVERLAY_LINES_FOR_SEARCHING === true) && PICK_WITH_HAND_RAY) {
|
if ((USE_OVERLAY_LINES_FOR_SEARCHING === true) && PICK_WITH_HAND_RAY) {
|
||||||
this.overlayLineOn(handPosition, searchSphereLocation,
|
this.overlayLineOn(handPosition, searchSphereLocation,
|
||||||
(this.triggerSmoothedGrab() || this.bumperSqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
|
(this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,8 +768,8 @@ function MyController(hand) {
|
||||||
_this.rawTriggerValue = value;
|
_this.rawTriggerValue = value;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.bumperPress = function(value) {
|
this.secondaryPress = function(value) {
|
||||||
_this.rawBumperValue = value;
|
_this.rawSecondaryValue = value;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.updateSmoothedTrigger = function() {
|
this.updateSmoothedTrigger = function() {
|
||||||
|
@ -791,20 +791,20 @@ function MyController(hand) {
|
||||||
return this.triggerValue < TRIGGER_OFF_VALUE;
|
return this.triggerValue < TRIGGER_OFF_VALUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.bumperSqueezed = function() {
|
this.secondarySqueezed = function() {
|
||||||
return _this.rawBumperValue > BUMPER_ON_VALUE;
|
return _this.rawSecondaryValue > BUMPER_ON_VALUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.bumperReleased = function() {
|
this.secondaryReleased = function() {
|
||||||
return _this.rawBumperValue < BUMPER_ON_VALUE;
|
return _this.rawSecondaryValue < BUMPER_ON_VALUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// this.triggerOrBumperSqueezed = function() {
|
// this.triggerOrsecondarySqueezed = function() {
|
||||||
// return triggerSmoothedSqueezed() || bumperSqueezed();
|
// return triggerSmoothedSqueezed() || secondarySqueezed();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// this.triggerAndBumperReleased = function() {
|
// this.triggerAndSecondaryReleased = function() {
|
||||||
// return triggerSmoothedReleased() && bumperReleased();
|
// return triggerSmoothedReleased() && secondaryReleased();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
this.thumbPress = function(value) {
|
this.thumbPress = function(value) {
|
||||||
|
@ -820,13 +820,13 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.off = function() {
|
this.off = function() {
|
||||||
if (this.triggerSmoothedSqueezed() || this.bumperSqueezed()) {
|
if (this.triggerSmoothedSqueezed() || this.secondarySqueezed()) {
|
||||||
this.lastPickTime = 0;
|
this.lastPickTime = 0;
|
||||||
var controllerHandInput = (this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
|
var controllerHandInput = (this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
|
||||||
this.startingHandRotation = Controller.getPoseValue(controllerHandInput).rotation;
|
this.startingHandRotation = Controller.getPoseValue(controllerHandInput).rotation;
|
||||||
if (this.triggerSmoothedSqueezed()) {
|
if (this.triggerSmoothedSqueezed()) {
|
||||||
this.setState(STATE_SEARCHING);
|
this.setState(STATE_SEARCHING);
|
||||||
} else if (this.bumperSqueezed()) {
|
} else if (this.secondarySqueezed()) {
|
||||||
this.setState(STATE_HOLD_SEARCHING);
|
this.setState(STATE_HOLD_SEARCHING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -843,7 +843,7 @@ function MyController(hand) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.state == STATE_HOLD_SEARCHING && this.bumperReleased()) {
|
if (this.state == STATE_HOLD_SEARCHING && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1000,7 +1000,7 @@ function MyController(hand) {
|
||||||
grabbableData = grabbableDataForCandidate;
|
grabbableData = grabbableDataForCandidate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((this.grabbedEntity !== null) && (this.triggerSmoothedGrab() || this.bumperSqueezed())) {
|
if ((this.grabbedEntity !== null) && (this.triggerSmoothedGrab() || this.secondarySqueezed())) {
|
||||||
// We are squeezing enough to grab, and we've found an entity that we'll try to do something with.
|
// We are squeezing enough to grab, and we've found an entity that we'll try to do something with.
|
||||||
var near = (nearPickedCandidateEntities.indexOf(this.grabbedEntity) >= 0) || minDistance <= NEAR_PICK_MAX_DISTANCE;
|
var near = (nearPickedCandidateEntities.indexOf(this.grabbedEntity) >= 0) || minDistance <= NEAR_PICK_MAX_DISTANCE;
|
||||||
var isPhysical = this.propsArePhysical(props);
|
var isPhysical = this.propsArePhysical(props);
|
||||||
|
@ -1166,7 +1166,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.continueDistanceHolding = function() {
|
this.continueDistanceHolding = function() {
|
||||||
if (this.triggerSmoothedReleased() && this.bumperReleased()) {
|
if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("releaseGrab");
|
this.callEntityMethodOnGrabbed("releaseGrab");
|
||||||
return;
|
return;
|
||||||
|
@ -1390,7 +1390,7 @@ function MyController(hand) {
|
||||||
this.callEntityMethodOnGrabbed("releaseGrab");
|
this.callEntityMethodOnGrabbed("releaseGrab");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.state == STATE_HOLD && this.bumperReleased()) {
|
if (this.state == STATE_HOLD && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("releaseGrab");
|
this.callEntityMethodOnGrabbed("releaseGrab");
|
||||||
return;
|
return;
|
||||||
|
@ -1504,7 +1504,7 @@ function MyController(hand) {
|
||||||
this.callEntityMethodOnGrabbed("releaseGrab");
|
this.callEntityMethodOnGrabbed("releaseGrab");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.state == STATE_CONTINUE_HOLD && this.bumperReleased()) {
|
if (this.state == STATE_CONTINUE_HOLD && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("releaseEquip");
|
this.callEntityMethodOnGrabbed("releaseEquip");
|
||||||
return;
|
return;
|
||||||
|
@ -1633,7 +1633,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.nearTrigger = function() {
|
this.nearTrigger = function() {
|
||||||
if (this.triggerSmoothedReleased() && this.bumperReleased()) {
|
if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("stopNearTrigger");
|
this.callEntityMethodOnGrabbed("stopNearTrigger");
|
||||||
return;
|
return;
|
||||||
|
@ -1643,7 +1643,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.farTrigger = function() {
|
this.farTrigger = function() {
|
||||||
if (this.triggerSmoothedReleased() && this.bumperReleased()) {
|
if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("stopFarTrigger");
|
this.callEntityMethodOnGrabbed("stopFarTrigger");
|
||||||
return;
|
return;
|
||||||
|
@ -1653,7 +1653,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.continueNearTrigger = function() {
|
this.continueNearTrigger = function() {
|
||||||
if (this.triggerSmoothedReleased() && this.bumperReleased()) {
|
if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("stopNearTrigger");
|
this.callEntityMethodOnGrabbed("stopNearTrigger");
|
||||||
return;
|
return;
|
||||||
|
@ -1662,7 +1662,7 @@ function MyController(hand) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.continueFarTrigger = function() {
|
this.continueFarTrigger = function() {
|
||||||
if (this.triggerSmoothedReleased() && this.bumperReleased()) {
|
if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
this.callEntityMethodOnGrabbed("stopFarTrigger");
|
this.callEntityMethodOnGrabbed("stopFarTrigger");
|
||||||
return;
|
return;
|
||||||
|
@ -1942,8 +1942,10 @@ var mapping = Controller.newMapping(MAPPING_NAME);
|
||||||
mapping.from([Controller.Standard.RT]).peek().to(rightController.triggerPress);
|
mapping.from([Controller.Standard.RT]).peek().to(rightController.triggerPress);
|
||||||
mapping.from([Controller.Standard.LT]).peek().to(leftController.triggerPress);
|
mapping.from([Controller.Standard.LT]).peek().to(leftController.triggerPress);
|
||||||
|
|
||||||
mapping.from([Controller.Standard.RB]).peek().to(rightController.bumperPress);
|
mapping.from([Controller.Standard.RB]).peek().to(rightController.secondaryPress);
|
||||||
mapping.from([Controller.Standard.LB]).peek().to(leftController.bumperPress);
|
mapping.from([Controller.Standard.LB]).peek().to(leftController.secondaryPress);
|
||||||
|
mapping.from([Controller.Standard.LeftGrip]).peek().to(leftController.secondaryPress);
|
||||||
|
mapping.from([Controller.Standard.RightGrip]).peek().to(rightController.secondaryPress);
|
||||||
|
|
||||||
mapping.from([Controller.Standard.LeftPrimaryThumb]).peek().to(leftController.thumbPress);
|
mapping.from([Controller.Standard.LeftPrimaryThumb]).peek().to(leftController.thumbPress);
|
||||||
mapping.from([Controller.Standard.RightPrimaryThumb]).peek().to(rightController.thumbPress);
|
mapping.from([Controller.Standard.RightPrimaryThumb]).peek().to(rightController.thumbPress);
|
||||||
|
|
Loading…
Reference in a new issue