Merge pull request #7625 from hyperlogic/tony/third-person-hmd-camera-improvements

Improve comfort of third-person HMD camera.
This commit is contained in:
Brad Hefta-Gaub 2016-04-12 08:32:23 -07:00
commit a1fe6aee6d
2 changed files with 16 additions and 12 deletions

View file

@ -3451,9 +3451,6 @@ void Application::update(float deltaTime) {
avatarManager->updateOtherAvatars(deltaTime); avatarManager->updateOtherAvatars(deltaTime);
} }
// update sensorToWorldMatrix for camera and hand controllers
getMyAvatar()->updateSensorToWorldMatrix();
qApp->updateMyAvatarLookAtPosition(); qApp->updateMyAvatarLookAtPosition();
{ {

View file

@ -294,20 +294,18 @@ void MyAvatar::update(float deltaTime) {
auto audio = DependencyManager::get<AudioClient>(); auto audio = DependencyManager::get<AudioClient>();
head->setAudioLoudness(audio->getLastInputLoudness()); head->setAudioLoudness(audio->getLastInputLoudness());
head->setAudioAverageLoudness(audio->getAudioAverageInputLoudness()); head->setAudioAverageLoudness(audio->getAudioAverageInputLoudness());
simulate(deltaTime); simulate(deltaTime);
currentEnergy += energyChargeRate; currentEnergy += energyChargeRate;
currentEnergy -= getAccelerationEnergy(); currentEnergy -= getAccelerationEnergy();
currentEnergy -= getAudioEnergy(); currentEnergy -= getAudioEnergy();
if(didTeleport()) { if(didTeleport()) {
currentEnergy = 0.0f; currentEnergy = 0.0f;
} }
currentEnergy = max(0.0f, min(currentEnergy,1.0f)); currentEnergy = max(0.0f, min(currentEnergy,1.0f));
emit energyChanged(currentEnergy); emit energyChanged(currentEnergy);
} }
extern QByteArray avatarStateToFrame(const AvatarData* _avatar); extern QByteArray avatarStateToFrame(const AvatarData* _avatar);
@ -333,6 +331,10 @@ void MyAvatar::simulate(float deltaTime) {
updatePosition(deltaTime); updatePosition(deltaTime);
} }
// update sensorToWorldMatrix for camera and hand controllers
// before we perform rig animations and IK.
updateSensorToWorldMatrix();
{ {
PerformanceTimer perfTimer("skeleton"); PerformanceTimer perfTimer("skeleton");
_skeletonModel->simulate(deltaTime); _skeletonModel->simulate(deltaTime);
@ -1975,9 +1977,14 @@ void MyAvatar::FollowHelper::decrementTimeRemaining(float dt) {
} }
bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const {
const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees auto cameraMode = qApp->getCamera()->getMode();
glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); if (cameraMode == CAMERA_MODE_THIRD_PERSON) {
return glm::dot(myAvatar.getHMDSensorFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; return false;
} else {
const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees
glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix);
return glm::dot(myAvatar.getHMDSensorFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD;
}
} }
bool MyAvatar::FollowHelper::shouldActivateHorizontal(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { bool MyAvatar::FollowHelper::shouldActivateHorizontal(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const {