mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-06-21 19:09:15 +02:00
Add head translation to Faceplus. Closes #2684.
This commit is contained in:
parent
66d61bedf4
commit
a12b90c65b
3 changed files with 47 additions and 12 deletions
|
@ -3020,6 +3020,7 @@ void Application::resetSensors() {
|
||||||
_mouseX = _glWidget->width() / 2;
|
_mouseX = _glWidget->width() / 2;
|
||||||
_mouseY = _glWidget->height() / 2;
|
_mouseY = _glWidget->height() / 2;
|
||||||
|
|
||||||
|
_faceplus.reset();
|
||||||
_faceshift.reset();
|
_faceshift.reset();
|
||||||
_visage.reset();
|
_visage.reset();
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,15 @@ void Faceplus::init() {
|
||||||
updateEnabled();
|
updateEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Faceplus::setState(const glm::quat& headRotation, float estimatedEyePitch, float estimatedEyeYaw,
|
void Faceplus::reset() {
|
||||||
const QVector<float>& blendshapeCoefficients) {
|
if (_enabled) {
|
||||||
|
QMetaObject::invokeMethod(_reader, "reset");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Faceplus::setState(const glm::vec3& headTranslation, const glm::quat& headRotation,
|
||||||
|
float estimatedEyePitch, float estimatedEyeYaw, const QVector<float>& blendshapeCoefficients) {
|
||||||
|
_headTranslation = headTranslation;
|
||||||
_headRotation = headRotation;
|
_headRotation = headRotation;
|
||||||
_estimatedEyePitch = estimatedEyePitch;
|
_estimatedEyePitch = estimatedEyePitch;
|
||||||
_estimatedEyeYaw = estimatedEyeYaw;
|
_estimatedEyeYaw = estimatedEyeYaw;
|
||||||
|
@ -149,7 +156,7 @@ FaceplusReader::~FaceplusReader() {
|
||||||
|
|
||||||
void FaceplusReader::init() {
|
void FaceplusReader::init() {
|
||||||
#ifdef HAVE_FACEPLUS
|
#ifdef HAVE_FACEPLUS
|
||||||
if (!faceplus_init("VGA")) {
|
if (!faceplus_init("hHD")) {
|
||||||
qDebug() << "Failed to initialized Faceplus.";
|
qDebug() << "Failed to initialized Faceplus.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -190,6 +197,7 @@ void FaceplusReader::init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_blendshapeCoefficients.resize(maxIndex + 1);
|
_blendshapeCoefficients.resize(maxIndex + 1);
|
||||||
|
_referenceInitialized = false;
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
||||||
#endif
|
#endif
|
||||||
|
@ -202,10 +210,24 @@ void FaceplusReader::shutdown() {
|
||||||
|
|
||||||
void FaceplusReader::update() {
|
void FaceplusReader::update() {
|
||||||
#ifdef HAVE_FACEPLUS
|
#ifdef HAVE_FACEPLUS
|
||||||
if (!(faceplus_synchronous_track() && faceplus_current_output_vector(_outputVector.data()))) {
|
float x, y, rotation, scale;
|
||||||
|
if (!(faceplus_synchronous_track() && faceplus_current_face_location(&x, &y, &rotation, &scale) && !glm::isnan(x) &&
|
||||||
|
faceplus_current_output_vector(_outputVector.data()))) {
|
||||||
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!_referenceInitialized) {
|
||||||
|
_referenceX = x;
|
||||||
|
_referenceY = y;
|
||||||
|
_referenceScale = scale;
|
||||||
|
_referenceInitialized = true;
|
||||||
|
}
|
||||||
|
const float TRANSLATION_SCALE = 10.0f;
|
||||||
|
const float REFERENCE_DISTANCE = 10.0f;
|
||||||
|
float depthScale = _referenceScale / scale;
|
||||||
|
float z = REFERENCE_DISTANCE * (depthScale - 1.0f);
|
||||||
|
glm::vec3 headTranslation((x - _referenceX) * depthScale * TRANSLATION_SCALE,
|
||||||
|
(y - _referenceY) * depthScale * TRANSLATION_SCALE, z);
|
||||||
glm::quat headRotation(glm::radians(glm::vec3(-_outputVector.at(_headRotationIndices[0]),
|
glm::quat headRotation(glm::radians(glm::vec3(-_outputVector.at(_headRotationIndices[0]),
|
||||||
_outputVector.at(_headRotationIndices[1]), -_outputVector.at(_headRotationIndices[2]))));
|
_outputVector.at(_headRotationIndices[1]), -_outputVector.at(_headRotationIndices[2]))));
|
||||||
float estimatedEyePitch = (_outputVector.at(_leftEyeRotationIndices[0]) +
|
float estimatedEyePitch = (_outputVector.at(_leftEyeRotationIndices[0]) +
|
||||||
|
@ -221,10 +243,16 @@ void FaceplusReader::update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QMetaObject::invokeMethod(Application::getInstance()->getFaceplus(), "setState", Q_ARG(const glm::quat&, headRotation),
|
QMetaObject::invokeMethod(Application::getInstance()->getFaceplus(), "setState", Q_ARG(const glm::vec3&, headTranslation),
|
||||||
Q_ARG(float, estimatedEyePitch), Q_ARG(float, estimatedEyeYaw), Q_ARG(const QVector<float>&, _blendshapeCoefficients));
|
Q_ARG(const glm::quat&, headRotation), Q_ARG(float, estimatedEyePitch), Q_ARG(float, estimatedEyeYaw),
|
||||||
|
Q_ARG(const QVector<float>&, _blendshapeCoefficients));
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FaceplusReader::reset() {
|
||||||
|
#ifdef HAVE_FACEPLUS
|
||||||
|
_referenceInitialized = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -30,11 +30,12 @@ public:
|
||||||
virtual ~Faceplus();
|
virtual ~Faceplus();
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
void reset();
|
||||||
|
|
||||||
bool isActive() const { return _active; }
|
bool isActive() const { return _active; }
|
||||||
|
|
||||||
Q_INVOKABLE void setState(const glm::quat& headRotation, float estimatedEyePitch, float estimatedEyeYaw,
|
Q_INVOKABLE void setState(const glm::vec3& headTranslation, const glm::quat& headRotation,
|
||||||
const QVector<float>& blendshapeCoefficients);
|
float estimatedEyePitch, float estimatedEyeYaw, const QVector<float>& blendshapeCoefficients);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
|
@ -63,6 +64,7 @@ public:
|
||||||
Q_INVOKABLE void init();
|
Q_INVOKABLE void init();
|
||||||
Q_INVOKABLE void shutdown();
|
Q_INVOKABLE void shutdown();
|
||||||
Q_INVOKABLE void update();
|
Q_INVOKABLE void update();
|
||||||
|
Q_INVOKABLE void reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -72,6 +74,10 @@ private:
|
||||||
int _headRotationIndices[3];
|
int _headRotationIndices[3];
|
||||||
int _leftEyeRotationIndices[2];
|
int _leftEyeRotationIndices[2];
|
||||||
int _rightEyeRotationIndices[2];
|
int _rightEyeRotationIndices[2];
|
||||||
|
float _referenceX;
|
||||||
|
float _referenceY;
|
||||||
|
float _referenceScale;
|
||||||
|
bool _referenceInitialized;
|
||||||
QVector<float> _blendshapeCoefficients;
|
QVector<float> _blendshapeCoefficients;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue