mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-06-28 00:18:46 +02:00
Restore correct space for eye joint rotations.
Also, do not correct for camera position on my avatar. (That will be done by zero or one receivers.)
This commit is contained in:
parent
64fcd2da96
commit
964d04d24f
3 changed files with 18 additions and 11 deletions
|
@ -107,12 +107,14 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) {
|
||||||
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
|
|
||||||
Rig::HeadParameters params;
|
Rig::HeadParameters params;
|
||||||
|
params.modelRotation = getRotation();
|
||||||
|
params.modelTranslation = getTranslation();
|
||||||
params.leanSideways = _owningAvatar->getHead()->getFinalLeanSideways();
|
params.leanSideways = _owningAvatar->getHead()->getFinalLeanSideways();
|
||||||
params.leanForward = _owningAvatar->getHead()->getFinalLeanSideways();
|
params.leanForward = _owningAvatar->getHead()->getFinalLeanSideways();
|
||||||
params.torsoTwist = _owningAvatar->getHead()->getTorsoTwist();
|
params.torsoTwist = _owningAvatar->getHead()->getTorsoTwist();
|
||||||
params.localHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInLocalFrame();
|
params.localHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInLocalFrame();
|
||||||
params.worldHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInWorldFrame();
|
params.worldHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInWorldFrame();
|
||||||
params.eyeLookAt = _owningAvatar->getHead()->getCorrectedLookAtPosition();
|
params.eyeLookAt = _owningAvatar->getHead()->getLookAtPosition();
|
||||||
params.eyeSaccade = _owningAvatar->getHead()->getSaccade();
|
params.eyeSaccade = _owningAvatar->getHead()->getSaccade();
|
||||||
params.leanJointIndex = geometry.leanJointIndex;
|
params.leanJointIndex = geometry.leanJointIndex;
|
||||||
params.neckJointIndex = geometry.neckJointIndex;
|
params.neckJointIndex = geometry.neckJointIndex;
|
||||||
|
|
|
@ -27,6 +27,10 @@ void Rig::HeadParameters::dump() const {
|
||||||
axis = glm::axis(worldHeadOrientation);
|
axis = glm::axis(worldHeadOrientation);
|
||||||
theta = glm::angle(worldHeadOrientation);
|
theta = glm::angle(worldHeadOrientation);
|
||||||
qCDebug(animation, " worldHeadOrientation axis = (%.5f, %.5f, %.5f), theta = %0.5f", axis.x, axis.y, axis.z, theta);
|
qCDebug(animation, " worldHeadOrientation axis = (%.5f, %.5f, %.5f), theta = %0.5f", axis.x, axis.y, axis.z, theta);
|
||||||
|
axis = glm::axis(modelRotation);
|
||||||
|
theta = glm::angle(modelRotation);
|
||||||
|
qCDebug(animation, " modelRotation axis = (%.5f, %.5f, %.5f), theta = %0.5f", axis.x, axis.y, axis.z, theta);
|
||||||
|
qCDebug(animation, " modelTranslation = (%.5f, %.5f, %.5f)", modelTranslation.x, modelTranslation.y, modelTranslation.z);
|
||||||
qCDebug(animation, " eyeLookAt = (%.5f, %.5f, %.5f)", eyeLookAt.x, eyeLookAt.y, eyeLookAt.z);
|
qCDebug(animation, " eyeLookAt = (%.5f, %.5f, %.5f)", eyeLookAt.x, eyeLookAt.y, eyeLookAt.z);
|
||||||
qCDebug(animation, " eyeSaccade = (%.5f, %.5f, %.5f)", eyeSaccade.x, eyeSaccade.y, eyeSaccade.z);
|
qCDebug(animation, " eyeSaccade = (%.5f, %.5f, %.5f)", eyeSaccade.x, eyeSaccade.y, eyeSaccade.z);
|
||||||
qCDebug(animation, " leanJointIndex = %.d", leanJointIndex);
|
qCDebug(animation, " leanJointIndex = %.d", leanJointIndex);
|
||||||
|
@ -782,8 +786,8 @@ glm::quat Rig::getJointDefaultRotationInParentFrame(int jointIndex) {
|
||||||
void Rig::updateFromHeadParameters(const HeadParameters& params) {
|
void Rig::updateFromHeadParameters(const HeadParameters& params) {
|
||||||
updateLeanJoint(params.leanJointIndex, params.leanSideways, params.leanForward, params.torsoTwist);
|
updateLeanJoint(params.leanJointIndex, params.leanSideways, params.leanForward, params.torsoTwist);
|
||||||
updateNeckJoint(params.neckJointIndex, params.localHeadOrientation, params.leanSideways, params.leanForward, params.torsoTwist);
|
updateNeckJoint(params.neckJointIndex, params.localHeadOrientation, params.leanSideways, params.leanForward, params.torsoTwist);
|
||||||
updateEyeJoint(params.leftEyeJointIndex, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade);
|
updateEyeJoint(params.leftEyeJointIndex, params.modelTranslation, params.modelRotation, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade);
|
||||||
updateEyeJoint(params.rightEyeJointIndex, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade);
|
updateEyeJoint(params.rightEyeJointIndex, params.modelTranslation, params.modelRotation, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rig::updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist) {
|
void Rig::updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist) {
|
||||||
|
@ -824,22 +828,21 @@ void Rig::updateNeckJoint(int index, const glm::quat& localHeadOrientation, floa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rig::updateEyeJoint(int index, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade) {
|
void Rig::updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm::quat& modelRotation, const glm::quat& worldHeadOrientation, const glm::vec3& lookAtSpot, const glm::vec3& saccade) {
|
||||||
if (index >= 0 && _jointStates[index].getParentIndex() >= 0) {
|
if (index >= 0 && _jointStates[index].getParentIndex() >= 0) {
|
||||||
auto& state = _jointStates[index];
|
auto& state = _jointStates[index];
|
||||||
auto& parentState = _jointStates[state.getParentIndex()];
|
auto& parentState = _jointStates[state.getParentIndex()];
|
||||||
|
|
||||||
// NOTE: at the moment we do the math in the world-frame, hence the inverse transform is more complex than usual.
|
// NOTE: at the moment we do the math in the world-frame, hence the inverse transform is more complex than usual.
|
||||||
glm::mat4 inverse = glm::inverse(parentState.getTransform() *
|
glm::mat4 inverse = glm::inverse(glm::mat4_cast(modelRotation) * parentState.getTransform() *
|
||||||
glm::translate(getJointDefaultTranslationInConstrainedFrame(index)) *
|
glm::translate(state.getDefaultTranslationInConstrainedFrame()) *
|
||||||
state.getPreTransform() * glm::mat4_cast(state.getPreRotation() * state.getDefaultRotation()));
|
state.getPreTransform() * glm::mat4_cast(state.getPreRotation() * state.getDefaultRotation()));
|
||||||
glm::vec3 front = glm::vec3(inverse * glm::vec4(worldHeadOrientation * IDENTITY_FRONT, 0.0f));
|
glm::vec3 front = glm::vec3(inverse * glm::vec4(worldHeadOrientation * IDENTITY_FRONT, 0.0f));
|
||||||
glm::vec3 lookAtDelta = lookAt;
|
glm::vec3 lookAtDelta = lookAtSpot - modelTranslation;
|
||||||
glm::vec3 lookAt = glm::vec3(inverse * glm::vec4(lookAtDelta + glm::length(lookAtDelta) * saccade, 1.0f));
|
glm::vec3 lookAt = glm::vec3(inverse * glm::vec4(lookAtDelta + glm::length(lookAtDelta) * saccade, 1.0f));
|
||||||
glm::quat between = rotationBetween(front, lookAt);
|
glm::quat between = rotationBetween(front, lookAt);
|
||||||
const float MAX_ANGLE = 30.0f * RADIANS_PER_DEGREE;
|
const float MAX_ANGLE = 30.0f * RADIANS_PER_DEGREE;
|
||||||
float angle = glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE);
|
state.setRotationInConstrainedFrame(glm::angleAxis(glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE), glm::axis(between)) *
|
||||||
glm::quat rot = glm::angleAxis(angle, glm::axis(between));
|
state.getDefaultRotation(), DEFAULT_PRIORITY);
|
||||||
setJointRotationInConstrainedFrame(index, rot * state.getDefaultRotation(), DEFAULT_PRIORITY);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,10 +54,12 @@ public:
|
||||||
float leanSideways = 0.0f; // degrees
|
float leanSideways = 0.0f; // degrees
|
||||||
float leanForward = 0.0f; // degrees
|
float leanForward = 0.0f; // degrees
|
||||||
float torsoTwist = 0.0f; // degrees
|
float torsoTwist = 0.0f; // degrees
|
||||||
|
glm::quat modelRotation = glm::quat();
|
||||||
glm::quat localHeadOrientation = glm::quat();
|
glm::quat localHeadOrientation = glm::quat();
|
||||||
glm::quat worldHeadOrientation = glm::quat();
|
glm::quat worldHeadOrientation = glm::quat();
|
||||||
glm::vec3 eyeLookAt = glm::vec3(); // world space
|
glm::vec3 eyeLookAt = glm::vec3(); // world space
|
||||||
glm::vec3 eyeSaccade = glm::vec3(); // world space
|
glm::vec3 eyeSaccade = glm::vec3(); // world space
|
||||||
|
glm::vec3 modelTranslation = glm::vec3();
|
||||||
int leanJointIndex = -1;
|
int leanJointIndex = -1;
|
||||||
int neckJointIndex = -1;
|
int neckJointIndex = -1;
|
||||||
int leftEyeJointIndex = -1;
|
int leftEyeJointIndex = -1;
|
||||||
|
@ -163,7 +165,7 @@ public:
|
||||||
|
|
||||||
void updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist);
|
void updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist);
|
||||||
void updateNeckJoint(int index, const glm::quat& localHeadOrientation, float leanSideways, float leanForward, float torsoTwist);
|
void updateNeckJoint(int index, const glm::quat& localHeadOrientation, float leanSideways, float leanForward, float torsoTwist);
|
||||||
void updateEyeJoint(int index, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade);
|
void updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm::quat& modelRotation, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade);
|
||||||
|
|
||||||
QVector<JointState> _jointStates;
|
QVector<JointState> _jointStates;
|
||||||
int _rootJointIndex = -1;
|
int _rootJointIndex = -1;
|
||||||
|
|
Loading…
Reference in a new issue