mirror of
https://github.com/AleziaKurdis/overte.git
synced 2025-04-08 06:32:35 +02:00
Improve eye's look at and blinking. Fix look at update
This commit is contained in:
parent
505813b3c3
commit
9f0e82e1e6
5 changed files with 28 additions and 18 deletions
|
@ -6709,8 +6709,9 @@ void MyAvatar::updateLookAtPosition(FaceTracker* faceTracker, Camera& myCamera)
|
|||
if (headPose.isValid()) {
|
||||
lookAtSpot = transformPoint(headPose.getMatrix(), glm::vec3(0.0f, 0.0f, TREE_SCALE));
|
||||
} else {
|
||||
lookAtSpot = myHead->getEyePosition() +
|
||||
(getHead()->getFinalOrientationInWorldFrame() * glm::vec3(0.0f, 0.0f, -TREE_SCALE));
|
||||
lookAtSpot = _shouldTurnToFaceCamera ?
|
||||
myHead->getLookAtPosition() :
|
||||
myHead->getEyePosition() + getHeadJointFrontVector() * (float)TREE_SCALE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -96,15 +96,15 @@ void Head::simulate(float deltaTime) {
|
|||
// no blinking when brows are raised; blink less with increasing loudness
|
||||
const float BASE_BLINK_RATE = 15.0f / 60.0f;
|
||||
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)) *
|
||||
ROOT_LOUDNESS_TO_BLINK_INTERVAL) / BASE_BLINK_RATE, deltaTime))) {
|
||||
float randSpeedVariability = randFloat();
|
||||
float eyeBlinkVelocity = BLINK_SPEED + randSpeedVariability * BLINK_SPEED_VARIABILITY;
|
||||
if (_blinkToRetarget) {
|
||||
if (_forceBlinkToRetarget) {
|
||||
// Slow down by half the blink if reseting eye target
|
||||
eyeBlinkVelocity = 0.5f * eyeBlinkVelocity;
|
||||
_blinkToRetarget = false;
|
||||
_forceBlinkToRetarget = false;
|
||||
}
|
||||
_leftEyeBlinkVelocity = eyeBlinkVelocity;
|
||||
_rightEyeBlinkVelocity = eyeBlinkVelocity;
|
||||
|
|
|
@ -1480,6 +1480,7 @@ public:
|
|||
void setIsNewAvatar(bool isNewAvatar) { _isNewAvatar = isNewAvatar; }
|
||||
bool getIsNewAvatar() { return _isNewAvatar; }
|
||||
void setIsClientAvatar(bool isClientAvatar) { _isClientAvatar = isClientAvatar; }
|
||||
bool getIsClientAvatar() const { return _isClientAvatar; }
|
||||
void setSkeletonData(const std::vector<AvatarSkeletonTrait::UnpackedJointData>& skeletonData);
|
||||
std::vector<AvatarSkeletonTrait::UnpackedJointData> getSkeletonData() const;
|
||||
void sendSkeletonData() const;
|
||||
|
|
|
@ -235,21 +235,29 @@ void HeadData::setFaceTrackerConnected(bool value) {
|
|||
}
|
||||
|
||||
void HeadData::setLookAtPosition(const glm::vec3& lookAtPosition) {
|
||||
if (_requestLookAtPosition != lookAtPosition) {
|
||||
_lookAtPositionChanged = usecTimestampNow();
|
||||
glm::vec3 oldAvatarLookAtVector = _requestLookAtPosition - _owningAvatar->getWorldPosition();
|
||||
glm::vec3 newAvatarLookAtVector = lookAtPosition - _owningAvatar->getWorldPosition();
|
||||
const float MIN_BLINK_ANGLE = 0.35f; // 20 degrees
|
||||
_blinkToRetarget = angleBetween(oldAvatarLookAtVector, newAvatarLookAtVector) > MIN_BLINK_ANGLE;
|
||||
_lookAtUpdated = false;
|
||||
}
|
||||
if (_lookAtUpdated) {
|
||||
if (_owningAvatar->getIsClientAvatar() || _owningAvatar->isMyAvatar()) {
|
||||
if (_isEyeLookAtUpdated && _requestLookAtPosition != lookAtPosition) {
|
||||
_lookAtPositionChanged = usecTimestampNow();
|
||||
glm::vec3 oldAvatarLookAtVector = _requestLookAtPosition - _owningAvatar->getWorldPosition();
|
||||
glm::vec3 newAvatarLookAtVector = lookAtPosition - _owningAvatar->getWorldPosition();
|
||||
const float MIN_BLINK_ANGLE = 0.35f; // 20 degrees
|
||||
_forceBlinkToRetarget = angleBetween(oldAvatarLookAtVector, newAvatarLookAtVector) > MIN_BLINK_ANGLE;
|
||||
if (_forceBlinkToRetarget) {
|
||||
_isEyeLookAtUpdated = false;
|
||||
} else {
|
||||
_lookAtPosition = lookAtPosition;
|
||||
}
|
||||
}
|
||||
_requestLookAtPosition = lookAtPosition;
|
||||
} else {
|
||||
if (_lookAtPosition != lookAtPosition) {
|
||||
_lookAtPositionChanged = usecTimestampNow();
|
||||
}
|
||||
_lookAtPosition = lookAtPosition;
|
||||
}
|
||||
_requestLookAtPosition = lookAtPosition;
|
||||
}
|
||||
|
||||
void HeadData::updateEyeLookAt() {
|
||||
_lookAtPosition = _requestLookAtPosition;
|
||||
_lookAtUpdated = true;
|
||||
_isEyeLookAtUpdated = true;
|
||||
}
|
||||
|
|
|
@ -113,8 +113,8 @@ protected:
|
|||
QVector<float> _summedBlendshapeCoefficients;
|
||||
QMap<QString, int> _blendshapeLookupMap;
|
||||
AvatarData* _owningAvatar;
|
||||
bool _blinkToRetarget { false };
|
||||
bool _lookAtUpdated { false };
|
||||
bool _forceBlinkToRetarget { false };
|
||||
bool _isEyeLookAtUpdated { false };
|
||||
|
||||
private:
|
||||
// privatize copy ctor and assignment operator so copies of this object cannot be made
|
||||
|
|
Loading…
Reference in a new issue