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