From 223b1a858b8a75b1454f688ab0f5a392db2b0216 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 18 May 2017 12:27:31 +1200 Subject: [PATCH] Fix avatar eye look-at in recording playback --- libraries/avatars/src/AvatarData.cpp | 22 +++++++++++----------- libraries/avatars/src/HeadData.cpp | 9 +++++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index eebb9c2633..c5942ae614 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2039,17 +2039,6 @@ void AvatarData::fromJson(const QJsonObject& json, bool useFrameSkeleton) { version = JSON_AVATAR_JOINT_ROTATIONS_IN_RELATIVE_FRAME_VERSION; } - // The head setOrientation likes to overwrite the avatar orientation, - // so lets do the head first - // Most head data is relative to the avatar, and needs no basis correction, - // but the lookat vector does need correction - if (json.contains(JSON_AVATAR_HEAD)) { - if (!_headData) { - _headData = new HeadData(this); - } - _headData->fromJson(json[JSON_AVATAR_HEAD].toObject()); - } - if (json.contains(JSON_AVATAR_BODY_MODEL)) { auto bodyModelURL = json[JSON_AVATAR_BODY_MODEL].toString(); if (useFrameSkeleton && bodyModelURL != getSkeletonModelURL().toString()) { @@ -2088,6 +2077,17 @@ void AvatarData::fromJson(const QJsonObject& json, bool useFrameSkeleton) { setOrientation(currentBasis->getRotation()); } + // Do after avatar orientation because head look-at needs avatar orientation. + // But the head setOrientation() overwrites avatar orientation so reset the correct orientation after. + if (json.contains(JSON_AVATAR_HEAD)) { + auto avatarOrientation = getOrientation(); + if (!_headData) { + _headData = new HeadData(this); + } + _headData->fromJson(json[JSON_AVATAR_HEAD].toObject()); + setOrientation(avatarOrientation); + } + if (json.contains(JSON_AVATAR_SCALE)) { setTargetScale((float)json[JSON_AVATAR_SCALE].toDouble()); } diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 2704b6539c..0f2ae8a9a7 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -173,14 +173,15 @@ void HeadData::fromJson(const QJsonObject& json) { } } - if (json.contains(JSON_AVATAR_HEAD_ROTATION)) { - setOrientation(quatFromJsonValue(json[JSON_AVATAR_HEAD_ROTATION])); - } - if (json.contains(JSON_AVATAR_HEAD_LOOKAT)) { auto relativeLookAt = vec3FromJsonValue(json[JSON_AVATAR_HEAD_LOOKAT]); if (glm::length2(relativeLookAt) > 0.01f) { setLookAtPosition((_owningAvatar->getOrientation() * relativeLookAt) + _owningAvatar->getPosition()); } } + + // Do after look-at because look-at requires original avatar orientation and setOrientation() may change the value. + if (json.contains(JSON_AVATAR_HEAD_ROTATION)) { + setOrientation(quatFromJsonValue(json[JSON_AVATAR_HEAD_ROTATION])); + } }