mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-16 11:20:12 +02:00
Another shot at the fingers. Not attempting IK on the anymore.
This commit is contained in:
parent
aec7dbca08
commit
c3049d4378
4 changed files with 30 additions and 28 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -137,8 +137,8 @@ public:
|
|||
int leftHandJointIndex;
|
||||
int rightHandJointIndex;
|
||||
|
||||
QVector<int> leftFingertipJointIndices;
|
||||
QVector<int> rightFingertipJointIndices;
|
||||
QVector<int> leftFingerJointIndices;
|
||||
QVector<int> rightFingerJointIndices;
|
||||
|
||||
glm::vec3 neckPivot;
|
||||
|
||||
|
|
Loading…
Reference in a new issue