[grits] Correct FOV_DIST and MPPX calculations
- From: Andy Spencer <andys src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grits] Correct FOV_DIST and MPPX calculations
- Date: Thu, 16 Feb 2012 23:17:54 +0000 (UTC)
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]