Refactorting, up/down attenuation and comments

This commit is contained in:
luiscuenca 2019-09-06 17:50:06 -07:00
parent 3b8d3f987d
commit 1f458d195e
No known key found for this signature in database
GPG key ID: 2387ECD129A6961D
2 changed files with 36 additions and 28 deletions

View file

@ -3433,32 +3433,45 @@ void MyAvatar::updateOrientation(float deltaTime) {
head->setBaseYaw(YAW(euler)); head->setBaseYaw(YAW(euler));
head->setBasePitch(PITCH(euler)); head->setBasePitch(PITCH(euler));
head->setBaseRoll(ROLL(euler)); head->setBaseRoll(ROLL(euler));
} else if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { } else if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) {
head->setBaseYaw(0.0f); // Reset head orientation before applying the blending offset
head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime
+ getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT);
head->setBaseRoll(0.0f);
} else {
head->setBaseYaw(0.0f); head->setBaseYaw(0.0f);
head->setBasePitch(0.0f); head->setBasePitch(0.0f);
head->setBaseRoll(0.0f); head->setBaseRoll(0.0f);
/* // Attenuate head pitch
if (_rigEnabled) { glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::UNIT_Z;
glm::vec3 avatarXVector = getWorldOrientation() * Vectors::UNIT_X; glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::UNIT_Z;
glm::vec3 avatarZVector = getWorldOrientation() * Vectors::UNIT_Z; float upDownDirection = glm::dot(cameraVector, Vectors::UNIT_Y);
glm::vec3 cameraZVector = _lookAtOffsetYaw * Vectors::UNIT_Z; float upDownValue = abs(upDownDirection);
float xOffset = glm::dot(avatarXVector, cameraZVector); const float LOOK_UP_MIN_DOT = 0.25f;
float yOffset = glm::dot(avatarZVector, cameraZVector); const float LOOK_DOWN_MIN_DOT = 0.75f;
const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; if (upDownDirection < 0.0f) {
const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; float lookUpAttenuation = upDownValue > LOOK_UP_MIN_DOT ? (upDownValue - LOOK_UP_MIN_DOT) / (1.0f - LOOK_UP_MIN_DOT) : 0.0f;
_skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, glm::vec3(-xOffset, -0.2*yOffset, 0.0f), HEAD_ALPHA_NAME, 1.0f); cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookUpAttenuation);
} else {
float lookDownAttenuation = upDownValue > LOOK_DOWN_MIN_DOT ? (upDownValue - LOOK_DOWN_MIN_DOT) / (1.0f - LOOK_DOWN_MIN_DOT) : 0.0f;
cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookDownAttenuation);
} }
*/ // Calculate the camera target point.
glm::vec3 cameraVector = getLookAtOffset() * Vectors::UNIT_Z;
glm::vec3 cameraPos = qApp->getCamera().getPosition(); glm::vec3 cameraPos = qApp->getCamera().getPosition();
float distanceTargetFromCamera = 2.0f * glm::length(cameraPos - getWorldPosition()); float distanceTargetFromCamera = 2.0f * glm::length(cameraPos - getWorldPosition());
glm::vec3 targetPoint = qApp->getCamera().getPosition() + distanceTargetFromCamera * cameraVector; glm::vec3 targetPoint = qApp->getCamera().getPosition() + distanceTargetFromCamera * cameraVector;
QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, targetPoint));
const float LOOKAT_MIX_ALPHA = 0.05f;
const float FPS = 60.0f;
// Approximate the head's look at vector to the camera look at vector with some delay.
float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS;
mixAlpha = targetSpeed != 0.0f ? mixAlpha * abs(targetSpeed) / _yawSpeed : mixAlpha;
_lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha);
// Set the head look at target
QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, _lookAtCameraTarget));
} else {
head->setBaseYaw(0.0f);
head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime
+ getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT);
head->setBaseRoll(0.0f);
} }
} }
@ -6348,6 +6361,7 @@ void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) {
if (glm::length(headToTargetVector) > EPSILON) { if (glm::length(headToTargetVector) > EPSILON) {
headToTargetVector = glm::normalize(headToTargetVector); headToTargetVector = glm::normalize(headToTargetVector);
} else { } else {
// The target point is the avatar head
return; return;
} }
float xOffset = -glm::dot(avatarXVector, headToTargetVector); float xOffset = -glm::dot(avatarXVector, headToTargetVector);
@ -6355,14 +6369,8 @@ void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) {
const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; const QString HEAD_BLENDING_NAME = "lookAroundAlpha";
const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; const QString HEAD_ALPHA_NAME = "additiveBlendAlpha";
const float HEAD_ALPHA_BLENDING = 1.0f; const float HEAD_ALPHA_BLENDING = 1.0f;
const float LOOK_UP_ATTENUATION = 0.75f; glm::vec3 lookAtBlend = glm::vec3(xOffset, yOffset, 0.0f);
const float LOOK_DOWN_ATTENUATION = 0.25f; _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, lookAtBlend,
const float LOOK_AT_TAU = 0.2f;
yOffset = yOffset > 0 ? LOOK_UP_ATTENUATION * yOffset : LOOK_DOWN_ATTENUATION * yOffset;
_lookAtBlend = _lookAtBlend + LOOK_AT_TAU * (glm::vec3(xOffset, yOffset, 0.0f) - _lookAtBlend);
_skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, _lookAtBlend,
HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING);
} }
} }

View file

@ -2629,7 +2629,7 @@ private:
glm::quat _lookAtOffsetPitch; glm::quat _lookAtOffsetPitch;
glm::quat _lookAtOffsetYaw; glm::quat _lookAtOffsetYaw;
glm::vec3 _lookAtBlend; glm::vec3 _lookAtCameraTarget;
Setting::Handle<float> _realWorldFieldOfView; Setting::Handle<float> _realWorldFieldOfView;
Setting::Handle<bool> _useAdvancedMovementControls; Setting::Handle<bool> _useAdvancedMovementControls;