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 | offscreenSurfaceCache->reserve(Web3DOverlay::QML, 2); | 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 | 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 tracker | 2460 | // 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 | ||