History

Merge pull request #12107 from hyperlogic/bug-fix/better-third-person-camera

Improve stability for HMD third person avatars

Seth Alves committed 8 years ago

Commit aefd2942 parents b3fcca8 220b7f54 files · +31 −17Browse files

Showing the changes to interface/src/Application.cpp (1 of 4 files). Show all

Unified · Split

interface/src/Application.cpp+24−7
@@ -2444,7 +2444,7 @@ void Application::initializeUi() { · 2443 unmodified lines
2444 offscreenSurfaceCache->reserve(Web3DOverlay::QML, 2);2444 offscreenSurfaceCache->reserve(Web3DOverlay::QML, 2);
2445}2445}
2446 2446
2447void Application::updateCamera(RenderArgs& renderArgs) {2447void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) {
2448 PROFILE_RANGE(render, __FUNCTION__);2448 PROFILE_RANGE(render, __FUNCTION__);
2449 PerformanceTimer perfTimer("updateCamera");2449 PerformanceTimer perfTimer("updateCamera");
2450 2450
@@ -2459,6 +2459,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 8 unmodified lines
2459 // Using the latter will cause the camera to wobble with idle animations,2459 // Using the latter will cause the camera to wobble with idle animations,
2460 // or with changes from the face tracker2460 // or with changes from the face tracker
2461 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {2461 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
2462 _thirdPersonHMDCameraBoomValid= false;
2462 if (isHMDMode()) {2463 if (isHMDMode()) {
2463 mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();2464 mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
2464 _myCamera.setPosition(extractTranslation(camMat));2465 _myCamera.setPosition(extractTranslation(camMat));
@@ -2471,12 +2472,25 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 6 unmodified lines
2471 }2472 }
2472 else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {2473 else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
2473 if (isHMDMode()) {2474 if (isHMDMode()) {
2474 auto hmdWorldMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();2475
2475 _myCamera.setOrientation(glm::normalize(glmExtractRotation(hmdWorldMat)));2476 if (!_thirdPersonHMDCameraBoomValid) {
2476 _myCamera.setPosition(extractTranslation(hmdWorldMat) +2477 const glm::vec3 CAMERA_OFFSET = glm::vec3(0.0f, 0.0f, 0.7f);
2477 myAvatar->getWorldOrientation() * boomOffset);2478 _thirdPersonHMDCameraBoom = cancelOutRollAndPitch(myAvatar->getHMDSensorOrientation()) * CAMERA_OFFSET;
2479 _thirdPersonHMDCameraBoomValid = true;
2480 }
2481
2482 glm::mat4 thirdPersonCameraSensorToWorldMatrix = myAvatar->getSensorToWorldMatrix();
2483
2484 const glm::vec3 cameraPos = myAvatar->getHMDSensorPosition() + _thirdPersonHMDCameraBoom * myAvatar->getBoomLength();
2485 glm::mat4 sensorCameraMat = createMatFromQuatAndPos(myAvatar->getHMDSensorOrientation(), cameraPos);
2486 glm::mat4 worldCameraMat = thirdPersonCameraSensorToWorldMatrix * sensorCameraMat;
2487
2488 _myCamera.setOrientation(glm::normalize(glmExtractRotation(worldCameraMat)));
2489 _myCamera.setPosition(extractTranslation(worldCameraMat));
2478 }2490 }
2479 else {2491 else {
2492 _thirdPersonHMDCameraBoomValid = false;
2493
2480 _myCamera.setOrientation(myAvatar->getHead()->getOrientation());2494 _myCamera.setOrientation(myAvatar->getHead()->getOrientation());
2481 if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {2495 if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
2482 _myCamera.setPosition(myAvatar->getDefaultEyePosition()2496 _myCamera.setPosition(myAvatar->getDefaultEyePosition()
@@ -2489,6 +2503,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 6 unmodified lines
2489 }2503 }
2490 }2504 }
2491 else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {2505 else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
2506 _thirdPersonHMDCameraBoomValid= false;
2492 if (isHMDMode()) {2507 if (isHMDMode()) {
2493 auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f));2508 auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f));
2494 2509
@@ -2523,6 +2538,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 28 unmodified lines
2523 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;2538 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
2524 }2539 }
2525 else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) {2540 else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) {
2541 _thirdPersonHMDCameraBoomValid= false;
2526 EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer();2542 EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer();
2527 if (cameraEntity != nullptr) {2543 if (cameraEntity != nullptr) {
2528 if (isHMDMode()) {2544 if (isHMDMode()) {
@@ -5099,7 +5115,8 @@ void Application::update(float deltaTime) { · 2570 unmodified lines
5099 _postUpdateLambdas.clear();5115 _postUpdateLambdas.clear();
5100 }5116 }
5101 5117
5102 editRenderArgs([this](AppRenderArgs& appRenderArgs) {5118
5119 editRenderArgs([this, deltaTime](AppRenderArgs& appRenderArgs) {
5103 PerformanceTimer perfTimer("editRenderArgs");5120 PerformanceTimer perfTimer("editRenderArgs");
5104 appRenderArgs._headPose= getHMDSensorPose();5121 appRenderArgs._headPose= getHMDSensorPose();
5105 5122
@@ -5146,7 +5163,7 @@ void Application::update(float deltaTime) { · 40 unmodified lines
5146 resizeGL();5163 resizeGL();
5147 }5164 }
5148 5165
5149 this->updateCamera(appRenderArgs._renderArgs);5166 this->updateCamera(appRenderArgs._renderArgs, deltaTime);
5150 appRenderArgs._eyeToWorld = _myCamera.getTransform();5167 appRenderArgs._eyeToWorld = _myCamera.getTransform();
5151 appRenderArgs._isStereo = false;5168 appRenderArgs._isStereo = false;
5152 5169