]> Pileus Git - grits/commitdiff
Correct FOV_DIST and MPPX calculations
authorAndy Spencer <andy753421@gmail.com>
Wed, 8 Feb 2012 07:35:39 +0000 (07:35 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 8 Feb 2012 08:13:14 +0000 (08:13 +0000)
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
src/grits-util.h
src/grits-viewer.c
src/plugins/test.c

index 3d7b7dd12a718ddf6bac02c83509e2c5df706f8e..5bf1710b9f172d1f0b55e6b6e7979e58d4eac401 100644 (file)
@@ -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);
index 0fa144d2175ba8a99cd2b933c4652cc399462336..8e7a2fd075d46c365a56a0bb679577a9cfc53bdb 100644 (file)
@@ -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);
index d9e28878dbcd53ed03c1875c59769186a776af50..b4b672a62e6f814473dc36a79a98ded4d2238a9d 100644 (file)
@@ -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;
index 51be90ef88c04cbb796923315c4b741f5e2453b3..8fb3ee6b9fda2fb2d457519d91a08dcd4bab3e49 100644 (file)
@@ -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);