From f3c87b81ec0363a42b977df1d3fa5956cfbd32bb Mon Sep 17 00:00:00 2001 From: atlante45 Date: Thu, 25 Jul 2013 16:14:47 -0700 Subject: [PATCH] Avatar can follow but don't look at the same point for the moment --- interface/src/Application.cpp | 1 - interface/src/avatar/Avatar.cpp | 47 ++++++++++++++++++++++++++++++--- interface/src/avatar/Avatar.h | 4 ++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f3b1f4a304..c7be8c014a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3421,7 +3421,6 @@ void Application::toggleFollowMode() { eyePositionIgnored, nodeIDIgnored); - qDebug("[DEBUG] toggleFollowMode() %d\n", leadingAvatar); _myAvatar.follow(leadingAvatar); } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index a613822fbf..bf9b4bb732 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -404,6 +404,32 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { _thrust += _scale * THRUST_JUMP * up; _shouldJump = false; } + + // Add thrusts from leading avatar + if (_leadingAvatar != NULL) { + glm::vec3 toTarget = _leadingAvatar->getPosition() - _position; + + if (.5f < up.x * toTarget.x + up.y * toTarget.y + up.z * toTarget.z) { + _thrust += _scale * THRUST_MAG_UP * deltaTime * up; + } else if (up.x * toTarget.x + up.y * toTarget.y + up.z * toTarget.z < -.5f) { + _thrust -= _scale * THRUST_MAG_UP * deltaTime * up; + } + + if (glm::length(_position - _leadingAvatar->getPosition()) > _scale * _stringLength) { + _thrust += _scale * THRUST_MAG_FWD * deltaTime * front; + } else { + toTarget = _leadingAvatar->getHead().getLookAtPosition(); + } + + float yawAngle = angleBetween(front, glm::vec3(toTarget.x, 0.f, toTarget.z)); + if (yawAngle < -10.f || 10.f < yawAngle){ + if (right.x * toTarget.x + right.y * toTarget.y + right.z * toTarget.z > 0) { + _bodyYawDelta -= YAW_MAG * deltaTime; + } else { + _bodyYawDelta += YAW_MAG * deltaTime; + } + } + } // Add thrusts from Transmitter if (transmitter) { @@ -448,9 +474,15 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { } void Avatar::follow(Avatar* leadingAvatar) { - _leadingAvatar = leadingAvatar; + const float MAX_STRING_LENGTH = 2; - qDebug("[DEBUG] %d\n", _leadingAvatar); + _leadingAvatar = leadingAvatar; + if (_leadingAvatar != NULL) { + _stringLength = glm::length(_position - _leadingAvatar->getPosition()) / _scale; + if (_stringLength > MAX_STRING_LENGTH) { + _stringLength = MAX_STRING_LENGTH; + } + } } void Avatar::simulate(float deltaTime, Transmitter* transmitter) { @@ -481,6 +513,13 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { if (isMyAvatar()) { updateThrust(deltaTime, transmitter); } + + // Ajust, scale, thrust and lookAt position when following an other avatar + if (isMyAvatar() && _leadingAvatar && _scale != _leadingAvatar->getScale()) { + float scale = 0.95f * _scale + 0.05f * _leadingAvatar->getScale(); + setScale(scale); + Application::getInstance()->getCamera()->setScale(scale); + } // copy velocity so we can use it later for acceleration glm::vec3 oldVelocity = getVelocity(); @@ -687,7 +726,9 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { _head.setScale(_scale); _head.setSkinColor(glm::vec3(SKIN_COLOR[0], SKIN_COLOR[1], SKIN_COLOR[2])); _head.simulate(deltaTime, isMyAvatar()); - + + + // use speed and angular velocity to determine walking vs. standing if (_speed + fabs(_bodyYawDelta) > 0.2) { _mode = AVATAR_MODE_WALKING; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 02f360f83f..c69cbbadbf 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -253,8 +253,10 @@ private: glm::vec3 _lastCollisionPosition; bool _speedBrakes; bool _isThrustOn; + Avatar* _leadingAvatar; - + float _stringLength; + AvatarVoxelSystem _voxels; // private methods...