From d7278bfcc84d1fc6ae09cdd2271636a8e8d8bdcf Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Sun, 5 Jun 2016 21:07:36 -0400 Subject: [PATCH] Update camera class. --- include/openspace/util/camera.h | 95 +++++++++++++++++---------------- src/util/camera.cpp | 81 +++++++++++++++------------- 2 files changed, 92 insertions(+), 84 deletions(-) diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index 8b0fd1d867..c244f5c7d5 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -1,26 +1,26 @@ /***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2016 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ +* * +* OpenSpace * +* * +* Copyright (c) 2014-2016 * +* * +* Permission is hereby granted, free of charge, to any person obtaining a copy of this * +* software and associated documentation files (the "Software"), to deal in the Software * +* without restriction, including without limitation the rights to use, copy, modify, * +* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * +* permit persons to whom the Software is furnished to do so, subject to the following * +* conditions: * +* * +* The above copyright notice and this permission notice shall be included in all copies * +* or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +****************************************************************************************/ #ifndef __CAMERA_H__ #define __CAMERA_H__ @@ -40,27 +40,27 @@ namespace openspace { /** - This class still needs some more love. Suggested improvements: - - Remove psc from the camera class interface. - - Accessors should return constant references to double precision class members. - - Remove the scaling variable (What is it used for?) - - Remove the maxFov and sinMaxfov variables. Redundant since the fov is embedded - within the perspective projection matrix. - - Remove focusposition, part of the integration with the scale graph. The - "focus position" should not be needed since we assume the camera is always - positioned relative to its origin. When orbiting another object (not in origin), - the focus position should probably be handled outside the camera class - (interaction handler) since it does not affect the state of the camera - (only how it interacts). - - The class might need some more reasonable accessors depending on use cases. - (up vector world space?) - - Make clear which function returns a combined view matrix (things that are - dependent on the separate sgct nodes). + This class still needs some more love. Suggested improvements: + - Remove psc from the camera class interface. + - Accessors should return constant references to double precision class members. + - Remove the scaling variable (What is it used for?) + - Remove the maxFov and sinMaxfov variables. Redundant since the fov is embedded + within the perspective projection matrix. + - Remove focusposition, part of the integration with the scale graph. The + "focus position" should not be needed since we assume the camera is always + positioned relative to its origin. When orbiting another object (not in origin), + the focus position should probably be handled outside the camera class + (interaction handler) since it does not affect the state of the camera + (only how it interacts). + - The class might need some more reasonable accessors depending on use cases. + (up vector world space?) + - Make clear which function returns a combined view matrix (things that are + dependent on the separate sgct nodes). */ class Camera { /** - Used to explicitly show which variables within the Camera class that are used - for caching. + Used to explicitly show which variables within the Camera class that are used + for caching. */ template struct Cached @@ -103,15 +103,18 @@ namespace openspace { // Should return const refs const Vec3& viewDirectionWorldSpace() const; const Vec3& lookUpVectorCameraSpace() const; + const Vec3& lookUpVectorWorldSpace() const; const glm::vec2& scaling() const; const Mat4& viewRotationMatrix() const; const Quat& rotationQuaternion() const; float maxFov() const; float sinMaxFov() const; - + // @TODO this should simply be called viewMatrix! // Or it needs to be changed so that it actually is combined. Right now it is // only the view matrix that is the same for all SGCT cameras. + // Right now this function returns the actual combined matrix which makes some + // of the old calls to the function wrong.. const Mat4& combinedViewMatrix() const; // Synchronization @@ -121,9 +124,9 @@ namespace openspace { void deserialize(SyncBuffer* syncBuffer); /** - Handles SGCT's internal matrices. Also caches a calculated viewProjection - matrix. This is the data that is different for different cameras within - SGCT. + Handles SGCT's internal matrices. Also caches a calculated viewProjection + matrix. This is the data that is different for different cameras within + SGCT. */ class SgctInternal { friend class Camera; @@ -171,8 +174,8 @@ namespace openspace { const glm::mat4& viewProjectionMatrix() const; private: /** - Class encapsulating data that needs to be synched between SGCT nodes. - Are all three variables (i.e. local, shared, synced) really neccessary? /EB + Class encapsulating data that needs to be synched between SGCT nodes. + Are all three variables (i.e. local, shared, synced) really neccessary? /EB */ template struct SyncData { diff --git a/src/util/camera.cpp b/src/util/camera.cpp index b41628b968..2710cf1d36 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -1,26 +1,26 @@ /***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2016 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ +* * +* OpenSpace * +* * +* Copyright (c) 2014-2016 * +* * +* Permission is hereby granted, free of charge, to any person obtaining a copy of this * +* software and associated documentation files (the "Software"), to deal in the Software * +* without restriction, including without limitation the rights to use, copy, modify, * +* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * +* permit persons to whom the Software is furnished to do so, subject to the following * +* conditions: * +* * +* The above copyright notice and this permission notice shall be included in all copies * +* or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +****************************************************************************************/ // open space includes #include @@ -43,8 +43,8 @@ namespace openspace { , _focusPosition() { _scaling.local = glm::vec2(1.f, 0.f); - _position.local = Vec3(0, 0, 0); - Vec3 eulerAngles(0, 0, 0); + _position.local = Vec3(1.0, 1.0, 1.0); + Vec3 eulerAngles(1.0, 1.0, 1.0); _rotation.local = Quat(eulerAngles); } @@ -92,35 +92,39 @@ namespace openspace { // Relative mutators void Camera::rotate(Quat rotation) { std::lock_guard _lock(_mutex); - _rotation.local = _rotation.local * rotation; + _rotation.local = rotation * _rotation.local; } // Accessors - const Camera::Vec3& Camera::positionVec3() const{ + const Camera::Vec3& Camera::positionVec3() const { return _position.synced; } - const Camera::Vec3& Camera::unsynchedPositionVec3() const{ + const Camera::Vec3& Camera::unsynchedPositionVec3() const { return _position.local; } - const Camera::Vec3& Camera::focusPositionVec3() const{ + const Camera::Vec3& Camera::focusPositionVec3() const { return _focusPosition; } const Camera::Vec3& Camera::viewDirectionWorldSpace() const { if (_cachedViewDirection.isDirty) { _cachedViewDirection.datum = - glm::inverse(_rotation.local) * Vec3(_VIEW_DIRECTION_CAMERA_SPACE); + _rotation.synced * Vec3(_VIEW_DIRECTION_CAMERA_SPACE); _cachedViewDirection.datum = glm::normalize(_cachedViewDirection.datum); } return _cachedViewDirection.datum; } - + const Camera::Vec3& Camera::lookUpVectorCameraSpace() const { return _LOOKUP_VECTOR_CAMERA_SPACE; } - + + const Camera::Vec3& Camera::lookUpVectorWorldSpace() const { + return glm::normalize(_rotation.synced * Vec3(_LOOKUP_VECTOR_CAMERA_SPACE)); + } + const glm::vec2& Camera::scaling() const { return _scaling.synced; } @@ -138,7 +142,7 @@ namespace openspace { const Camera::Mat4& Camera::viewRotationMatrix() const { if (_cachedViewRotationMatrix.isDirty) { - _cachedViewRotationMatrix.datum = glm::mat4_cast(_rotation.local); + _cachedViewRotationMatrix.datum = glm::mat4_cast(glm::inverse(_rotation.synced)); } return _cachedViewRotationMatrix.datum; } @@ -149,15 +153,16 @@ namespace openspace { const Camera::Mat4& Camera::combinedViewMatrix() const { if (_cachedCombinedViewMatrix.isDirty) { - glm::vec3 cameraPosition = position().vec3(); - glm::mat4 cameraTranslation = - glm::inverse(glm::translate(glm::mat4(1.0), cameraPosition)); + Mat4 cameraTranslation = + glm::inverse(glm::translate(Mat4(1.0), _position.shared)); _cachedCombinedViewMatrix.datum = - glm::mat4(viewRotationMatrix()) * cameraTranslation; + Mat4(sgctInternal.viewMatrix()) * + Mat4(viewRotationMatrix()) * + cameraTranslation; } return _cachedCombinedViewMatrix.datum; } - + // Synchronization void Camera::serialize(SyncBuffer* syncBuffer) { std::lock_guard _lock(_mutex); @@ -266,4 +271,4 @@ namespace openspace { const glm::mat4& Camera::viewProjectionMatrix() const { return sgctInternal.viewProjectionMatrix(); } -} // namespace openspace \ No newline at end of file +} // namespace openspace