mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 22:39:18 +02:00
simplified SkeletonModel::maybeUpdateLeanRotation()
This commit is contained in:
parent
c76afe7d4a
commit
a01d3781d9
4 changed files with 16 additions and 9 deletions
|
@ -243,7 +243,7 @@ void SkeletonModel::updateJointState(int index) {
|
||||||
const JointState& parentState = _jointStates.at(joint.parentIndex);
|
const JointState& parentState = _jointStates.at(joint.parentIndex);
|
||||||
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
if (index == geometry.leanJointIndex) {
|
if (index == geometry.leanJointIndex) {
|
||||||
maybeUpdateLeanRotation(parentState, joint, state);
|
maybeUpdateLeanRotation(parentState, state);
|
||||||
|
|
||||||
} else if (index == geometry.neckJointIndex) {
|
} else if (index == geometry.neckJointIndex) {
|
||||||
maybeUpdateNeckRotation(parentState, joint, state);
|
maybeUpdateNeckRotation(parentState, joint, state);
|
||||||
|
@ -260,17 +260,18 @@ void SkeletonModel::updateJointState(int index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonModel::maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
void SkeletonModel::maybeUpdateLeanRotation(const JointState& parentState, JointState& state) {
|
||||||
if (!_owningAvatar->isMyAvatar() || Application::getInstance()->getPrioVR()->isActive()) {
|
if (!_owningAvatar->isMyAvatar() || Application::getInstance()->getPrioVR()->isActive()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// get the rotation axes in joint space and use them to adjust the rotation
|
// get the rotation axes in joint space and use them to adjust the rotation
|
||||||
glm::mat3 axes = glm::mat3_cast(glm::quat());
|
glm::vec3 xAxis(1.0f, 0.0f, 0.0f);
|
||||||
glm::mat3 inverse = glm::mat3(glm::inverse(parentState.getTransform() * glm::translate(state.getDefaultTranslationInConstrainedFrame()) *
|
glm::vec3 zAxis(0.0f, 0.0f, 1.0f);
|
||||||
joint.preTransform * glm::mat4_cast(joint.preRotation * joint.rotation)));
|
glm::quat inverse = glm::inverse(parentState.getRotation() * state.getDefaultRotationInParentFrame());
|
||||||
state.setRotationInConstrainedFrame(glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanSideways(),
|
state.setRotationInConstrainedFrame(
|
||||||
glm::normalize(inverse * axes[2])) * glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanForward(),
|
glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanSideways(), inverse * zAxis)
|
||||||
glm::normalize(inverse * axes[0])) * joint.rotation);
|
* glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanForward(), inverse * xAxis)
|
||||||
|
* state.getFBXJoint().rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonModel::maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
void SkeletonModel::maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
||||||
|
|
|
@ -127,7 +127,7 @@ protected:
|
||||||
/// Updates the state of the joint at the specified index.
|
/// Updates the state of the joint at the specified index.
|
||||||
virtual void updateJointState(int index);
|
virtual void updateJointState(int index);
|
||||||
|
|
||||||
void maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateLeanRotation(const JointState& parentState, JointState& state);
|
||||||
void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
|
|
||||||
|
|
|
@ -254,6 +254,11 @@ const bool JointState::rotationIsDefault(const glm::quat& rotation, float tolera
|
||||||
glm::abs(rotation.w - defaultRotation.w) < tolerance;
|
glm::abs(rotation.w - defaultRotation.w) < tolerance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::quat JointState::getDefaultRotationInParentFrame() const {
|
||||||
|
// NOTE: the result is constant and could be cached in the FBXJoint
|
||||||
|
return _fbxJoint->preRotation * _fbxJoint->rotation * _fbxJoint->postRotation;
|
||||||
|
}
|
||||||
|
|
||||||
const glm::vec3& JointState::getDefaultTranslationInConstrainedFrame() const {
|
const glm::vec3& JointState::getDefaultTranslationInConstrainedFrame() const {
|
||||||
assert(_fbxJoint != NULL);
|
assert(_fbxJoint != NULL);
|
||||||
return _fbxJoint->translation;
|
return _fbxJoint->translation;
|
||||||
|
|
|
@ -88,6 +88,7 @@ public:
|
||||||
|
|
||||||
const bool rotationIsDefault(const glm::quat& rotation, float tolerance = EPSILON) const;
|
const bool rotationIsDefault(const glm::quat& rotation, float tolerance = EPSILON) const;
|
||||||
|
|
||||||
|
glm::quat getDefaultRotationInParentFrame() const;
|
||||||
const glm::vec3& getDefaultTranslationInConstrainedFrame() const;
|
const glm::vec3& getDefaultTranslationInConstrainedFrame() const;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue