1
0
Fork 0

More efficient rotation matrix calc from Norm Vine.

This commit is contained in:
david 2002-07-18 15:54:21 +00:00
parent f4cfe4c207
commit 4ab343569f

View file

@ -599,20 +599,36 @@ setup_triangle (float * p1, float * p2, float * p3,
* @param lon_deg The longitude in degrees. * @param lon_deg The longitude in degrees.
* @param lat_deg The latitude in degrees. * @param lat_deg The latitude in degrees.
*/ */
static void void
makeWorldUpRotationMatrix (sgMat4 ROT, double hdg_deg, makeWorldUpRotationMatrix (sgMat4 ROT, double hdg_deg,
double lon_deg, double lat_deg) double lon_deg, double lat_deg)
{ {
sgVec3 obj_right, obj_up; SGfloat sin_lat = sin( lat_deg * SGD_DEGREES_TO_RADIANS );
sgSetVec3(obj_right, 0.0, 1.0, 0.0); // Y axis SGfloat cos_lat = cos( lat_deg * SGD_DEGREES_TO_RADIANS );
sgSetVec3(obj_up, 0.0, 0.0, 1.0); // Z axis SGfloat sin_lon = sin( lon_deg * SGD_DEGREES_TO_RADIANS );
sgMat4 ROT_lon, ROT_lat, ROT_hdg; SGfloat cos_lon = cos( lon_deg * SGD_DEGREES_TO_RADIANS );
sgMakeRotMat4(ROT_lon, lon_deg, obj_up); SGfloat sin_hdg = sin( hdg_deg * SGD_DEGREES_TO_RADIANS ) ;
sgMakeRotMat4(ROT_lat, 90 - lat_deg, obj_right); SGfloat cos_hdg = cos( hdg_deg * SGD_DEGREES_TO_RADIANS ) ;
sgMakeRotMat4(ROT_hdg, hdg_deg, obj_up);
sgCopyMat4(ROT, ROT_hdg); ROT[0][0] = cos_hdg * sin_lat * cos_lon - sin_hdg * sin_lon;
sgPostMultMat4(ROT, ROT_lat); ROT[0][1] = cos_hdg * sin_lat * sin_lon + sin_hdg * cos_lon;
sgPostMultMat4(ROT, ROT_lon); ROT[0][2] = -cos_hdg * cos_lat;
ROT[0][3] = SG_ZERO;
ROT[1][0] = -sin_hdg * sin_lat * cos_lon - cos_hdg * sin_lon;
ROT[1][1] = -sin_hdg * sin_lat * sin_lon + cos_hdg * cos_lon;
ROT[1][2] = sin_hdg * cos_lat;
ROT[1][3] = SG_ZERO;
ROT[2][0] = cos_lat * cos_lon;
ROT[2][1] = cos_lat * sin_lon;
ROT[2][2] = sin_lat;
ROT[2][3] = SG_ZERO;
ROT[3][0] = SG_ZERO;
ROT[3][1] = SG_ZERO;
ROT[3][2] = SG_ZERO;
ROT[3][3] = SG_ONE ;
} }