// handControllerGrab.js // // Created by Seth Alves on 2016-9-7 // Copyright 2016 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html /* global MyAvatar, Vec3, Controller, Quat */ var GRAB_COMMUNICATIONS_SETTING = "io.highfidelity.isFarGrabbing"; setGrabCommunications = function setFarGrabCommunications(on) { Settings.setValue(GRAB_COMMUNICATIONS_SETTING, on ? "on" : ""); } getGrabCommunications = function getFarGrabCommunications() { return !!Settings.getValue(GRAB_COMMUNICATIONS_SETTING, ""); } // this offset needs to match the one in libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp:378 var GRAB_POINT_SPHERE_OFFSET = { x: 0.04, y: 0.13, z: 0.039 }; // x = upward, y = forward, z = lateral getGrabPointSphereOffset = function(handController) { if (handController === Controller.Standard.RightHand) { return GRAB_POINT_SPHERE_OFFSET; } return { x: GRAB_POINT_SPHERE_OFFSET.x * -1, y: GRAB_POINT_SPHERE_OFFSET.y, z: GRAB_POINT_SPHERE_OFFSET.z }; }; // controllerWorldLocation is where the controller would be, in-world, with an added offset getControllerWorldLocation = function (handController, doOffset) { var orientation; var position; var pose = Controller.getPoseValue(handController); var valid = pose.valid; if (pose.valid) { orientation = Quat.multiply(MyAvatar.orientation, pose.rotation); position = Vec3.sum(Vec3.multiplyQbyV(MyAvatar.orientation, pose.translation), MyAvatar.position); // add to the real position so the grab-point is out in front of the hand, a bit if (doOffset) { position = Vec3.sum(position, Vec3.multiplyQbyV(orientation, getGrabPointSphereOffset(handController))); } } else if (!HMD.isHandControllerAvailable()){ position = MyAvatar.getHeadPosition(); orientation = Quat.multiply(MyAvatar.headOrientation, Quat.angleAxis(-90, { x: 1, y: 0, z: 0 })); valid = true; } return {position: position, translation: position, orientation: orientation, rotation: orientation, valid: valid}; };