Fix neck direction match

master
Jeremy Hu 2019-06-10 23:11:40 +09:30
parent be4f9fd014
commit e145793af0
2 changed files with 37 additions and 10 deletions

View File

@ -171,7 +171,8 @@ void PoseDocument::clearHistories()
void PoseDocument::updateBonesFromParameters(std::vector<RiggerBone> *bones, void PoseDocument::updateBonesFromParameters(std::vector<RiggerBone> *bones,
const std::map<QString, std::map<QString, QString>> &parameters, const std::map<QString, std::map<QString, QString>> &parameters,
float firstSpineBoneLength, float firstSpineBoneLength,
QVector3D firstSpineBonePosition) const QVector3D &firstSpineBonePosition,
const QVector3D &neckJoint1BoneDirection)
{ {
float firstSpineBoneLengthFromParameters = 0.0; float firstSpineBoneLengthFromParameters = 0.0;
QVector3D firstSpineBonePositionFromParameters; QVector3D firstSpineBonePositionFromParameters;
@ -184,6 +185,9 @@ void PoseDocument::updateBonesFromParameters(std::vector<RiggerBone> *bones,
boneScaleFactor = firstSpineBoneLengthFromParameters / firstSpineBoneLength; boneScaleFactor = firstSpineBoneLengthFromParameters / firstSpineBoneLength;
firstSpineBonePositionOffset = firstSpineBonePositionFromParameters - firstSpineBonePosition; firstSpineBonePositionOffset = firstSpineBonePositionFromParameters - firstSpineBonePosition;
} }
QVector3D neckJoint1DirectionInParameters;
neckJoint1DirectionFromParameters(parameters, &neckJoint1DirectionInParameters);
QQuaternion neckJoint1Rotation = QQuaternion::rotationTo(neckJoint1DirectionInParameters, neckJoint1BoneDirection);
for (auto &bone: *bones) { for (auto &bone: *bones) {
const auto findParameterResult = parameters.find(bone.name); const auto findParameterResult = parameters.find(bone.name);
if (findParameterResult == parameters.end()) { if (findParameterResult == parameters.end()) {
@ -221,12 +225,12 @@ void PoseDocument::updateBonesFromParameters(std::vector<RiggerBone> *bones,
valueOfKeyInMapOrEmpty(map, "toZ").toFloat() valueOfKeyInMapOrEmpty(map, "toZ").toFloat()
}; };
bone.tailPosition = toPosition; bone.tailPosition = toPosition;
//for (const auto &child: bone.children) {
// auto &childBone = (*bones)[child];
// childBone.headPosition = toPosition;
//}
} }
} }
if (bone.name.startsWith("Neck_")) {
bone.tailPosition = bone.headPosition +
neckJoint1Rotation.rotatedVector(bone.tailPosition - bone.headPosition);
}
} }
} }
@ -243,11 +247,13 @@ void PoseDocument::fromParameters(const std::vector<RiggerBone> *rigBones,
float firstSpineBoneLength = 0.0; float firstSpineBoneLength = 0.0;
QVector3D firstSpineBonePosition; QVector3D firstSpineBonePosition;
for (const auto &bone: m_riggerBones) { QVector3D neckJoint1BoneDirection = QVector3D(0.0, 1.0, 0.0);
for (const auto &bone: *rigBones) {
if ("Spine1" == bone.name) { if ("Spine1" == bone.name) {
firstSpineBonePosition = bone.headPosition; firstSpineBonePosition = bone.headPosition;
firstSpineBoneLength = bone.headPosition.distanceToPoint(bone.tailPosition); firstSpineBoneLength = bone.headPosition.distanceToPoint(bone.tailPosition);
break; } else if ("Neck_Joint1" == bone.name) {
neckJoint1BoneDirection = (bone.tailPosition - bone.headPosition).normalized();
} }
} }
@ -255,7 +261,8 @@ void PoseDocument::fromParameters(const std::vector<RiggerBone> *rigBones,
updateBonesFromParameters(&bones, updateBonesFromParameters(&bones,
parameters, parameters,
firstSpineBoneLength, firstSpineBoneLength,
firstSpineBonePosition); firstSpineBonePosition,
neckJoint1BoneDirection);
reset(); reset();
@ -264,7 +271,8 @@ void PoseDocument::fromParameters(const std::vector<RiggerBone> *rigBones,
updateBonesFromParameters(&otherBones, updateBonesFromParameters(&otherBones,
otherParameters, otherParameters,
firstSpineBoneLength, firstSpineBoneLength,
firstSpineBonePosition); firstSpineBonePosition,
neckJoint1BoneDirection);
std::map<QString, std::pair<QUuid, QUuid>> boneNameToIdsMap; std::map<QString, std::pair<QUuid, QUuid>> boneNameToIdsMap;
QUuid bonesPartId; QUuid bonesPartId;
@ -613,3 +621,19 @@ void PoseDocument::firstSpinePositionAndLengthFromParameters(const std::map<QStr
*length = head.distanceToPoint(tail); *length = head.distanceToPoint(tail);
*position = head; *position = head;
} }
void PoseDocument::neckJoint1DirectionFromParameters(const std::map<QString, std::map<QString, QString>> &parameters,
QVector3D *direction)
{
*direction = QVector3D(0.0, 1.0, 0.0);
const auto &findNeckJoint1 = parameters.find("Neck_Joint1");
if (findNeckJoint1 == parameters.end())
return;
QVector3D head = QVector3D(valueOfKeyInMapOrEmpty(findNeckJoint1->second, "fromX").toFloat(),
valueOfKeyInMapOrEmpty(findNeckJoint1->second, "fromY").toFloat(),
valueOfKeyInMapOrEmpty(findNeckJoint1->second, "fromZ").toFloat());
QVector3D tail = QVector3D(valueOfKeyInMapOrEmpty(findNeckJoint1->second, "toX").toFloat(),
valueOfKeyInMapOrEmpty(findNeckJoint1->second, "toY").toFloat(),
valueOfKeyInMapOrEmpty(findNeckJoint1->second, "toZ").toFloat());
*direction = (tail - head).normalized();
}

View File

@ -68,7 +68,8 @@ private:
void updateBonesFromParameters(std::vector<RiggerBone> *bones, void updateBonesFromParameters(std::vector<RiggerBone> *bones,
const std::map<QString, std::map<QString, QString>> &parameters, const std::map<QString, std::map<QString, QString>> &parameters,
float firstSpineBoneLength, float firstSpineBoneLength,
QVector3D firstSpineBonePosition); const QVector3D &firstSpineBonePosition,
const QVector3D &neckJoint1BoneDirection);
std::map<QString, std::pair<QUuid, QUuid>> m_boneNameToIdsMap; std::map<QString, std::pair<QUuid, QUuid>> m_boneNameToIdsMap;
QUuid m_bonesPartId; QUuid m_bonesPartId;
@ -86,6 +87,8 @@ private:
static float toOutcomeZ(float z); static float toOutcomeZ(float z);
static void firstSpinePositionAndLengthFromParameters(const std::map<QString, std::map<QString, QString>> &parameters, static void firstSpinePositionAndLengthFromParameters(const std::map<QString, std::map<QString, QString>> &parameters,
float *length, QVector3D *position); float *length, QVector3D *position);
static void neckJoint1DirectionFromParameters(const std::map<QString, std::map<QString, QString>> &parameters,
QVector3D *direction);
}; };
#endif #endif