Another shot at the fingers. Not attempting IK on the anymore.

This commit is contained in:
Andrzej Kapolka 2013-11-07 14:25:01 -08:00
parent aec7dbca08
commit c3049d4378
4 changed files with 30 additions and 28 deletions

View file

@ -62,12 +62,12 @@ void SkeletonModel::simulate(float deltaTime) {
} else if (leftPalmIndex == rightPalmIndex) {
// right hand only
applyPalmData(geometry.rightHandJointIndex, geometry.rightFingertipJointIndices, hand.getPalms()[leftPalmIndex]);
applyPalmData(geometry.rightHandJointIndex, geometry.rightFingerJointIndices, hand.getPalms()[leftPalmIndex]);
restoreLeftHandPosition(HAND_RESTORATION_RATE);
} else {
applyPalmData(geometry.leftHandJointIndex, geometry.leftFingertipJointIndices, hand.getPalms()[leftPalmIndex]);
applyPalmData(geometry.rightHandJointIndex, geometry.rightFingertipJointIndices, hand.getPalms()[rightPalmIndex]);
applyPalmData(geometry.leftHandJointIndex, geometry.leftFingerJointIndices, hand.getPalms()[leftPalmIndex]);
applyPalmData(geometry.rightHandJointIndex, geometry.rightFingerJointIndices, hand.getPalms()[rightPalmIndex]);
}
}
@ -131,30 +131,30 @@ bool operator<(const IndexValue& firstIndex, const IndexValue& secondIndex) {
return firstIndex.value < secondIndex.value;
}
void SkeletonModel::applyPalmData(int jointIndex, const QVector<int>& fingertipJointIndices, PalmData& palm) {
void SkeletonModel::applyPalmData(int jointIndex, const QVector<int>& fingerJointIndices, PalmData& palm) {
const FBXGeometry& geometry = _geometry->getFBXGeometry();
setJointPosition(jointIndex, palm.getPosition());
float sign = jointIndex == geometry.rightHandJointIndex ? 1.0f : -1.0f;
setJointRotation(jointIndex, rotationBetween(_rotation * IDENTITY_UP, -palm.getNormal()) * _rotation *
glm::angleAxis(90.0f, 0.0f, sign, 0.0f), true);
float sign = (jointIndex == geometry.rightHandJointIndex) ? 1.0f : -1.0f;
glm::quat palmRotation = rotationBetween(_rotation * IDENTITY_UP, -palm.getNormal()) * _rotation *
glm::angleAxis(90.0f, 0.0f, sign, 0.0f);
setJointRotation(jointIndex, palmRotation, true);
// no point in continuing if there are no fingers
if (palm.getNumFingers() == 0) {
if (palm.getNumFingers() == 0 || fingerJointIndices.isEmpty()) {
return;
}
// sort the finger indices by raw x
QVector<IndexValue> fingerIndices;
for (int i = 0; i < qMin(5, (int)palm.getNumFingers()); i++) {
IndexValue indexValue = { i, palm.getFingers()[i].getRootRawPosition().x };
for (int i = 0; i < palm.getNumFingers(); i++) {
IndexValue indexValue = { i, palm.getFingers()[i].getTipRawPosition().x };
fingerIndices.append(indexValue);
}
qSort(fingerIndices.begin(), fingerIndices.end());
// likewise with the joint indices and relative z
QVector<IndexValue> jointIndices;
for (int i = 0; i < qMin(5, (int)fingertipJointIndices.size()); i++) {
int index = fingertipJointIndices.at(i);
foreach (int index, fingerJointIndices) {
glm::vec3 position = glm::inverse(_rotation) * extractTranslation(geometry.joints.at(index).bindTransform);
IndexValue indexValue = { index, position.z * -sign };
jointIndices.append(indexValue);
@ -165,7 +165,9 @@ void SkeletonModel::applyPalmData(int jointIndex, const QVector<int>& fingertipJ
float proportion = fingerIndices.size() / (float)jointIndices.size();
for (int i = 0; i < jointIndices.size(); i++) {
int fingerIndex = fingerIndices.at(roundf(i * proportion)).index;
setJointPosition(jointIndices.at(i).index, palm.getFingers()[fingerIndex].getTipPosition(), jointIndex);
glm::vec3 fingerVector = palm.getFingers()[fingerIndex].getTipPosition() -
palm.getFingers()[fingerIndex].getRootPosition();
setJointRotation(jointIndices.at(i).index, rotationBetween(palmRotation * glm::vec3(-sign, 0.0f, 0.0f), fingerVector) * palmRotation, true);
}
}

View file

@ -28,7 +28,7 @@ public:
protected:
void applyPalmData(int jointIndex, const QVector<int>& fingertipJointIndices, PalmData& palm);
void applyPalmData(int jointIndex, const QVector<int>& fingerJointIndices, PalmData& palm);
/// Updates the state of the joint at the specified index.
virtual void updateJointState(int index);

View file

@ -747,8 +747,8 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping)
QString jointHeadName = processID(joints.value("jointHead", "jointHead").toString());
QString jointLeftHandName = processID(joints.value("jointLeftHand", "jointLeftHand").toString());
QString jointRightHandName = processID(joints.value("jointRightHand", "jointRightHand").toString());
QVariantList jointLeftFingertipNames = joints.values("jointLeftFingertip");
QVariantList jointRightFingertipNames = joints.values("jointRightFingertip");
QVariantList jointLeftFingerNames = joints.values("jointLeftFinger");
QVariantList jointRightFingerNames = joints.values("jointRightFinger");
QString jointEyeLeftID;
QString jointEyeRightID;
QString jointNeckID;
@ -757,8 +757,8 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping)
QString jointHeadID;
QString jointLeftHandID;
QString jointRightHandID;
QStringList jointLeftFingertipIDs;
QStringList jointRightFingertipIDs;
QStringList jointLeftFingerIDs;
QStringList jointRightFingerIDs;
QVariantHash blendshapeMappings = mapping.value("bs").toHash();
QHash<QByteArray, QPair<int, float> > blendshapeIndices;
@ -839,11 +839,11 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping)
} else if (name == jointRightHandName) {
jointRightHandID = getID(object.properties);
} else if (jointLeftFingertipNames.contains(name)) {
jointLeftFingertipIDs.append(getID(object.properties));
} else if (jointLeftFingerNames.contains(name)) {
jointLeftFingerIDs.append(getID(object.properties));
} else if (jointRightFingertipNames.contains(name)) {
jointRightFingertipIDs.append(getID(object.properties));
} else if (jointRightFingerNames.contains(name)) {
jointRightFingerIDs.append(getID(object.properties));
}
glm::vec3 translation;
glm::vec3 rotationOffset;
@ -1099,11 +1099,11 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping)
geometry.leftHandJointIndex = modelIDs.indexOf(jointLeftHandID);
geometry.rightHandJointIndex = modelIDs.indexOf(jointRightHandID);
foreach (const QString& id, jointLeftFingertipIDs) {
geometry.leftFingertipJointIndices.append(modelIDs.indexOf(id));
foreach (const QString& id, jointLeftFingerIDs) {
geometry.leftFingerJointIndices.append(modelIDs.indexOf(id));
}
foreach (const QString& id, jointRightFingertipIDs) {
geometry.rightFingertipJointIndices.append(modelIDs.indexOf(id));
foreach (const QString& id, jointRightFingerIDs) {
geometry.rightFingerJointIndices.append(modelIDs.indexOf(id));
}
// extract the translation component of the neck transform

View file

@ -137,8 +137,8 @@ public:
int leftHandJointIndex;
int rightHandJointIndex;
QVector<int> leftFingertipJointIndices;
QVector<int> rightFingertipJointIndices;
QVector<int> leftFingerJointIndices;
QVector<int> rightFingerJointIndices;
glm::vec3 neckPivot;