diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-04-12 17:58:53 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-04-13 11:42:25 +0000 |
commit | 785b3314629bdb67867dd9af023b721011a65772 (patch) | |
tree | 32a1ca7023487f67b5f26426bbf5faaf978df737 /src/Authoring/Studio/Render/StudioRenderer.cpp | |
parent | a34f4b9776cc2633481683839e8f3323c134be74 (diff) |
Fix orbit camera
Orbit camera now keeps horizon level
Task-number: QT3DS-1381
Change-Id: I2b999a913d1df82971300db31e0b877b0b70f234
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Teemu Tamminen <teemu.tamminen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Render/StudioRenderer.cpp')
-rw-r--r-- | src/Authoring/Studio/Render/StudioRenderer.cpp | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/src/Authoring/Studio/Render/StudioRenderer.cpp b/src/Authoring/Studio/Render/StudioRenderer.cpp index 345d0bac..b48ff449 100644 --- a/src/Authoring/Studio/Render/StudioRenderer.cpp +++ b/src/Authoring/Studio/Render/StudioRenderer.cpp @@ -32,6 +32,7 @@ #include "StudioPreferences.h" #include "HotKeys.h" #include "StudioUtils.h" +#include "Qt3DSMath.h" #include <QDebug> @@ -468,7 +469,15 @@ struct SRendererImpl : public IStudioRenderer, // accurately // or consider requesting a larger depth buffer from the windowing system. // Setup the camera - theCameraInfo->m_Direction = theDefinition.m_Direction; + QT3DSVec3 normalizedDir = theDefinition.m_Direction; + normalizedDir.normalize(); + if (theDefinition.m_Type == EditCameraTypes::Directional) { + theCameraInfo->m_Direction = normalizedDir; + } else { + theCameraInfo->m_Direction = QT3DSVec3(0, 0, -1); + theCameraInfo->m_xRotation = -qt3ds::NVAtan(normalizedDir.x / normalizedDir.z); + theCameraInfo->m_yRotation = qt3ds::NVAsin(normalizedDir.y); + } theCameraInfo->m_CameraType = theDefinition.m_Type; } @@ -755,30 +764,27 @@ struct SRendererImpl : public IStudioRenderer, } break; case STUDIO_TOOLMODE_CAMERA_ROTATE: { if (m_Translation->m_EditCameraInfo.SupportsRotation()) { - if (rightClick == false) { - QT3DSVec3 theXAxis = QT3DSVec3(1, 0, 0); - QT3DSVec3 theYAxis = QT3DSVec3(0, 1, 0); - // Rotate about the center; we will just rotation the direction vector. - QT3DSQuat theXRotation(-1.0f * theSubsetXDistance * g_RotationScaleFactor - / 20.0f, - theYAxis); - QT3DSQuat theYRotation(-1.0f * theSubsetYDistance * g_RotationScaleFactor - / 20.0f, - theXAxis); - m_Translation->m_EditCameraInfo.m_Rotation = - m_MouseDownCameraInformation.m_Rotation - * (theXRotation * theYRotation); - } else { - QT3DSVec3 theZAxis = QT3DSVec3(0, 0, 1); - QT3DSQuat theZRotation( - -1.0f * theYDistance * g_RotationScaleFactor / 20.0f, theZAxis); - m_Translation->m_EditCameraInfo.m_Rotation = - m_MouseDownCameraInformation.m_Rotation * theZRotation; + if (!rightClick) { + m_Translation->m_EditCameraInfo.m_xRotation = + m_MouseDownCameraInformation.m_xRotation + + (theSubsetXDistance * g_RotationScaleFactor / 20.0f); + m_Translation->m_EditCameraInfo.m_yRotation = + m_MouseDownCameraInformation.m_yRotation + - (theSubsetYDistance * g_RotationScaleFactor / 20.0f); + // Avoid rounding errors stemming from extremely large rotation angles + if (m_Translation->m_EditCameraInfo.m_xRotation < -qt3ds::NVPi) + m_Translation->m_EditCameraInfo.m_xRotation += qt3ds::NVPi * 2.0f; + if (m_Translation->m_EditCameraInfo.m_xRotation > qt3ds::NVPi) + m_Translation->m_EditCameraInfo.m_xRotation -= qt3ds::NVPi * 2.0f; + if (m_Translation->m_EditCameraInfo.m_yRotation < -qt3ds::NVPi) + m_Translation->m_EditCameraInfo.m_yRotation += qt3ds::NVPi * 2.0f; + if (m_Translation->m_EditCameraInfo.m_yRotation > qt3ds::NVPi) + m_Translation->m_EditCameraInfo.m_yRotation -= qt3ds::NVPi * 2.0f; } - // Rotations need to be incremental and relative else things don't rotate - // intuitively. - m_MouseDownCameraInformation.m_Rotation = - m_Translation->m_EditCameraInfo.m_Rotation; + m_MouseDownCameraInformation.m_xRotation = + m_Translation->m_EditCameraInfo.m_xRotation; + m_MouseDownCameraInformation.m_yRotation = + m_Translation->m_EditCameraInfo.m_yRotation; RequestRender(); } } break; |