don't worry about head controller being enabled, just check to see if head pose is valid

This commit is contained in:
Seth Alves 2017-06-02 13:57:53 -07:00
parent d91b3700a7
commit 9088e288e0
8 changed files with 33 additions and 50 deletions

View file

@ -4429,9 +4429,7 @@ void Application::update(float deltaTime) {
myAvatar->setSpineControllerPosesInSensorFrame(hipsPose.transform(avatarToSensorMatrix), spine2Pose.transform(avatarToSensorMatrix)); myAvatar->setSpineControllerPosesInSensorFrame(hipsPose.transform(avatarToSensorMatrix), spine2Pose.transform(avatarToSensorMatrix));
controller::Pose headPose = userInputMapper->getPoseState(controller::Action::HEAD); controller::Pose headPose = userInputMapper->getPoseState(controller::Action::HEAD);
if (headPose.isValid()) { myAvatar->setHeadControllerPoseInSensorFrame(headPose.transform(avatarToSensorMatrix));
myAvatar->setHeadControllerPoseInSensorFrame(headPose.transform(avatarToSensorMatrix));
}
controller::Pose leftArmPose = userInputMapper->getPoseState(controller::Action::LEFT_ARM); controller::Pose leftArmPose = userInputMapper->getPoseState(controller::Action::LEFT_ARM);
controller::Pose rightArmPose = userInputMapper->getPoseState(controller::Action::RIGHT_ARM); controller::Pose rightArmPose = userInputMapper->getPoseState(controller::Action::RIGHT_ARM);
@ -4867,20 +4865,6 @@ bool Application::isHMDMode() const {
return getActiveDisplayPlugin()->isHmd(); return getActiveDisplayPlugin()->isHmd();
} }
bool Application::isHeadControllerEnabled() const {
auto pluginManager = PluginManager::getInstance();
if (!pluginManager) {
return false;
}
const InputPluginList& inputPlugins = pluginManager->getInputPlugins();
for (auto& ip : inputPlugins) {
if (ip && ip->isActive() && ip->isHeadController()) {
return true;
}
}
return false;
}
float Application::getTargetFrameRate() const { return getActiveDisplayPlugin()->getTargetFrameRate(); } float Application::getTargetFrameRate() const { return getActiveDisplayPlugin()->getTargetFrameRate(); }
QRect Application::getDesirableApplicationGeometry() const { QRect Application::getDesirableApplicationGeometry() const {

View file

@ -248,7 +248,6 @@ public:
// rendering of several elements depend on that // rendering of several elements depend on that
// TODO: carry that information on the Camera as a setting // TODO: carry that information on the Camera as a setting
virtual bool isHMDMode() const override; virtual bool isHMDMode() const override;
bool isHeadControllerEnabled() const;
glm::mat4 getHMDSensorPose() const; glm::mat4 getHMDSensorPose() const;
glm::mat4 getEyeOffset(int eye) const; glm::mat4 getEyeOffset(int eye) const;
glm::mat4 getEyeProjection(int eye) const; glm::mat4 getEyeProjection(int eye) const;

View file

@ -641,9 +641,13 @@ void MyAvatar::updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix) {
// Ignore unreasonable HMD sensor data // Ignore unreasonable HMD sensor data
return; return;
} }
_hmdSensorPosition = newHmdSensorPosition; _hmdSensorPosition = newHmdSensorPosition;
_hmdSensorOrientation = glm::quat_cast(hmdSensorMatrix); _hmdSensorOrientation = glm::quat_cast(hmdSensorMatrix);
_headControllerFacing = getFacingDir2D(_headControllerPoseInSensorFrameCache.get().rotation); auto headPose = _headControllerPoseInSensorFrameCache.get();
if (headPose.isValid()) {
_headControllerFacing = getFacingDir2D(headPose.rotation);
}
} }
void MyAvatar::updateJointFromController(controller::Action poseKey, ThreadSafeValueCache<glm::mat4>& matrixCache) { void MyAvatar::updateJointFromController(controller::Action poseKey, ThreadSafeValueCache<glm::mat4>& matrixCache) {
@ -1884,7 +1888,7 @@ void MyAvatar::updateOrientation(float deltaTime) {
getHead()->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime); getHead()->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime);
if (qApp->isHeadControllerEnabled()) { if (getHeadControllerPoseInAvatarFrame().isValid()) {
glm::quat localOrientation = getHeadControllerPoseInAvatarFrame().rotation; glm::quat localOrientation = getHeadControllerPoseInAvatarFrame().rotation;
// these angles will be in radians // these angles will be in radians
// ... so they need to be converted to degrees before we do math... // ... so they need to be converted to degrees before we do math...

View file

@ -52,26 +52,18 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) {
// input action is the highest priority source for head orientation. // input action is the highest priority source for head orientation.
auto avatarHeadPose = myAvatar->getHeadControllerPoseInAvatarFrame(); auto avatarHeadPose = myAvatar->getHeadControllerPoseInAvatarFrame();
if (avatarHeadPose.isValid()) { if (avatarHeadPose.isValid()) {
glm::mat4 rigHeadMat = Matrices::Y_180 * createMatFromQuatAndPos(avatarHeadPose.getRotation(), avatarHeadPose.getTranslation()); glm::mat4 rigHeadMat = Matrices::Y_180 *
createMatFromQuatAndPos(avatarHeadPose.getRotation(), avatarHeadPose.getTranslation());
headParams.rigHeadPosition = extractTranslation(rigHeadMat); headParams.rigHeadPosition = extractTranslation(rigHeadMat);
headParams.rigHeadOrientation = glmExtractRotation(rigHeadMat); headParams.rigHeadOrientation = glmExtractRotation(rigHeadMat);
headParams.headEnabled = true; headParams.headEnabled = true;
} else { } else {
if (qApp->isHMDMode()) { // even though full head IK is disabled, the rig still needs the head orientation to rotate the head up and
// get HMD position from sensor space into world space, and back into rig space // down in desktop mode.
glm::mat4 worldHMDMat = myAvatar->getHeadControllerPoseInWorldFrame().getMatrix(); // preMult 180 is necessary to convert from avatar to rig coordinates.
glm::mat4 rigToWorld = createMatFromQuatAndPos(getRotation(), getTranslation()); // postMult 180 is necessary to convert head from -z forward to z forward.
glm::mat4 worldToRig = glm::inverse(rigToWorld); headParams.rigHeadOrientation = Quaternions::Y_180 * head->getFinalOrientationInLocalFrame() * Quaternions::Y_180;
glm::mat4 rigHMDMat = worldToRig * worldHMDMat; headParams.headEnabled = false;
_rig.computeHeadFromHMD(AnimPose(rigHMDMat), headParams.rigHeadPosition, headParams.rigHeadOrientation);
headParams.headEnabled = true;
} else {
// even though full head IK is disabled, the rig still needs the head orientation to rotate the head up and down in desktop mode.
// preMult 180 is necessary to convert from avatar to rig coordinates.
// postMult 180 is necessary to convert head from -z forward to z forward.
headParams.rigHeadOrientation = Quaternions::Y_180 * head->getFinalOrientationInLocalFrame() * Quaternions::Y_180;
headParams.headEnabled = false;
}
} }
auto avatarHipsPose = myAvatar->getHipsControllerPoseInAvatarFrame(); auto avatarHipsPose = myAvatar->getHipsControllerPoseInAvatarFrame();

View file

@ -210,10 +210,8 @@ void OculusControllerManager::RemoteDevice::focusOutEvent() {
_buttonPressedMap.clear(); _buttonPressedMap.clear();
} }
bool OculusControllerManager::isHeadController() const { bool OculusControllerManager::isHeadControllerMounted() const {
// this plugin is a head controller if the HMD is mounted.
ovrSessionStatus status; ovrSessionStatus status;
bool success = OVR_SUCCESS(ovr_GetSessionStatus(_session, &status)); bool success = OVR_SUCCESS(ovr_GetSessionStatus(_session, &status));
if (!success) { if (!success) {
return false; return false;
@ -224,12 +222,12 @@ bool OculusControllerManager::isHeadController() const {
void OculusControllerManager::TouchDevice::update(float deltaTime, void OculusControllerManager::TouchDevice::update(float deltaTime,
const controller::InputCalibrationData& inputCalibrationData) { const controller::InputCalibrationData& inputCalibrationData) {
_buttonPressedMap.clear(); _buttonPressedMap.clear();
_poseStateMap.erase(controller::HEAD); // _poseStateMap.erase(controller::HEAD);
if (!_parent.isHeadController()) { // if (!_parent.isHeadControllerMounted()) {
// if the HMD isn't on someone's head, don't take input from the controllers // // if the HMD isn't on someone's head, don't take input from the controllers
return; // return;
} // }
int numTrackedControllers = 0; int numTrackedControllers = 0;
quint64 currentTime = usecTimestampNow(); quint64 currentTime = usecTimestampNow();
@ -261,7 +259,11 @@ void OculusControllerManager::TouchDevice::update(float deltaTime,
handleRotationForUntrackedHand(inputCalibrationData, hand, tracking.HandPoses[hand]); handleRotationForUntrackedHand(inputCalibrationData, hand, tracking.HandPoses[hand]);
}); });
handleHeadPose(deltaTime, inputCalibrationData, tracking.HeadPose); if (_parent.isHeadControllerMounted()) {
handleHeadPose(deltaTime, inputCalibrationData, tracking.HeadPose);
} else {
_poseStateMap[controller::HEAD].valid = false;
}
using namespace controller; using namespace controller;
// Axes // Axes

View file

@ -28,7 +28,8 @@ public:
const QString getName() const override { return NAME; } const QString getName() const override { return NAME; }
bool isHandController() const override { return _touch != nullptr; } bool isHandController() const override { return _touch != nullptr; }
bool isHeadController() const override; bool isHeadController() const override { return true; }
bool isHeadControllerMounted() const;
QStringList getSubdeviceNames() override; QStringList getSubdeviceNames() override;
bool activate() override; bool activate() override;

View file

@ -164,8 +164,8 @@ void ViveControllerManager::deactivate() {
_registeredWithInputMapper = false; _registeredWithInputMapper = false;
} }
bool ViveControllerManager::isHeadController() const { bool ViveControllerManager::isHeadControllerMounted() const {
if (_inputDevice && _inputDevice->isHeadController()) { if (_inputDevice && _inputDevice->isHeadControllerMounted()) {
return true; return true;
} }
vr::EDeviceActivityLevel activityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd); vr::EDeviceActivityLevel activityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);

View file

@ -41,7 +41,8 @@ public:
const QString getName() const override { return NAME; } const QString getName() const override { return NAME; }
bool isHandController() const override { return true; } bool isHandController() const override { return true; }
bool isHeadController() const override; bool isHeadController() const override { return true; }
bool isHeadControllerMounted() const;
bool activate() override; bool activate() override;
void deactivate() override; void deactivate() override;
@ -55,7 +56,7 @@ private:
class InputDevice : public controller::InputDevice { class InputDevice : public controller::InputDevice {
public: public:
InputDevice(vr::IVRSystem*& system); InputDevice(vr::IVRSystem*& system);
bool isHeadController() const { return _overrideHead; } bool isHeadControllerMounted() const { return _overrideHead; }
private: private:
// Device functions // Device functions
controller::Input::NamedVector getAvailableInputs() const override; controller::Input::NamedVector getAvailableInputs() const override;