diff --git a/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp b/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp index 84ad4d2b49f272d98a52a4469c38d1504320bf0e..ada1a83e0ae3aaa1c7371be210ade24d2a9df50e 100644 --- a/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp +++ b/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp @@ -396,20 +396,24 @@ VTKRenderer::updateCamera() std::shared_ptr<Camera> cam = m_scene->getActiveCamera(); getVtkRenderer()->SetActiveCamera(m_camera); - // Update the camera to obtain corrected view/proj matrices - cam->update(); + // As long as we don't have a VR camera apply the camera view + if (vtkOpenVRCamera::SafeDownCast(m_camera) == nullptr) + { + // Update the camera to obtain corrected view/proj matrices + cam->update(); - // Get the view matrix - const Mat4d& invView = cam->getInvView(); + // Get the view matrix + const Mat4d& invView = cam->getInvView(); - const double eyePos[3] = { invView(0, 3), invView(1, 3), invView(2, 3) }; - const double forward[3] = { invView(0, 2), invView(1, 2), invView(2, 2) }; - const double up[3] = { invView(0, 1), invView(1, 1), invView(2, 1) }; + const double eyePos[3] = { invView(0, 3), invView(1, 3), invView(2, 3) }; + const double forward[3] = { invView(0, 2), invView(1, 2), invView(2, 2) }; + const double up[3] = { invView(0, 1), invView(1, 1), invView(2, 1) }; - m_camera->SetPosition(eyePos); - m_camera->SetFocalPoint(eyePos[0] - forward[0], eyePos[1] - forward[1], eyePos[2] - forward[2]); - m_camera->SetViewUp(up[0], up[1], up[2]); - m_camera->SetViewAngle(cam->getFieldOfView()); + m_camera->SetPosition(eyePos); + m_camera->SetFocalPoint(eyePos[0] - forward[0], eyePos[1] - forward[1], eyePos[2] - forward[2]); + m_camera->SetViewUp(up[0], up[1], up[2]); + m_camera->SetViewAngle(cam->getFieldOfView()); + } m_camera->SetClippingRange(cam->getNearZ(), cam->getFarZ()); // Copy the projection back to the camera diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKOpenVRViewer.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKOpenVRViewer.cpp index c1b5423ffa8ffd320710c5285deeeff2423b3df9..d9cd53a1eae906e03ed04925ca7e59e45dd56df3 100644 --- a/Source/SimulationManager/VTKRenderer/imstkVTKOpenVRViewer.cpp +++ b/Source/SimulationManager/VTKRenderer/imstkVTKOpenVRViewer.cpp @@ -20,6 +20,7 @@ =========================================================================*/ #include "imstkVTKOpenVRViewer.h" +#include "imstkCamera.h" #include "imstkDeviceControl.h" #include "imstkLogger.h" #include "imstkOpenVRDeviceClient.h" @@ -174,11 +175,12 @@ VTKOpenVRViewer::initModule() // \todo: Display devices in debug mode renWin->Render(); // Must do one render to initialize vtkOpenVRModel's to then hide the devices + // Actions must be added after initialization of interactor vtkInteractorStyleVR* iStyle = vtkInteractorStyleVR::SafeDownCast(m_vtkInteractorStyle.get()); iStyle->addButtonActions(); iStyle->addMovementActions(); - // Hide all controllers + // Hide all controller models for (uint32_t i = 0; i < vr::k_unMaxTrackedDeviceCount; i++) { vtkVRModel* trackedDeviceModel = renWin->GetTrackedDeviceModel(i); @@ -200,6 +202,12 @@ VTKOpenVRViewer::updateModule() return; } + // For the VR view we can't supply the a camera in the normal sense + // we need to pre multiply a "user view" + std::shared_ptr<Camera> cam = getActiveScene()->getActiveCamera(); + const Mat4d& view = cam->getView(); + setPhysicalToWorldTransform(view); + // Update Camera // \todo: No programmatic control over VR camera currently //renderer->updateSceneCamera(getActiveScene()->getCamera());