Add head translation to Faceplus. Closes #2684.

This commit is contained in:
Andrzej Kapolka 2014-04-17 13:34:37 -07:00
parent 66d61bedf4
commit a12b90c65b
3 changed files with 47 additions and 12 deletions

View file

@ -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();

View file

@ -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
}

View file

@ -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
}; };