Working on redoing internal coordinate systems & scenery transformations.
This commit is contained in:
parent
1406e5ba8e
commit
36a9adcffc
8 changed files with 148 additions and 65 deletions
|
@ -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); */
|
||||
|
||||
/* build current rotation matrix */
|
||||
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); */
|
||||
|
||||
/* 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.
|
||||
*
|
||||
|
|
|
@ -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/
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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); */
|
||||
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)];
|
||||
|
||||
p12 = fgGeodetic2Cartesian(x1*ARCSEC_TO_RAD, y2*ARCSEC_TO_RAD);
|
||||
p12 = fgRotateCartesianPoint(p12);
|
||||
/* 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); */
|
||||
|
||||
p21 = fgGeodetic2Cartesian(x2*ARCSEC_TO_RAD, y1*ARCSEC_TO_RAD);
|
||||
p21 = fgRotateCartesianPoint(p21);
|
||||
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);
|
||||
|
||||
p22 = fgGeodetic2Cartesian(x2*ARCSEC_TO_RAD, y2*ARCSEC_TO_RAD);
|
||||
p22 = fgRotateCartesianPoint(p22);
|
||||
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);
|
||||
|
||||
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)];
|
||||
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.
|
||||
*
|
||||
|
|
|
@ -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/
|
||||
#
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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.
|
||||
#
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue