From aa1455e23ac90a2aff94fe64b319e29051ede325 Mon Sep 17 00:00:00 2001
From: Bernhard Kerbl <kerbl@icg.tugraz.at>
Date: Sat, 8 Jul 2023 17:34:47 +0200
Subject: [PATCH] Trackball for point clouds fixed

---
 src/core/view/InteractiveCameraHandler.cpp        | 15 +++++++++++++++
 .../gaussianviewer/apps/gaussianViewer/main.cpp   |  2 +-
 .../remote/apps/remoteGaussianUI/main.cpp         |  2 +-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/core/view/InteractiveCameraHandler.cpp b/src/core/view/InteractiveCameraHandler.cpp
index bf81d015..dbb3cca1 100755
--- a/src/core/view/InteractiveCameraHandler.cpp
+++ b/src/core/view/InteractiveCameraHandler.cpp
@@ -92,6 +92,7 @@ namespace sibr {
 	{
 		_raycaster = raycaster;
 		_viewport = viewport;
+		_radius = areaOfInterest.diagonal().norm();
 		// Use the trackball to compute an initial camera.
 		_trackball.fromBoundingBox(areaOfInterest, viewport);
 		fromCamera(_trackball.getCamera(), false);
@@ -104,6 +105,20 @@ namespace sibr {
 			setupInterpolationPath(cams);
 		}
 		// Update the near and far planes.
+
+		sibr::Vector3f center(0, 0, 0);
+		for (const auto& cam : cams) {
+			center += cam->transform().position();
+		}
+		center /= cams.size();
+
+		float avgDist = 0;
+		for (const auto& cam : cams) {
+			avgDist += (cam->transform().position() - center).norm();
+		}
+		avgDist /= cams.size();
+		_radius = avgDist;
+
 		sibr::InputCamera idealCam = *cams[0];
 		if(clippingPlanes[0] < 0.0f || clippingPlanes[1] < 0.0f) {
 			float zFar = -1.0f, zNear = -1.0f;
diff --git a/src/projects/gaussianviewer/apps/gaussianViewer/main.cpp b/src/projects/gaussianviewer/apps/gaussianViewer/main.cpp
index 75cf3041..9e8b9116 100644
--- a/src/projects/gaussianviewer/apps/gaussianViewer/main.cpp
+++ b/src/projects/gaussianviewer/apps/gaussianViewer/main.cpp
@@ -177,7 +177,7 @@ int main(int ac, char** av)
 
 	// Camera handler for main view.
 	sibr::InteractiveCameraHandler::Ptr generalCamera(new InteractiveCameraHandler());
-	generalCamera->setup(scene->cameras()->inputCameras(), Viewport(0, 0, (float)usedResolution.x(), (float)usedResolution.y()), raycaster);
+	generalCamera->setup(scene->cameras()->inputCameras(), Viewport(0, 0, (float)usedResolution.x(), (float)usedResolution.y()), nullptr);
 
 	// Add views to mvm.
 	MultiViewManager        multiViewManager(window, false);
diff --git a/src/projects/remote/apps/remoteGaussianUI/main.cpp b/src/projects/remote/apps/remoteGaussianUI/main.cpp
index b6f74194..1791e3f3 100644
--- a/src/projects/remote/apps/remoteGaussianUI/main.cpp
+++ b/src/projects/remote/apps/remoteGaussianUI/main.cpp
@@ -94,7 +94,7 @@ void resetScene(RemoteAppArgs myArgs,
 
 	// Camera handler for main view.
 	sibr::InteractiveCameraHandler::Ptr generalCamera(new InteractiveCameraHandler());
-	generalCamera->setup(scene->cameras()->inputCameras(), Viewport(0, 0, (float)usedResolution.x(), (float)usedResolution.y()), raycaster);
+	generalCamera->setup(scene->cameras()->inputCameras(), Viewport(0, 0, (float)usedResolution.x(), (float)usedResolution.y()), nullptr);
 
 	// Top view
 	topView.reset(new sibr::SceneDebugView(scene, generalCamera, myArgs));
-- 
GitLab