OSGEARTH 路径飞行姿态调整

该博客探讨了在OSGEARTH环境下,如何在飞行路径的转弯处调整飞机的俯仰角和偏航角,确保沿规划路径平滑飞行。通过投影法计算所需旋转角度,实现从起点world1到下一目标点world2的平滑过渡。内容包括创建动画路径和设置飞机变换矩阵的技巧。
摘要由CSDN通过智能技术生成

飞机路径飞行示意图
解决问题:规划好飞行路径后,在路径拐弯处如何调整飞机的飞行姿态,使其沿路径飞行 包括俯仰角 偏航角的调整

//使用投影法计算需要旋转的角度
在这里插入图片描述
图中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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值