致谢
感谢网友提出这个问题。大家有问题也可以在评论区提出,有问必有答。如果涉及商业需求,需要较完整/详尽的工程,可以联系作者133-2459-8743。
问题描述
网友提出要做一个基于osgearth的导弹按轨迹飞行的程序,并放置一些地面站。我准备基于最新的oe版本3.1,分几个步骤把这个功能给做出来。节号命名为18.1, 18.2以示连贯。oe当前最新版本是3.1,说老实话不是很稳定。其提供的效果图如下:
本节资源
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:
本节功能
本节就一个功能,加载一个导弹,让其在上一节的基础上,从发射架那里打到地面站那里。
具体实现
这里我们输入的是一连串的经纬高,组成导弹的路径。然后生成一个animationPath就可以了。第10节 实例-双击跑过去操作器 在这一节也用了animationPath,animationPath最关键的参数是位置、朝向,位置好说,关键点就是位置。关键在朝向。有了位置、朝向、时间直接就可以生成animationPath。
要计算导弹在一个点的朝向确非易事,要先搞明白一件事情:就是导弹在建模时有个方向,这是导弹的局部坐标。将其放在地球上是使用的这样的方法:
osg::MatrixTransform* mt = new osg::MatrixTransform;
mt->addChild(LodAutoMode(fileName, radioSize));
osg::Matrixd mts;
_em->computeLocalToWorldTransformFromLatLongHeight(osg::inDegrees(LLH.y()), osg::inDegrees(LLH.x()), LLH.z(), mts);
mt->setMatrix(mts);
我们要知道mts这个矩阵,将物体从世界坐标系的(0,0,0)给移到地表,除了改变了位置以外,还改变了朝向。这个要想象一下,假如平移则放在地表的角度是不对的。拿坐标轴来比一下,在世界坐标下这个轴是这样的(Y轴正北,Z轴从地心连,X轴正东):
本例中计算朝向使用了一个函数叫做:void GetFlyPosture(osg::Vec3d First, osg::Vec3d Second, double& PitchAngle, double& yAngleHengGun, double& YawAngle)
给定起点、终点,然后计算出导弹的俯仰角、横滚角、航向角。这里详细的判断了起点和终点的经纬高之间的关系,读者可以看一下理解一下,比如经纬度没有变,只高度变化,则就是顺着地表垂直向上发射。
暂无评论内容