[grits] Correct FOV_DIST and MPPX calculations



commit 46c47c0bc0785333480ce29b78594e60939efd35
Author: Andy Spencer <andy753421 gmail com>
Date:   Wed Feb 8 07:35:39 2012 +0000

    Correct FOV_DIST and MPPX calculations
    
    Derivation of FOV_DIST for a 1600x1200 monitor
    with a vertical viewing angle of 30 degrees:
    
            ---  +._
             |   |  '-._     angle
      height |   |      '-._/
      (px)   |   |         ('-._
            ---  +--------------+ (o) eye
    
                 |--------------|
                   FOV_DIST (px)
    
      height   = 1200 px
      angle    =   30 deg
      fov_dist = cot(angle)*height = 2078.46
    
    Derivation of angle for window of a given height:
    
      angle    = atan(height/FOV_DIST)
    
    Derivation of resolution in meters per pixel
    at a given distance:
    
            ---  +._
             |   |  '-._
      length |   |      '-._
      (m)    |   |          '-._
            ---  +--------------+ (o) eye
    
                 |--------------|
                   dist (m)
    
      length   = tan(angle) * dist
      mppx     = length / height
               = (tan(atan(height/FOV_DIST)) * dist) / height
               = dist/FOV_DIST

 src/grits-opengl.c |    2 +-
 src/grits-util.h   |    4 ++--
 src/grits-viewer.c |    6 +++---
 src/plugins/test.c |    2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)
---
diff --git a/src/grits-opengl.c b/src/grits-opengl.c
index 3d7b7dd..5bf1710 100644
--- a/src/grits-opengl.c
+++ b/src/grits-opengl.c
@@ -74,7 +74,7 @@ static void _set_visuals(GritsOpenGL *opengl)
 
 	grits_viewer_get_location(GRITS_VIEWER(opengl), &lat, &lon, &elev);
 	glViewport(0, 0, width, height);
-	gluPerspective(rad2deg(ang)*2, width/height, near, far);
+	gluPerspective(rad2deg(ang), width/height, near, far);
 
 	/* Setup camera and lighting */
 	glMatrixMode(GL_MODELVIEW);
diff --git a/src/grits-util.h b/src/grits-util.h
index 0fa144d..8e7a2fd 100644
--- a/src/grits-util.h
+++ b/src/grits-util.h
@@ -180,7 +180,7 @@ void grits_bounds_set_bounds(GritsBounds *bounds,
  *
  * Used by GritsOpenGL to set up the drawing window
  */
-#define FOV_DIST   2000.0
+#define FOV_DIST   2078.46
 
 /**
  * MPPX:
@@ -190,7 +190,7 @@ void grits_bounds_set_bounds(GritsBounds *bounds,
  *
  * Returns: the resolution in meters per pixel
  */
-#define MPPX(dist) (4*dist/FOV_DIST)
+#define MPPX(dist) (dist/FOV_DIST)
 
 void lle2xyz(gdouble lat, gdouble lon, gdouble elev,
 		gdouble *x, gdouble *y, gdouble *z);
diff --git a/src/grits-viewer.c b/src/grits-viewer.c
index d9e2887..b4b672a 100644
--- a/src/grits-viewer.c
+++ b/src/grits-viewer.c
@@ -163,11 +163,11 @@ static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpo
 	gdouble lat, lon, elev, scale, rx, ry, rz;
 	grits_viewer_get_location(GRITS_VIEWER(viewer), &lat, &lon, &elev);
 	grits_viewer_get_rotation(GRITS_VIEWER(viewer), &rx,  &ry,  &rz);
-	scale = (elev/EARTH_R/15) * (sin(deg2rad(ABS(rx)))*4+1);
+	scale = (elev/EARTH_R/40) * (sin(deg2rad(ABS(rx)))*4+1);
 	switch (viewer->drag_mode) {
 	case GRITS_DRAG_PAN:  grits_viewer_pan(viewer, -y*scale, x*scale, 0); break;
 	case GRITS_DRAG_ZOOM: grits_viewer_zoom(viewer, pow(2, -y/500)); break;
-	case GRITS_DRAG_TILT: grits_viewer_rotate(viewer, y/10, 0, x/10); break;
+	case GRITS_DRAG_TILT: grits_viewer_rotate(viewer, y/30, 0, x/20); break;
 	}
 	viewer->drag_x = event->x;
 	viewer->drag_y = event->y;
@@ -587,7 +587,7 @@ static void grits_viewer_init(GritsViewer *viewer)
 	viewer->time        = time(NULL);
 	viewer->location[0] = 40;
 	viewer->location[1] = -100;
-	viewer->location[2] = 1.5*EARTH_R;
+	viewer->location[2] = 4*EARTH_R;
 	viewer->rotation[0] = 0;
 	viewer->rotation[1] = 0;
 	viewer->rotation[2] = 0;
diff --git a/src/plugins/test.c b/src/plugins/test.c
index 51be90e..8fb3ee6 100644
--- a/src/plugins/test.c
+++ b/src/plugins/test.c
@@ -103,7 +103,7 @@ void _load_marker(GritsPluginTest *test)
 	GRITS_OBJECT(test->marker)->center.lat  =  38.841847;
 	GRITS_OBJECT(test->marker)->center.lon  = -90.491982;
 	GRITS_OBJECT(test->marker)->center.elev =   0.0;
-	GRITS_OBJECT(test->marker)->lod         = EARTH_R;
+	GRITS_OBJECT(test->marker)->lod         = EARTH_R*3;
 	grits_viewer_add(test->viewer, GRITS_OBJECT(test->marker), GRITS_LEVEL_OVERLAY, FALSE);
 	/* These do not work on marker yet */
 	//g_signal_connect(test->marker, "enter",        G_CALLBACK(on_marker_enter),  NULL);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]