From: Andy Spencer Date: Wed, 8 Feb 2012 07:35:39 +0000 (+0000) Subject: Correct FOV_DIST and MPPX calculations X-Git-Tag: v0.7~17 X-Git-Url: http://pileus.org/git/?p=grits;a=commitdiff_plain;h=46c47c0bc0785333480ce29b78594e60939efd35 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 --- 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);