From: curt Date: Thu, 31 Jul 1997 22:52:21 +0000 (+0000) Subject: Working on redoing internal coordinate systems & scenery transformations. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=36a9adcffcb9f6ee302033bbe4db4d0515d0efc0;p=flightgear.git Working on redoing internal coordinate systems & scenery transformations. --- diff --git a/Main/GLmain.c b/Main/GLmain.c index 9da31b1ea..c7bf6d2ec 100644 --- a/Main/GLmain.c +++ b/Main/GLmain.c @@ -47,7 +47,7 @@ #include "../Math/fg_random.h" #include "../Math/mat3.h" #include "../Math/polar.h" -#include "../Timer/fg_timer.h" +#include "../Time/fg_timer.h" #include "../Weather/weather.h" @@ -71,7 +71,7 @@ static GLfloat sun_vec[4] = {-3.0, 1.0, 2.0, 0.0 }; /* static GLint scenery, runway; */ /* Another hack */ -double fogDensity = 60.0; /* in meters = about 70 miles */ +double fogDensity = 60000.0; /* in meters */ double view_offset = 0.0; double goal_view_offset = 0.0; @@ -125,28 +125,56 @@ static void fgInitVisuals() { **************************************************************************/ static void fgUpdateViewParams() { - struct fgCartesianPoint view_pos; + struct fgCartesianPoint view_pos /*, alt_up */; struct flight_params *f; - MAT3mat R, TMP; - MAT3vec vec, up, forward, fwrd_view; + MAT3mat R, TMP, UP, LOCAL, VIEW; + MAT3vec vec, view_up, forward, view_forward, local_up; f = ¤t_aircraft.flight; /* Tell GL we are about to modify the projection parameters */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(45.0, 1.0/win_ratio, 0.001, 2000.0); + gluPerspective(45.0, 1.0/win_ratio, 1.0, 200000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - /* calculate position in current FG view coordinate system */ - view_pos = fgGeodetic2Cartesian(FG_Longitude, FG_Latitude); - view_pos = fgRotateCartesianPoint(view_pos); + /* calculate view position in current FG view coordinate system */ + view_pos = fgPolarToCart(FG_Lon_geocentric, FG_Lat_geocentric, + FG_Radius_to_vehicle * FEET_TO_METER + 1.0); + printf("View pos = %.4f, %.4f, %.4f\n", view_pos.x, view_pos.y, view_pos.z); - printf("*** Altitude = %.2f meters\n", FG_Altitude * FEET_TO_METER); + /* Derive the local UP transformation matrix based on *geodetic* + * coordinates */ + MAT3_SET_VEC(vec, 0.0, 0.0, 1.0); + MAT3rotate(R, vec, FG_Longitude); /* R = rotate about Z axis */ + /* printf("Longitude matrix\n"); */ + /* MAT3print(R, stdout); */ + + MAT3_SET_VEC(vec, 0.0, 1.0, 0.0); + MAT3mult_vec(vec, vec, R); + MAT3rotate(TMP, vec, -FG_Latitude); /* TMP = rotate about X axis */ + /* printf("Latitude matrix\n"); */ + /* MAT3print(TMP, stdout); */ + + MAT3mult(UP, R, TMP); + printf("Local up matrix\n"); + MAT3print(UP, stdout); + + MAT3_SET_VEC(local_up, 1.0, 0.0, 0.0); + MAT3mult_vec(local_up, local_up, UP); + + printf(" Local Up = (%.4f, %.4f, %.4f)\n", local_up[0], local_up[1], + local_up[2]); + + /* Alternative method to Derive local up vector based on + * *geodetic* coordinates */ + /* alt_up = fgPolarToCart(FG_Longitude, FG_Latitude, 1.0); */ + /* printf(" Alt Up = (%.4f, %.4f, %.4f)\n", + alt_up.x, alt_up.y, alt_up.z); */ - /* build current rotation matrix */ + /* Derive the LOCAL aircraft rotation matrix (roll, pitch, yaw) */ MAT3_SET_VEC(vec, 1.0, 0.0, 0.0); MAT3rotate(R, vec, FG_Phi); /* printf("Roll matrix\n"); */ @@ -163,30 +191,33 @@ static void fgUpdateViewParams() { /* MAT3mult_vec(vec, vec, R); */ /* MAT3rotate(TMP, vec, FG_PI + FG_PI_2 + FG_Psi + view_offset); */ MAT3rotate(TMP, vec, FG_Psi - FG_PI_2); - /* printf("Yaw matrix\n"); + /* printf("Yaw matrix\n"); MAT3print(TMP, stdout); */ - MAT3mult(R, R, TMP); + MAT3mult(LOCAL, R, TMP); + printf("LOCAL matrix\n"); + MAT3print(LOCAL, stdout); - /* MAT3print(R, stdout); */ + /* Derive the VIEW matrix */ + MAT3mult(VIEW, UP, LOCAL); + printf("VIEW matrix\n"); + MAT3print(VIEW, stdout); /* generate the current up, forward, and fwrd-view vectors */ - MAT3_SET_VEC(vec, 0.0, 0.0, 1.0); - MAT3mult_vec(up, vec, R); - MAT3_SET_VEC(vec, 1.0, 0.0, 0.0); - MAT3mult_vec(forward, vec, R); + MAT3mult_vec(view_up, vec, VIEW); + + MAT3_SET_VEC(vec, 0.0, 1.0, 0.0); + MAT3mult_vec(forward, vec, VIEW); printf("Forward vector is (%.2f,%.2f,%.2f)\n", forward[0], forward[1], forward[2]); - MAT3rotate(TMP, up, view_offset); - MAT3mult_vec(fwrd_view, forward, TMP); + MAT3rotate(TMP, view_up, view_offset); + MAT3mult_vec(view_forward, forward, TMP); - printf("View pos = %.4f, %.4f, %.4f\n", view_pos.y, view_pos.z, - FG_Altitude * FEET_TO_METER); - gluLookAt(view_pos.y, view_pos.z, FG_Altitude*FEET_TO_METER * 0.001, - view_pos.y + fwrd_view[0], view_pos.z + fwrd_view[1], - FG_Altitude*FEET_TO_METER * 0.001 + fwrd_view[2], - up[0], up[1], up[2]); + gluLookAt(view_pos.x, view_pos.y, view_pos.z, + view_pos.x + view_forward[0], view_pos.y + view_forward[1], + view_pos.z + view_forward[2], + local_up[0], local_up[1], local_up[2]); glLightfv( GL_LIGHT0, GL_POSITION, sun_vec ); } @@ -621,9 +652,12 @@ int printf (const char *format, ...) { /* $Log$ -/* Revision 1.40 1997/07/30 16:12:42 curt -/* Moved fg_random routines from Util/ to Math/ +/* Revision 1.41 1997/07/31 22:52:37 curt +/* Working on redoing internal coordinate systems & scenery transformations. /* + * Revision 1.40 1997/07/30 16:12:42 curt + * Moved fg_random routines from Util/ to Math/ + * * Revision 1.39 1997/07/21 14:45:01 curt * Minor tweaks. * diff --git a/Main/Makefile b/Main/Makefile index 4d072da7b..bfee17cee 100644 --- a/Main/Makefile +++ b/Main/Makefile @@ -32,7 +32,7 @@ AFILES = ../Aircraft/libAircraft.a ../Controls/libControls.a \ ../Flight/libFlight.a ../Flight/LaRCsim/libLaRCsim.a \ ../Flight/Slew/libSlew.a ../Math/libMath.a \ ../Scenery/libScenery.a \ - ../Timer/libTimer.a ../Weather/libWeather.a + ../Time/libTime.a ../Weather/libWeather.a include ../make.inc @@ -76,6 +76,9 @@ mesh2GL.o: #--------------------------------------------------------------------------- # $Log$ +# Revision 1.27 1997/07/31 22:52:39 curt +# Working on redoing internal coordinate systems & scenery transformations. +# # Revision 1.26 1997/07/30 16:12:42 curt # Moved fg_random routines from Util/ to Math/ # diff --git a/Main/depend b/Main/depend index a7b028cfd..9d73b07c2 100644 --- a/Main/depend +++ b/Main/depend @@ -18,8 +18,8 @@ GLmain.o: GLmain.c ../constants.h ../Aircraft/aircraft.h \ ../Aircraft/../Controls/controls.h \ ../Aircraft/../Controls/../limits.h ../Scenery/mesh.h \ ../Scenery/scenery.h ../Math/fg_random.h ../Math/mat3.h \ - ../Math/polar.h ../Math/../types.h ../Timer/fg_timer.h \ + ../Math/polar.h ../Math/../types.h ../Time/fg_timer.h \ ../Weather/weather.h mesh2GL.o: mesh2GL.c ../constants.h ../Scenery/mesh.h \ - ../Scenery/scenery.h ../Math/fg_random.h ../Math/mat3.h \ - ../Math/polar.h ../Math/../types.h + ../Scenery/scenery.h ../Math/fg_geodesy.h ../Math/fg_random.h \ + ../Math/mat3.h ../Math/polar.h ../Math/../types.h diff --git a/Main/mesh2GL.c b/Main/mesh2GL.c index 36f3bf144..8d081b00d 100644 --- a/Main/mesh2GL.c +++ b/Main/mesh2GL.c @@ -33,6 +33,7 @@ #include "../constants.h" #include "../Scenery/mesh.h" #include "../Scenery/scenery.h" +#include "../Math/fg_geodesy.h" #include "../Math/fg_random.h" #include "../Math/mat3.h" #include "../Math/polar.h" @@ -40,7 +41,7 @@ /* The following routine is a real hack used for testing puposes only * and should probably be removed. */ -void mesh_make_test_object(double lon, double lat) { +/* void mesh_make_test_object(double lon, double lat) { struct fgCartesianPoint origin; double elev; double b = 0.10; @@ -77,7 +78,7 @@ void mesh_make_test_object(double lon, double lat) { glVertex3d(origin.y - b, origin.z - b, elev); glVertex3d(origin.y, origin.z, elev+h); glEnd(); -} +} */ /* walk through mesh and make ogl calls */ GLint mesh2GL(struct mesh *m) { @@ -88,6 +89,7 @@ GLint mesh2GL(struct mesh *m) { float x1, y1, x2, y2, z11, z12, z21, z22; struct fgCartesianPoint p11, p12, p21, p22; + double gc_lon, gc_lat, sl_radius; MAT3vec v1, v2, normal; int i, j, istep, jstep, iend, jend; @@ -100,9 +102,6 @@ GLint mesh2GL(struct mesh *m) { * .../Scenery/scenery.c:fgSceneryInit() */ istep = jstep = cur_scenery_params.terrain_skip ; - /* setup the batch transformation */ - fgRotateBatchInit(-m->originx * ARCSEC_TO_RAD, -m->originy * ARCSEC_TO_RAD); - mesh = glGenLists(1); glNewList(mesh, GL_COMPILE); @@ -121,25 +120,32 @@ GLint mesh2GL(struct mesh *m) { glBegin(GL_TRIANGLE_STRIP); for ( j = 0; j < jend; j += jstep ) { - p11 = fgGeodetic2Cartesian(x1*ARCSEC_TO_RAD, y1*ARCSEC_TO_RAD); - /* printf("A geodetic is (%.2f, %.2f)\n", x1, y1); */ - /* printf("A cart is (%.8f, %.8f, %.8f)\n", p11.x, p11.y, p11.z); */ - p11 = fgRotateCartesianPoint(p11); - /* printf("A point is (%.8f, %.8f, %.8f)\n", p11.y, p11.z, z11); */ - - p12 = fgGeodetic2Cartesian(x1*ARCSEC_TO_RAD, y2*ARCSEC_TO_RAD); - p12 = fgRotateCartesianPoint(p12); - - p21 = fgGeodetic2Cartesian(x2*ARCSEC_TO_RAD, y1*ARCSEC_TO_RAD); - p21 = fgRotateCartesianPoint(p21); - - p22 = fgGeodetic2Cartesian(x2*ARCSEC_TO_RAD, y2*ARCSEC_TO_RAD); - p22 = fgRotateCartesianPoint(p22); - - z11 = 0.001 * m->mesh_data[i * m->cols + j ]; - z12 = 0.001 * m->mesh_data[(i+istep) * m->cols + j ]; - z21 = 0.001 * m->mesh_data[i * m->cols + (j+jstep)]; - z22 = 0.001 * m->mesh_data[(i+istep) * m->cols + (j+jstep)]; + z11 = m->mesh_data[i * m->cols + j ]; + z12 = m->mesh_data[(i+istep) * m->cols + j ]; + z21 = m->mesh_data[i * m->cols + (j+jstep)]; + z22 = m->mesh_data[(i+istep) * m->cols + (j+jstep)]; + + /* printf("A geodetic point is (%.2f, %.2f, %.2f)\n", + x1, y1, z11); */ + gc_lon = x1*ARCSEC_TO_RAD; + fgGeodToGeoc(y1*ARCSEC_TO_RAD, z11, &sl_radius, &gc_lat); + /* printf("A geocentric point is (%.2f, %.2f, %.2f)\n", gc_lon, + gc_lat, sl_radius+z11); */ + p11 = fgPolarToCart(gc_lon, gc_lat, sl_radius+z11); + /* printf("A cart point is (%.8f, %.8f, %.8f)\n", + p11.x, p11.y, p11.z); */ + + gc_lon = x1*ARCSEC_TO_RAD; + fgGeodToGeoc(y2*ARCSEC_TO_RAD, z12, &sl_radius, &gc_lat); + p12 = fgPolarToCart(gc_lon, gc_lat, sl_radius+z12); + + gc_lon = x2*ARCSEC_TO_RAD; + fgGeodToGeoc(y1*ARCSEC_TO_RAD, z21, &sl_radius, &gc_lat); + p21 = fgPolarToCart(gc_lon, gc_lat, sl_radius+z21); + + gc_lon = x2*ARCSEC_TO_RAD; + fgGeodToGeoc(y2*ARCSEC_TO_RAD, z22, &sl_radius, &gc_lat); + p22 = fgPolarToCart(gc_lon, gc_lat, sl_radius+z22); v1[0] = p22.y - p11.y; v1[1] = p22.z - p11.z; v1[2] = z22 - z11; v2[0] = p12.y - p11.y; v2[1] = p12.z - p11.z; v2[2] = z12 - z11; @@ -151,11 +157,11 @@ GLint mesh2GL(struct mesh *m) { if ( j == 0 ) { /* first time through */ - glVertex3d(p12.y, p12.z, z12); - glVertex3d(p11.y, p11.z, z11); + glVertex3d(p12.x, p12.y, p12.z); + glVertex3d(p11.x, p11.y, p11.z); } - glVertex3d(p22.y, p22.z, z22); + glVertex3d(p22.x, p22.y, p22.z); v2[0] = p21.y - p11.y; v2[1] = p21.z - p11.z; v2[2] = z21 - z11; MAT3cross_product(normal, v2, v1); @@ -164,7 +170,7 @@ GLint mesh2GL(struct mesh *m) { /* printf("normal 2 = (%.2f %.2f %.2f\n", normal[0], normal[1], normal[2]); */ - glVertex3d(p21.y, p21.z, z21); + glVertex3d(p21.x, p21.y, p21.z); x1 += m->row_step * jstep; x2 += m->row_step * jstep; @@ -181,7 +187,7 @@ GLint mesh2GL(struct mesh *m) { randx = fg_random() * 3600.0; randy = fg_random() * 3600.0; - mesh_make_test_object(m->originx + randx, m->originy + randy); + /* mesh_make_test_object(m->originx + randx, m->originy + randy); */ } glEndList(); @@ -192,9 +198,12 @@ GLint mesh2GL(struct mesh *m) { /* $Log$ -/* Revision 1.40 1997/07/30 16:12:43 curt -/* Moved fg_random routines from Util/ to Math/ +/* Revision 1.41 1997/07/31 22:52:40 curt +/* Working on redoing internal coordinate systems & scenery transformations. /* + * Revision 1.40 1997/07/30 16:12:43 curt + * Moved fg_random routines from Util/ to Math/ + * * Revision 1.39 1997/07/21 21:20:48 curt * Twiddled with random object placement. * diff --git a/Simulator/Makefile b/Simulator/Makefile index 0ab101743..75e0dcc02 100644 --- a/Simulator/Makefile +++ b/Simulator/Makefile @@ -28,7 +28,7 @@ include make.inc SUBSUBDIRS = Flight/LaRCsim Flight/Slew -SUBDIRS = Aircraft Controls Flight Math Scenery Timer Weather +SUBDIRS = Aircraft Controls Flight Math Scenery Time Weather MAIN = OpenGL @@ -71,6 +71,9 @@ zip: clean #--------------------------------------------------------------------------- # $Log$ +# Revision 1.22 1997/07/31 22:52:21 curt +# Working on redoing internal coordinate systems & scenery transformations. +# # Revision 1.21 1997/07/30 16:12:38 curt # Moved fg_random routines from Util/ to Math/ # diff --git a/Simulator/constants.h b/Simulator/constants.h index edc521580..0bd37ad99 100644 --- a/Simulator/constants.h +++ b/Simulator/constants.h @@ -52,6 +52,30 @@ #define EARTH_RAD 6378.155 +/* Earth parameters for WGS 84, taken from LaRCsim/ls_constants.h */ + +/* Value of earth radius from [8] */ +#define EQUATORIAL_RADIUS_FT 20925650. /* ft */ +#define EQUATORIAL_RADIUS_KM 6378138.12 /* meter */ +/* Radius squared */ +#define RESQ_FT 437882827922500. /* ft */ +#define RESQ_KM 40680645877797.1344 /* meter */ + +/* Value of earth flattening parameter from ref [8] + * + * Note: FP = f + * E = 1-f + * EPS = sqrt(1-(1-f)^2) + */ + +#define FP 0.003352813178 +#define E 0.996647186 +#define EPS 0.081819221 +#define INVG 0.031080997 + + +/* Conversions */ + /* Degrees to Radians */ #define DEG_TO_RAD 0.017453292 /* deg*pi/180 = rad */ @@ -79,9 +103,12 @@ /* $Log$ -/* Revision 1.7 1997/07/23 21:52:10 curt -/* Put comments around the text after an #endif for increased portability. +/* Revision 1.8 1997/07/31 22:52:22 curt +/* Working on redoing internal coordinate systems & scenery transformations. /* + * Revision 1.7 1997/07/23 21:52:10 curt + * Put comments around the text after an #endif for increased portability. + * * Revision 1.6 1997/07/21 14:45:01 curt * Minor tweaks. * diff --git a/Time/Makefile b/Time/Makefile index a12b3e363..360884b06 100644 --- a/Time/Makefile +++ b/Time/Makefile @@ -24,7 +24,7 @@ #--------------------------------------------------------------------------- -TARGET = libTimer.a +TARGET = libTime.a CFILES = fg_timer.c HFILES = fg_timer.h @@ -63,6 +63,9 @@ fg_timer.o: #--------------------------------------------------------------------------- # $Log$ +# Revision 1.10 1997/07/31 22:52:40 curt +# Working on redoing internal coordinate systems & scenery transformations. +# # Revision 1.9 1997/07/20 02:19:12 curt # First stab at a system to generate os2 makefiles automatically. # diff --git a/Weather/weather.c b/Weather/weather.c index f805e9100..e7f2b8701 100644 --- a/Weather/weather.c +++ b/Weather/weather.c @@ -40,6 +40,7 @@ void fgWeatherUpdate(double lon, double lat, double alt) { /* Configure some wind */ FG_V_north_airmass = 15; /* ft/s =~ 10mph */ + FG_V_north_airmass = 0; /* Add some random turbulence */ FG_U_gust = fg_random() * 1.0 - 0.5; @@ -49,9 +50,12 @@ void fgWeatherUpdate(double lon, double lat, double alt) { } /* $Log$ -/* Revision 1.2 1997/07/30 16:12:44 curt -/* Moved fg_random routines from Util/ to Math/ +/* Revision 1.3 1997/07/31 22:52:41 curt +/* Working on redoing internal coordinate systems & scenery transformations. /* + * Revision 1.2 1997/07/30 16:12:44 curt + * Moved fg_random routines from Util/ to Math/ + * * Revision 1.1 1997/07/19 23:03:57 curt * Initial revision. *