mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-10 09:36:27 +02:00
Merge branch 'distance-grab-adjustment' of github.com:sethalves/hifi into parents
This commit is contained in:
commit
f940a5c1c5
1 changed files with 27 additions and 7 deletions
|
@ -34,9 +34,10 @@ var BUMPER_ON_VALUE = 0.5;
|
||||||
// distant manipulation
|
// distant manipulation
|
||||||
//
|
//
|
||||||
|
|
||||||
var DISTANCE_HOLDING_RADIUS_FACTOR = 5; // multiplied by distance between hand and object
|
var DISTANCE_HOLDING_RADIUS_FACTOR = 3.5; // multiplied by distance between hand and object
|
||||||
var DISTANCE_HOLDING_ACTION_TIMEFRAME = 0.1; // how quickly objects move to their new position
|
var DISTANCE_HOLDING_ACTION_TIMEFRAME = 0.1; // how quickly objects move to their new position
|
||||||
var DISTANCE_HOLDING_ROTATION_EXAGGERATION_FACTOR = 2.0; // object rotates this much more than hand did
|
var DISTANCE_HOLDING_ROTATION_EXAGGERATION_FACTOR = 2.0; // object rotates this much more than hand did
|
||||||
|
var MOVE_WITH_HEAD = true; // experimental head-controll of distantly held objects
|
||||||
|
|
||||||
var NO_INTERSECT_COLOR = {
|
var NO_INTERSECT_COLOR = {
|
||||||
red: 10,
|
red: 10,
|
||||||
|
@ -658,6 +659,13 @@ function MyController(hand) {
|
||||||
this.currentObjectTime = now;
|
this.currentObjectTime = now;
|
||||||
this.handRelativePreviousPosition = Vec3.subtract(handControllerPosition, MyAvatar.position);
|
this.handRelativePreviousPosition = Vec3.subtract(handControllerPosition, MyAvatar.position);
|
||||||
this.handPreviousRotation = handRotation;
|
this.handPreviousRotation = handRotation;
|
||||||
|
this.currentCameraOrientation = Camera.orientation;
|
||||||
|
|
||||||
|
// compute a constant based on the initial conditions which we use below to exagerate hand motion onto the held object
|
||||||
|
this.radiusScalar = Math.log(Vec3.distance(this.currentObjectPosition, handControllerPosition) + 1.0);
|
||||||
|
if (this.radiusScalar < 1.0) {
|
||||||
|
this.radiusScalar = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
this.actionID = NULL_ACTION_ID;
|
this.actionID = NULL_ACTION_ID;
|
||||||
this.actionID = Entities.addAction("spring", this.grabbedEntity, {
|
this.actionID = Entities.addAction("spring", this.grabbedEntity, {
|
||||||
|
@ -689,8 +697,6 @@ function MyController(hand) {
|
||||||
this.currentAvatarOrientation = MyAvatar.orientation;
|
this.currentAvatarOrientation = MyAvatar.orientation;
|
||||||
|
|
||||||
this.overlayLineOff();
|
this.overlayLineOff();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.continueDistanceHolding = function() {
|
this.continueDistanceHolding = function() {
|
||||||
|
@ -719,8 +725,12 @@ function MyController(hand) {
|
||||||
this.lineOn(handPosition, Vec3.subtract(grabbedProperties.position, handPosition), INTERSECT_COLOR);
|
this.lineOn(handPosition, Vec3.subtract(grabbedProperties.position, handPosition), INTERSECT_COLOR);
|
||||||
|
|
||||||
// the action was set up on a previous call. update the targets.
|
// the action was set up on a previous call. update the targets.
|
||||||
var radius = Math.max(Vec3.distance(this.currentObjectPosition, handControllerPosition) *
|
var radius = Vec3.distance(this.currentObjectPosition, handControllerPosition) *
|
||||||
DISTANCE_HOLDING_RADIUS_FACTOR, DISTANCE_HOLDING_RADIUS_FACTOR);
|
this.radiusScalar * DISTANCE_HOLDING_RADIUS_FACTOR;
|
||||||
|
if (radius < 1.0) {
|
||||||
|
radius = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
// how far did avatar move this timestep?
|
// how far did avatar move this timestep?
|
||||||
var currentPosition = MyAvatar.position;
|
var currentPosition = MyAvatar.position;
|
||||||
var avatarDeltaPosition = Vec3.subtract(currentPosition, this.currentAvatarPosition);
|
var avatarDeltaPosition = Vec3.subtract(currentPosition, this.currentAvatarPosition);
|
||||||
|
@ -751,11 +761,11 @@ function MyController(hand) {
|
||||||
var handMoved = Vec3.subtract(handToAvatar, this.handRelativePreviousPosition);
|
var handMoved = Vec3.subtract(handToAvatar, this.handRelativePreviousPosition);
|
||||||
this.handRelativePreviousPosition = handToAvatar;
|
this.handRelativePreviousPosition = handToAvatar;
|
||||||
|
|
||||||
// magnify the hand movement but not the change from avatar movement & rotation
|
// magnify the hand movement but not the change from avatar movement & rotation
|
||||||
handMoved = Vec3.subtract(handMoved, handMovementFromTurning);
|
handMoved = Vec3.subtract(handMoved, handMovementFromTurning);
|
||||||
var superHandMoved = Vec3.multiply(handMoved, radius);
|
var superHandMoved = Vec3.multiply(handMoved, radius);
|
||||||
|
|
||||||
// Move the object by the magnified amount and then by amount from avatar movement & rotation
|
// Move the object by the magnified amount and then by amount from avatar movement & rotation
|
||||||
var newObjectPosition = Vec3.sum(this.currentObjectPosition, superHandMoved);
|
var newObjectPosition = Vec3.sum(this.currentObjectPosition, superHandMoved);
|
||||||
newObjectPosition = Vec3.sum(newObjectPosition, avatarDeltaPosition);
|
newObjectPosition = Vec3.sum(newObjectPosition, avatarDeltaPosition);
|
||||||
newObjectPosition = Vec3.sum(newObjectPosition, objectMovementFromTurning);
|
newObjectPosition = Vec3.sum(newObjectPosition, objectMovementFromTurning);
|
||||||
|
@ -777,6 +787,16 @@ function MyController(hand) {
|
||||||
|
|
||||||
Entities.callEntityMethod(this.grabbedEntity, "continueDistantGrab");
|
Entities.callEntityMethod(this.grabbedEntity, "continueDistantGrab");
|
||||||
|
|
||||||
|
// mix in head motion
|
||||||
|
if (MOVE_WITH_HEAD) {
|
||||||
|
var objDistance = Vec3.length(objectToAvatar);
|
||||||
|
var before = Vec3.multiplyQbyV(this.currentCameraOrientation, { x: 0.0, y: 0.0, z: objDistance });
|
||||||
|
var after = Vec3.multiplyQbyV(Camera.orientation, { x: 0.0, y: 0.0, z: objDistance });
|
||||||
|
var change = Vec3.subtract(before, after);
|
||||||
|
this.currentCameraOrientation = Camera.orientation;
|
||||||
|
this.currentObjectPosition = Vec3.sum(this.currentObjectPosition, change);
|
||||||
|
}
|
||||||
|
|
||||||
Entities.updateAction(this.grabbedEntity, this.actionID, {
|
Entities.updateAction(this.grabbedEntity, this.actionID, {
|
||||||
targetPosition: this.currentObjectPosition,
|
targetPosition: this.currentObjectPosition,
|
||||||
linearTimeScale: DISTANCE_HOLDING_ACTION_TIMEFRAME,
|
linearTimeScale: DISTANCE_HOLDING_ACTION_TIMEFRAME,
|
||||||
|
|
Loading…
Reference in a new issue