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
24442444 offscreenSurfaceCache->reserve(Web3DOverlay::QML, 2);
24452445 }
24462446
2447−void Application::updateCamera(RenderArgs& renderArgs) {
2447+void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) {
24482448 PROFILE_RANGE(render, __FUNCTION__);
24492449 PerformanceTimer perfTimer("updateCamera");
24502450
@@ -2459,6 +2459,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 8 unmodified lines
24592459 // Using the latter will cause the camera to wobble with idle animations,
24602460 // or with changes from the face tracker
24612461 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
2462+ _thirdPersonHMDCameraBoomValid= false;
24622463 if (isHMDMode()) {
24632464 mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
24642465 _myCamera.setPosition(extractTranslation(camMat));
@@ -2471,12 +2472,25 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 6 unmodified lines
24712472 }
24722473 else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
24732474 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));
24782490 }
24792491 else {
2492+ _thirdPersonHMDCameraBoomValid = false;
2493+
24802494 _myCamera.setOrientation(myAvatar->getHead()->getOrientation());
24812495 if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
24822496 _myCamera.setPosition(myAvatar->getDefaultEyePosition()
@@ -2489,6 +2503,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 6 unmodified lines
24892503 }
24902504 }
24912505 else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
2506+ _thirdPersonHMDCameraBoomValid= false;
24922507 if (isHMDMode()) {
24932508 auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f));
24942509
@@ -2523,6 +2538,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { · 28 unmodified lines
25232538 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
25242539 }
25252540 else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) {
2541+ _thirdPersonHMDCameraBoomValid= false;
25262542 EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer();
25272543 if (cameraEntity != nullptr) {
25282544 if (isHMDMode()) {
@@ -5099,7 +5115,8 @@ void Application::update(float deltaTime) { · 2570 unmodified lines
50995115 _postUpdateLambdas.clear();
51005116 }
51015117
5102− editRenderArgs([this](AppRenderArgs& appRenderArgs) {
5118+
5119+ editRenderArgs([this, deltaTime](AppRenderArgs& appRenderArgs) {
51035120 PerformanceTimer perfTimer("editRenderArgs");
51045121 appRenderArgs._headPose= getHMDSensorPose();
51055122
@@ -5146,7 +5163,7 @@ void Application::update(float deltaTime) { · 40 unmodified lines
51465163 resizeGL();
51475164 }
51485165
5149− this->updateCamera(appRenderArgs._renderArgs);
5166+ this->updateCamera(appRenderArgs._renderArgs, deltaTime);
51505167 appRenderArgs._eyeToWorld = _myCamera.getTransform();
51515168 appRenderArgs._isStereo = false;
51525169