From 81ab68a529c72f7215b6db7c35a7f9e9d433f79f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 20 Jan 2014 12:44:09 -0800 Subject: [PATCH 1/2] Store hand position relative to body orientation/position. --- interface/src/avatar/Avatar.cpp | 4 ---- interface/src/avatar/Avatar.h | 1 - libraries/avatars/src/AvatarData.cpp | 9 +++++++++ libraries/avatars/src/AvatarData.h | 6 ++++-- libraries/shared/src/PacketHeaders.cpp | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 069ad0b7d9..6db0a15300 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -124,10 +124,6 @@ glm::vec3 Avatar::getChestPosition() const { return _skeletonModel.getNeckPosition(neckPosition) ? (_position + neckPosition) * 0.5f : _position; } -glm::quat Avatar::getOrientation() const { - return glm::quat(glm::radians(glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll))); -} - glm::quat Avatar::getWorldAlignedOrientation () const { return computeRotationFromBodyToWorldUp() * getOrientation(); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 6248ac92e7..3f1da6bc31 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -92,7 +92,6 @@ public: const glm::vec3& getVelocity() const { return _velocity; } Head& getHead() { return _head; } Hand& getHand() { return _hand; } - glm::quat getOrientation() const; glm::quat getWorldAlignedOrientation() const; bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance) const; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 8cd2f0dffc..35e6c37e96 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -44,6 +44,15 @@ AvatarData::~AvatarData() { delete _handData; } +glm::vec3 AvatarData::getHandPosition() const { + return getOrientation() * _handPosition + _position; +} + +void AvatarData::setHandPosition(const glm::vec3& handPosition) { + // store relative to position/orientation + _handPosition = glm::inverse(getOrientation()) * (handPosition - _position); +} + int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { unsigned char* bufferStart = destinationBuffer; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index c3ca80737d..0005d1eb11 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -76,8 +76,8 @@ public: const glm::vec3& getPosition() const { return _position; } void setPosition(const glm::vec3 position) { _position = position; } - const glm::vec3& getHandPosition() const { return _handPosition; } - void setHandPosition(const glm::vec3 handPosition) { _handPosition = handPosition; } + glm::vec3 getHandPosition() const; + void setHandPosition(const glm::vec3& handPosition); int getBroadcastData(unsigned char* destinationBuffer); int parseData(unsigned char* sourceBuffer, int numBytes); @@ -93,6 +93,8 @@ public: float getBodyRoll() const { return _bodyRoll; } void setBodyRoll(float bodyRoll) { _bodyRoll = bodyRoll; } + glm::quat getOrientation() const { return glm::quat(glm::radians(glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll))); } + // Scale float getTargetScale() const { return _targetScale; } void setTargetScale(float targetScale) { _targetScale = targetScale; } diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index 0d468f0e1d..1ca0d99055 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -20,7 +20,7 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) { return 2; case PACKET_TYPE_HEAD_DATA: - return 14; + return 15; case PACKET_TYPE_AVATAR_URLS: return 2; From 804ce83fa6fe4335f97f7c938d4f560da0ed28f0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 20 Jan 2014 13:44:41 -0800 Subject: [PATCH 2/2] Get the base position/orientation directly from the avatar to prevent jerkiness when flying with the Hydra. Also, restore arm lengths when the Hydra becomes inactive. --- interface/src/avatar/Hand.cpp | 13 ++----------- interface/src/renderer/Model.cpp | 5 ++++- libraries/avatars/src/HandData.cpp | 15 +++++++++++---- libraries/avatars/src/HandData.h | 10 ++++++---- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 201b332a8c..e5be719b40 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -262,15 +262,6 @@ void Hand::simulate(float deltaTime, bool isMine) { if (isMine) { _buckyBalls.simulate(deltaTime); - } - - const glm::vec3 leapHandsOffsetFromFace(0.0, -0.2, -0.3); // place the hand in front of the face where we can see it - - Head& head = _owningAvatar->getHead(); - _baseOrientation = _owningAvatar->getOrientation(); - _basePosition = head.calculateAverageEyePosition() + _baseOrientation * leapHandsOffsetFromFace * head.getScale(); - - if (isMine) { updateCollisions(); } @@ -465,7 +456,7 @@ void Hand::calculateGeometry() { const float standardBallRadius = FINGERTIP_COLLISION_RADIUS; _leapFingerTipBalls.resize(_leapFingerTipBalls.size() + 1); HandBall& ball = _leapFingerTipBalls.back(); - ball.rotation = _baseOrientation; + ball.rotation = getBaseOrientation(); ball.position = finger.getTipPosition(); ball.radius = standardBallRadius; ball.touchForce = 0.0; @@ -487,7 +478,7 @@ void Hand::calculateGeometry() { const float standardBallRadius = 0.005f; _leapFingerRootBalls.resize(_leapFingerRootBalls.size() + 1); HandBall& ball = _leapFingerRootBalls.back(); - ball.rotation = _baseOrientation; + ball.rotation = getBaseOrientation(); ball.position = finger.getRootPosition(); ball.radius = standardBallRadius; ball.touchForce = 0.0; diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 76cf655c1e..c6c820a0f9 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -798,7 +798,10 @@ bool Model::restoreJointPosition(int jointIndex, float percent) { const QVector& freeLineage = geometry.joints.at(jointIndex).freeLineage; foreach (int index, freeLineage) { - _jointStates[index].rotation = safeMix(_jointStates[index].rotation, geometry.joints.at(index).rotation, percent); + JointState& state = _jointStates[index]; + const FBXJoint& joint = geometry.joints.at(index); + state.rotation = safeMix(state.rotation, joint.rotation, percent); + state.translation = glm::mix(state.translation, joint.translation, percent); } return true; } diff --git a/libraries/avatars/src/HandData.cpp b/libraries/avatars/src/HandData.cpp index 7fc0c79b47..81d4469486 100644 --- a/libraries/avatars/src/HandData.cpp +++ b/libraries/avatars/src/HandData.cpp @@ -16,8 +16,6 @@ const int fingerVectorRadix = 4; HandData::HandData(AvatarData* owningAvatar) : - _basePosition(0.0f, 0.0f, 0.0f), - _baseOrientation(0.0f, 0.0f, 0.0f, 1.0f), _owningAvatarData(owningAvatar) { // Start with two palms @@ -26,11 +24,11 @@ HandData::HandData(AvatarData* owningAvatar) : } glm::vec3 HandData::worldPositionToLeapPosition(const glm::vec3& worldPosition) const { - return glm::inverse(_baseOrientation) * (worldPosition - _basePosition) / LEAP_UNIT_SCALE; + return glm::inverse(getBaseOrientation()) * (worldPosition - getBasePosition()) / LEAP_UNIT_SCALE; } glm::vec3 HandData::worldVectorToLeapVector(const glm::vec3& worldVector) const { - return glm::inverse(_baseOrientation) * worldVector / LEAP_UNIT_SCALE; + return glm::inverse(getBaseOrientation()) * worldVector / LEAP_UNIT_SCALE; } PalmData& HandData::addNewPalm() { @@ -254,6 +252,15 @@ bool HandData::findSpherePenetration(const glm::vec3& penetratorCenter, float pe return false; } +glm::quat HandData::getBaseOrientation() const { + return _owningAvatarData->getOrientation(); +} + +glm::vec3 HandData::getBasePosition() const { + const glm::vec3 LEAP_HANDS_OFFSET_FROM_TORSO(0.0, 0.3, -0.3); + return _owningAvatarData->getPosition() + getBaseOrientation() * LEAP_HANDS_OFFSET_FROM_TORSO * + _owningAvatarData->getTargetScale(); +} void FingerData::setTrailLength(unsigned int length) { _tipTrailPositions.resize(length); diff --git a/libraries/avatars/src/HandData.h b/libraries/avatars/src/HandData.h index ef9009312e..4faf408fca 100755 --- a/libraries/avatars/src/HandData.h +++ b/libraries/avatars/src/HandData.h @@ -50,10 +50,10 @@ public: // position conversion glm::vec3 leapPositionToWorldPosition(const glm::vec3& leapPosition) { - return _basePosition + _baseOrientation * (leapPosition * LEAP_UNIT_SCALE); + return getBasePosition() + getBaseOrientation() * (leapPosition * LEAP_UNIT_SCALE); } glm::vec3 leapDirectionToWorldDirection(const glm::vec3& leapDirection) { - return _baseOrientation * leapDirection; + return getBaseOrientation() * leapDirection; } glm::vec3 worldPositionToLeapPosition(const glm::vec3& worldPosition) const; glm::vec3 worldVectorToLeapVector(const glm::vec3& worldVector) const; @@ -86,10 +86,12 @@ public: friend class AvatarData; protected: - glm::vec3 _basePosition; // Hands are placed relative to this - glm::quat _baseOrientation; // Hands are placed relative to this AvatarData* _owningAvatarData; std::vector _palms; + + glm::quat getBaseOrientation() const; + glm::vec3 getBasePosition() const; + private: // privatize copy ctor and assignment operator so copies of this object cannot be made HandData(const HandData&);