Improve eye's look at and blinking. Fix look at update

This commit is contained in:
luiscuenca 2019-10-16 15:29:28 -07:00
parent 505813b3c3
commit 9f0e82e1e6
No known key found for this signature in database
GPG key ID: 2387ECD129A6961D
5 changed files with 28 additions and 18 deletions

View file

@ -6709,8 +6709,9 @@ void MyAvatar::updateLookAtPosition(FaceTracker* faceTracker, Camera& myCamera)
if (headPose.isValid()) { if (headPose.isValid()) {
lookAtSpot = transformPoint(headPose.getMatrix(), glm::vec3(0.0f, 0.0f, TREE_SCALE)); lookAtSpot = transformPoint(headPose.getMatrix(), glm::vec3(0.0f, 0.0f, TREE_SCALE));
} else { } else {
lookAtSpot = myHead->getEyePosition() + lookAtSpot = _shouldTurnToFaceCamera ?
(getHead()->getFinalOrientationInWorldFrame() * glm::vec3(0.0f, 0.0f, -TREE_SCALE)); myHead->getLookAtPosition() :
myHead->getEyePosition() + getHeadJointFrontVector() * (float)TREE_SCALE;
} }
} }

View file

@ -96,15 +96,15 @@ void Head::simulate(float deltaTime) {
// no blinking when brows are raised; blink less with increasing loudness // no blinking when brows are raised; blink less with increasing loudness
const float BASE_BLINK_RATE = 15.0f / 60.0f; const float BASE_BLINK_RATE = 15.0f / 60.0f;
const float ROOT_LOUDNESS_TO_BLINK_INTERVAL = 0.25f; const float ROOT_LOUDNESS_TO_BLINK_INTERVAL = 0.25f;
if (_blinkToRetarget || forceBlink || if (_forceBlinkToRetarget || forceBlink ||
(_browAudioLift < EPSILON && shouldDo(glm::max(1.0f, sqrt(fabs(_averageLoudness - _longTermAverageLoudness)) * (_browAudioLift < EPSILON && shouldDo(glm::max(1.0f, sqrt(fabs(_averageLoudness - _longTermAverageLoudness)) *
ROOT_LOUDNESS_TO_BLINK_INTERVAL) / BASE_BLINK_RATE, deltaTime))) { ROOT_LOUDNESS_TO_BLINK_INTERVAL) / BASE_BLINK_RATE, deltaTime))) {
float randSpeedVariability = randFloat(); float randSpeedVariability = randFloat();
float eyeBlinkVelocity = BLINK_SPEED + randSpeedVariability * BLINK_SPEED_VARIABILITY; float eyeBlinkVelocity = BLINK_SPEED + randSpeedVariability * BLINK_SPEED_VARIABILITY;
if (_blinkToRetarget) { if (_forceBlinkToRetarget) {
// Slow down by half the blink if reseting eye target // Slow down by half the blink if reseting eye target
eyeBlinkVelocity = 0.5f * eyeBlinkVelocity; eyeBlinkVelocity = 0.5f * eyeBlinkVelocity;
_blinkToRetarget = false; _forceBlinkToRetarget = false;
} }
_leftEyeBlinkVelocity = eyeBlinkVelocity; _leftEyeBlinkVelocity = eyeBlinkVelocity;
_rightEyeBlinkVelocity = eyeBlinkVelocity; _rightEyeBlinkVelocity = eyeBlinkVelocity;

View file

@ -1480,6 +1480,7 @@ public:
void setIsNewAvatar(bool isNewAvatar) { _isNewAvatar = isNewAvatar; } void setIsNewAvatar(bool isNewAvatar) { _isNewAvatar = isNewAvatar; }
bool getIsNewAvatar() { return _isNewAvatar; } bool getIsNewAvatar() { return _isNewAvatar; }
void setIsClientAvatar(bool isClientAvatar) { _isClientAvatar = isClientAvatar; } void setIsClientAvatar(bool isClientAvatar) { _isClientAvatar = isClientAvatar; }
bool getIsClientAvatar() const { return _isClientAvatar; }
void setSkeletonData(const std::vector<AvatarSkeletonTrait::UnpackedJointData>& skeletonData); void setSkeletonData(const std::vector<AvatarSkeletonTrait::UnpackedJointData>& skeletonData);
std::vector<AvatarSkeletonTrait::UnpackedJointData> getSkeletonData() const; std::vector<AvatarSkeletonTrait::UnpackedJointData> getSkeletonData() const;
void sendSkeletonData() const; void sendSkeletonData() const;

View file

@ -235,21 +235,29 @@ void HeadData::setFaceTrackerConnected(bool value) {
} }
void HeadData::setLookAtPosition(const glm::vec3& lookAtPosition) { void HeadData::setLookAtPosition(const glm::vec3& lookAtPosition) {
if (_requestLookAtPosition != lookAtPosition) { if (_owningAvatar->getIsClientAvatar() || _owningAvatar->isMyAvatar()) {
_lookAtPositionChanged = usecTimestampNow(); if (_isEyeLookAtUpdated && _requestLookAtPosition != lookAtPosition) {
glm::vec3 oldAvatarLookAtVector = _requestLookAtPosition - _owningAvatar->getWorldPosition(); _lookAtPositionChanged = usecTimestampNow();
glm::vec3 newAvatarLookAtVector = lookAtPosition - _owningAvatar->getWorldPosition(); glm::vec3 oldAvatarLookAtVector = _requestLookAtPosition - _owningAvatar->getWorldPosition();
const float MIN_BLINK_ANGLE = 0.35f; // 20 degrees glm::vec3 newAvatarLookAtVector = lookAtPosition - _owningAvatar->getWorldPosition();
_blinkToRetarget = angleBetween(oldAvatarLookAtVector, newAvatarLookAtVector) > MIN_BLINK_ANGLE; const float MIN_BLINK_ANGLE = 0.35f; // 20 degrees
_lookAtUpdated = false; _forceBlinkToRetarget = angleBetween(oldAvatarLookAtVector, newAvatarLookAtVector) > MIN_BLINK_ANGLE;
} if (_forceBlinkToRetarget) {
if (_lookAtUpdated) { _isEyeLookAtUpdated = false;
} else {
_lookAtPosition = lookAtPosition;
}
}
_requestLookAtPosition = lookAtPosition;
} else {
if (_lookAtPosition != lookAtPosition) {
_lookAtPositionChanged = usecTimestampNow();
}
_lookAtPosition = lookAtPosition; _lookAtPosition = lookAtPosition;
} }
_requestLookAtPosition = lookAtPosition;
} }
void HeadData::updateEyeLookAt() { void HeadData::updateEyeLookAt() {
_lookAtPosition = _requestLookAtPosition; _lookAtPosition = _requestLookAtPosition;
_lookAtUpdated = true; _isEyeLookAtUpdated = true;
} }

View file

@ -113,8 +113,8 @@ protected:
QVector<float> _summedBlendshapeCoefficients; QVector<float> _summedBlendshapeCoefficients;
QMap<QString, int> _blendshapeLookupMap; QMap<QString, int> _blendshapeLookupMap;
AvatarData* _owningAvatar; AvatarData* _owningAvatar;
bool _blinkToRetarget { false }; bool _forceBlinkToRetarget { false };
bool _lookAtUpdated { false }; bool _isEyeLookAtUpdated { false };
private: private:
// privatize copy ctor and assignment operator so copies of this object cannot be made // privatize copy ctor and assignment operator so copies of this object cannot be made