mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 09:28:46 +02:00
Merge pull request #4813 from ctrlaltdavid/20532
CR for 20532 - Default face tracking to Use Camera for first time users
This commit is contained in:
commit
a5c49b7a13
4 changed files with 30 additions and 11 deletions
|
@ -953,6 +953,7 @@ void Application::faceTrackerMuteToggled() {
|
||||||
bool isMuted = getSelectedFaceTracker()->isMuted();
|
bool isMuted = getSelectedFaceTracker()->isMuted();
|
||||||
muteAction->setChecked(isMuted);
|
muteAction->setChecked(isMuted);
|
||||||
getSelectedFaceTracker()->setEnabled(!isMuted);
|
getSelectedFaceTracker()->setEnabled(!isMuted);
|
||||||
|
Menu::getInstance()->getActionForOption(MenuOption::CalibrateCamera)->setEnabled(!isMuted);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::aboutApp() {
|
void Application::aboutApp() {
|
||||||
|
|
|
@ -368,8 +368,12 @@ Menu::Menu() {
|
||||||
{
|
{
|
||||||
QActionGroup* faceTrackerGroup = new QActionGroup(avatarDebugMenu);
|
QActionGroup* faceTrackerGroup = new QActionGroup(avatarDebugMenu);
|
||||||
|
|
||||||
|
bool defaultNoFaceTracking = true;
|
||||||
|
#ifdef HAVE_DDE
|
||||||
|
defaultNoFaceTracking = false;
|
||||||
|
#endif
|
||||||
QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking,
|
QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking,
|
||||||
0, true,
|
0, defaultNoFaceTracking,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
qApp, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(noFaceTracker);
|
faceTrackerGroup->addAction(noFaceTracker);
|
||||||
|
|
||||||
|
@ -381,7 +385,7 @@ Menu::Menu() {
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DDE
|
#ifdef HAVE_DDE
|
||||||
QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseCamera,
|
QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseCamera,
|
||||||
0, false,
|
0, true,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
qApp, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(ddeFaceTracker);
|
faceTrackerGroup->addAction(ddeFaceTracker);
|
||||||
#endif
|
#endif
|
||||||
|
@ -391,17 +395,17 @@ Menu::Menu() {
|
||||||
QAction* binaryEyelidControl = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::BinaryEyelidControl, 0, true);
|
QAction* binaryEyelidControl = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::BinaryEyelidControl, 0, true);
|
||||||
binaryEyelidControl->setVisible(false);
|
binaryEyelidControl->setVisible(false);
|
||||||
QAction* useAudioForMouth = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseAudioForMouth, 0, true);
|
QAction* useAudioForMouth = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseAudioForMouth, 0, true);
|
||||||
useAudioForMouth->setVisible(false);
|
useAudioForMouth->setVisible(true); // DDE face tracking is on by default
|
||||||
QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true);
|
QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true);
|
||||||
ddeFiltering->setVisible(false);
|
ddeFiltering->setVisible(true); // DDE face tracking is on by default
|
||||||
QAction* ddeCalibrate = addActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::CalibrateCamera, 0,
|
QAction* ddeCalibrate = addActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::CalibrateCamera, 0,
|
||||||
DependencyManager::get<DdeFaceTracker>().data(), SLOT(calibrate()));
|
DependencyManager::get<DdeFaceTracker>().data(), SLOT(calibrate()));
|
||||||
ddeCalibrate->setVisible(false);
|
ddeCalibrate->setVisible(true); // DDE face tracking is on by default
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_FACESHIFT) || defined(HAVE_DDE)
|
#if defined(HAVE_FACESHIFT) || defined(HAVE_DDE)
|
||||||
faceTrackingMenu->addSeparator();
|
faceTrackingMenu->addSeparator();
|
||||||
addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,
|
addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,
|
||||||
Qt::CTRL | Qt::SHIFT | Qt::Key_F, false,
|
Qt::CTRL | Qt::SHIFT | Qt::Key_F, true, // DDE face tracking is on by default
|
||||||
qApp, SLOT(toggleFaceTrackerMute()));
|
qApp, SLOT(toggleFaceTrackerMute()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,8 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, qui
|
||||||
_calibrationValues(),
|
_calibrationValues(),
|
||||||
_calibrationBillboard(NULL),
|
_calibrationBillboard(NULL),
|
||||||
_calibrationBillboardID(0),
|
_calibrationBillboardID(0),
|
||||||
_calibrationMessage(QString())
|
_calibrationMessage(QString()),
|
||||||
|
_isCalibrated(false)
|
||||||
{
|
{
|
||||||
_coefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
_coefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
||||||
_blendshapeCoefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
_blendshapeCoefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
||||||
|
@ -219,6 +220,7 @@ DdeFaceTracker::~DdeFaceTracker() {
|
||||||
void DdeFaceTracker::init() {
|
void DdeFaceTracker::init() {
|
||||||
FaceTracker::init();
|
FaceTracker::init();
|
||||||
setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) && !_isMuted);
|
setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) && !_isMuted);
|
||||||
|
Menu::getInstance()->getActionForOption(MenuOption::CalibrateCamera)->setEnabled(!_isMuted);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DdeFaceTracker::setEnabled(bool enabled) {
|
void DdeFaceTracker::setEnabled(bool enabled) {
|
||||||
|
@ -345,6 +347,10 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) {
|
||||||
_lastReceiveTimestamp = usecTimestampNow();
|
_lastReceiveTimestamp = usecTimestampNow();
|
||||||
|
|
||||||
if (buffer.size() > MIN_PACKET_SIZE) {
|
if (buffer.size() > MIN_PACKET_SIZE) {
|
||||||
|
if (!_isCalibrated) {
|
||||||
|
calibrate();
|
||||||
|
}
|
||||||
|
|
||||||
bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter);
|
bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter);
|
||||||
|
|
||||||
Packet packet;
|
Packet packet;
|
||||||
|
@ -564,15 +570,19 @@ void DdeFaceTracker::setEyeClosingThreshold(float eyeClosingThreshold) {
|
||||||
_eyeClosingThreshold.set(eyeClosingThreshold);
|
_eyeClosingThreshold.set(eyeClosingThreshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int CALIBRATION_BILLBOARD_WIDTH = 240;
|
static const int CALIBRATION_BILLBOARD_WIDTH = 300;
|
||||||
static const int CALIBRATION_BILLBOARD_HEIGHT = 180;
|
static const int CALIBRATION_BILLBOARD_HEIGHT = 120;
|
||||||
static const int CALIBRATION_BILLBOARD_TOP_MARGIN = 60;
|
static const int CALIBRATION_BILLBOARD_TOP_MARGIN = 30;
|
||||||
static const int CALIBRATION_BILLBOARD_LEFT_MARGIN = 30;
|
static const int CALIBRATION_BILLBOARD_LEFT_MARGIN = 30;
|
||||||
static const int CALIBRATION_BILLBOARD_FONT_SIZE = 16;
|
static const int CALIBRATION_BILLBOARD_FONT_SIZE = 16;
|
||||||
static const float CALIBRATION_BILLBOARD_ALPHA = 0.5f;
|
static const float CALIBRATION_BILLBOARD_ALPHA = 0.5f;
|
||||||
static QString CALIBRATION_INSTRUCTION_MESSAGE = "Hold still to calibrate";
|
static QString CALIBRATION_INSTRUCTION_MESSAGE = "Hold still to calibrate camera";
|
||||||
|
|
||||||
void DdeFaceTracker::calibrate() {
|
void DdeFaceTracker::calibrate() {
|
||||||
|
if (!Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) || _isMuted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_isCalibrating) {
|
if (!_isCalibrating) {
|
||||||
qCDebug(interfaceapp) << "DDE Face Tracker: Calibration started";
|
qCDebug(interfaceapp) << "DDE Face Tracker: Calibration started";
|
||||||
|
|
||||||
|
@ -629,10 +639,13 @@ void DdeFaceTracker::finishCalibration() {
|
||||||
qApp->getOverlays().deleteOverlay(_calibrationBillboardID);
|
qApp->getOverlays().deleteOverlay(_calibrationBillboardID);
|
||||||
_calibrationBillboard = NULL;
|
_calibrationBillboard = NULL;
|
||||||
_isCalibrating = false;
|
_isCalibrating = false;
|
||||||
|
_isCalibrated = true;
|
||||||
|
|
||||||
for (int i = 0; i < NUM_FACESHIFT_BLENDSHAPES; i++) {
|
for (int i = 0; i < NUM_FACESHIFT_BLENDSHAPES; i++) {
|
||||||
_coefficientAverages[i] = _calibrationValues[i] / (float)CALIBRATION_SAMPLES;
|
_coefficientAverages[i] = _calibrationValues[i] / (float)CALIBRATION_SAMPLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reset();
|
||||||
|
|
||||||
qCDebug(interfaceapp) << "DDE Face Tracker: Calibration finished";
|
qCDebug(interfaceapp) << "DDE Face Tracker: Calibration finished";
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,7 @@ private:
|
||||||
TextOverlay* _calibrationBillboard;
|
TextOverlay* _calibrationBillboard;
|
||||||
int _calibrationBillboardID;
|
int _calibrationBillboardID;
|
||||||
QString _calibrationMessage;
|
QString _calibrationMessage;
|
||||||
|
bool _isCalibrated;
|
||||||
void addCalibrationDatum();
|
void addCalibrationDatum();
|
||||||
void cancelCalibration();
|
void cancelCalibration();
|
||||||
void finishCalibration();
|
void finishCalibration();
|
||||||
|
|
Loading…
Reference in a new issue