mirror of
https://github.com/lubosz/overte.git
synced 2025-04-24 18:23:22 +02:00
Merge pull request #9975 from hyperlogic/bug-fix/tablet-spawn-location
Tablet spawn orientation now takes hand orientation into account.
This commit is contained in:
commit
4799c33c25
1 changed files with 20 additions and 24 deletions
|
@ -14,6 +14,7 @@ Script.include(Script.resolvePath("../libraries/utils.js"));
|
|||
Script.include(Script.resolvePath("../libraries/controllers.js"));
|
||||
Script.include(Script.resolvePath("../libraries/Xform.js"));
|
||||
|
||||
var VEC3_ZERO = {x: 0, y: 0, z: 0};
|
||||
var X_AXIS = {x: 1, y: 0, z: 0};
|
||||
var Y_AXIS = {x: 0, y: 1, z: 0};
|
||||
var DEFAULT_DPI = 34;
|
||||
|
@ -22,6 +23,7 @@ var DEFAULT_VERTICAL_FIELD_OF_VIEW = 45; // degrees
|
|||
var SENSOR_TO_ROOM_MATRIX = -2;
|
||||
var CAMERA_MATRIX = -7;
|
||||
var ROT_Y_180 = {x: 0, y: 1, z: 0, w: 0};
|
||||
var ROT_IDENT = {x: 0, y: 0, z: 0, w: 1};
|
||||
var TABLET_TEXTURE_RESOLUTION = { x: 480, y: 706 };
|
||||
var INCHES_TO_METERS = 1 / 39.3701;
|
||||
var AVATAR_SELF_ID = "{00000000-0000-0000-0000-000000000001}";
|
||||
|
@ -51,35 +53,29 @@ function calcSpawnInfo(hand, height) {
|
|||
|
||||
if (HMD.active && hand !== NO_HANDS) {
|
||||
var handController = getControllerWorldLocation(hand, true);
|
||||
var controllerPosition = handController.position;
|
||||
|
||||
// base of the tablet is slightly above controller position
|
||||
var TABLET_BASE_DISPLACEMENT = {x: 0, y: 0.1, z: 0};
|
||||
var tabletBase = Vec3.sum(controllerPosition, TABLET_BASE_DISPLACEMENT);
|
||||
|
||||
var d = Vec3.subtract(headPos, tabletBase);
|
||||
var theta = Math.acos(d.y / Vec3.length(d));
|
||||
d.y = 0;
|
||||
if (Vec3.length(d) < 0.0001) {
|
||||
d = {x: 1, y: 0, z: 0};
|
||||
} else {
|
||||
d = Vec3.normalize(d);
|
||||
var TABLET_UP_OFFSET = 0.1;
|
||||
var TABLET_FORWARD_OFFSET = 0.1;
|
||||
var normal = Vec3.multiplyQbyV(handController.rotation, {x: 0, y: -1, z: 0});
|
||||
var pitch = Math.asin(normal.y);
|
||||
var MAX_PITCH = Math.PI / 4;
|
||||
if (pitch < -MAX_PITCH) {
|
||||
pitch = -MAX_PITCH;
|
||||
} else if (pitch > MAX_PITCH) {
|
||||
pitch = MAX_PITCH;
|
||||
}
|
||||
var w = Vec3.normalize(Vec3.cross(Y_AXIS, d));
|
||||
var ANGLE_OFFSET = 25;
|
||||
var q = Quat.angleAxis(theta * (180 / Math.PI) - (90 - ANGLE_OFFSET), w);
|
||||
var u = Vec3.multiplyQbyV(q, d);
|
||||
|
||||
// use u to compute a full lookAt quaternion.
|
||||
var lookAtRot = Quat.lookAt(tabletBase, Vec3.sum(tabletBase, u), Y_AXIS);
|
||||
var yDisplacement = (height / 2);
|
||||
var zDisplacement = 0.05;
|
||||
var tabletOffset = Vec3.multiplyQbyV(lookAtRot, {x: 0, y: yDisplacement, z: zDisplacement});
|
||||
finalPosition = Vec3.sum(tabletBase, tabletOffset);
|
||||
// rebuild normal from pitch and heading.
|
||||
var heading = Math.atan2(normal.z, normal.x);
|
||||
normal = {x: Math.cos(heading), y: Math.sin(pitch), z: Math.sin(heading)};
|
||||
|
||||
var position = Vec3.sum(handController.position, {x: 0, y: TABLET_UP_OFFSET, z: 0});
|
||||
var rotation = Quat.lookAt({x: 0, y: 0, z: 0}, normal, Y_AXIS);
|
||||
var offset = Vec3.multiplyQbyV(rotation, {x: 0, y: height / 2, z: TABLET_FORWARD_OFFSET});
|
||||
|
||||
return {
|
||||
position: finalPosition,
|
||||
rotation: lookAtRot
|
||||
position: Vec3.sum(offset, position),
|
||||
rotation: rotation
|
||||
};
|
||||
} else {
|
||||
var front = Quat.getFront(headRot);
|
||||
|
|
Loading…
Reference in a new issue