解决问题:规划好飞行路径后,在路径拐弯处如何调整飞机的飞行姿态,使其沿路径飞行 包括俯仰角 偏航角的调整
//使用投影法计算需要旋转的角度
图中world1为 路径起始点位 world2为路径下一个点位 需要计算world1-world2路径飞机需要变换的角度
参数 vec_x为当前经纬度高度对应变换后的x轴 vec_y vec_z同为变换后坐标轴
变换后z轴是平行于地面平面的法向量 point_src 为world1 point_dest为world2
int FlyMode::compute_rotate_by_projection(osg::Vec3 vec_x, osg::Vec3 vec_y, osg::Vec3 nor, osg::Vec3 point_src, osg::Vec3 point_dest)
{
//draw_line(point_src, nor);
//draw_line(point_src, vec_y);
//draw_line(point_src, vec_x);
nor.normalize();//法线 n(A,B,C)
//A(x-x0)+B(y-y0) + C(z-z0) = 0
//Ax + By +Cz + D = 0; 平面方程
double A = nor.x();
double B = nor.y();
double C = nor.z();
double D = -A * point_src.x() - B * point_src.y() - C * point_src.z();
//projection 投影
osg::Vec3 pro_point;
double A_2 = A * A;
double B_2 = B * B;
double C_2 = C * C;
double A_B_C_2 = A_2 + B_2 + C_2;
if (A_B_C_2 <= 0.000001) return -1;
pro_point.x() = ((B_2 + C_2)*point_dest.x() - A * (B*point_dest.y() + C * point_dest.z() + D)) / A_B_C_2;
pro_point.y() = ((A_2 + C_2)*point_dest.y() - B * (A*point_dest.x() + C * point_dest.z() + D)) / A_B_C_2;
pro_point.z() = ((A_2 + B_2)*point_dest.z() - C * (A*point_dest.x() + B * point_dest.y() + D)