diff --git a/examples/grab.js b/examples/grab.js index f2c74bb252..8f733e9c9d 100644 --- a/examples/grab.js +++ b/examples/grab.js @@ -60,7 +60,7 @@ var gMouseAtRotateStart = { x: 0, y: 0 }; var gBeaconHeight = 0.10; -var gAngularVelocity = ZERO_VEC3; +// var gAngularVelocity = ZERO_VEC3; // TODO: play sounds again when we aren't leaking AudioInjector threads // var grabSound = SoundCache.getSound("https://hifi-public.s3.amazonaws.com/eric/sounds/CloseClamp.wav"); @@ -194,7 +194,6 @@ function mousePressEvent(event) { var cameraPosition = Camera.getPosition(); gBeaconHeight = Vec3.length(entityProperties.dimensions); - print("gBeaconHeight = " + gBeaconHeight); gMaxGrabDistance = gBeaconHeight / MAX_SOLID_ANGLE; if (Vec3.distance(objectPosition, cameraPosition) > gMaxGrabDistance) { // don't allow grabs of things far away @@ -254,7 +253,7 @@ function mouseMoveEvent(event) { gOriginalGravity = entityProperties.gravity; } - var actionArgs; + var actionArgs = {}; if (gGrabMode === "rotate") { var deltaMouse = { x: 0, y: 0 }; @@ -265,12 +264,13 @@ function mouseMoveEvent(event) { var dragOffset = Vec3.multiply(dx, Quat.getRight(orientation)); dragOffset = Vec3.sum(dragOffset, Vec3.multiply(-dy, Quat.getUp(orientation))); var axis = Vec3.cross(dragOffset, Quat.getFront(orientation)); - // var axis = Vec3.normalize(axis); - // var ROTATE_STRENGTH = 8.0; // magic number tuned by hand - // gAngularVelocity = Vec3.multiply(ROTATE_STRENGTH, axis); - - var targetRotation = Quat.angleAxis(Vec3.length(axis), Vec3.normalize(axis)); - actionArgs = {targetRotation: targetRotation, angularTimeScale: 1.0}; + axis = Vec3.normalize(axis); + var ROTATE_STRENGTH = 8.0; // magic number tuned by hand + var angle = ROTATE_STRENGTH * Math.sqrt((dx * dx) + (dy * dy)); + var deltaQ = Quat.angleAxis(angle, axis); + var qZero = entityProperties.rotation; + var qOne = Quat.multiply(deltaQ, qZero); + actionArgs = {targetRotation: qOne, angularTimeScale: 0.1}; } else { var newTargetPosition; if (gGrabMode === "verticalCylinder") { diff --git a/libraries/entities/src/EntityActionInterface.cpp b/libraries/entities/src/EntityActionInterface.cpp index b3e774df96..399c529aa2 100644 --- a/libraries/entities/src/EntityActionInterface.cpp +++ b/libraries/entities/src/EntityActionInterface.cpp @@ -131,7 +131,7 @@ glm::quat EntityActionInterface::extractQuatArgument(QString objectName, QVarian return glm::quat(); } - return glm::quat(x, y, z, w); + return glm::quat(w, x, y, z); } diff --git a/libraries/physics/src/ObjectActionSpring.cpp b/libraries/physics/src/ObjectActionSpring.cpp index f8b8d92ad5..5badc91f6a 100644 --- a/libraries/physics/src/ObjectActionSpring.cpp +++ b/libraries/physics/src/ObjectActionSpring.cpp @@ -64,8 +64,9 @@ void ObjectActionSpring::updateAction(btCollisionWorld* collisionWorld, btScalar glm::quat deltaQ = _rotationalTarget * qZeroInverse; glm::vec3 axis = glm::axis(deltaQ); float angle = glm::angle(deltaQ); - glm::vec3 newAngularVelocity = (-angle / _angularTimeScale) * glm::normalize(axis); + glm::vec3 newAngularVelocity = (angle / _angularTimeScale) * glm::normalize(axis); rigidBody->setAngularVelocity(glmToBullet(newAngularVelocity)); + rigidBody->activate(); } } } diff --git a/libraries/physics/src/PhysicalEntitySimulation.cpp b/libraries/physics/src/PhysicalEntitySimulation.cpp index 56d497f8a1..a4d2113be6 100644 --- a/libraries/physics/src/PhysicalEntitySimulation.cpp +++ b/libraries/physics/src/PhysicalEntitySimulation.cpp @@ -236,9 +236,9 @@ void PhysicalEntitySimulation::handleCollisionEvents(CollisionEvents& collisionE } EntityActionPointer PhysicalEntitySimulation::actionFactory(EntityActionType type, - QUuid id, - EntityItemPointer ownerEntity, - QVariantMap arguments) { + QUuid id, + EntityItemPointer ownerEntity, + QVariantMap arguments) { EntityActionPointer action = nullptr; switch (type) { case ACTION_TYPE_NONE: