致謝
感謝網(wǎng)友提出這個(gè)問(wèn)題。大家有問(wèn)題也可以在評(píng)論區(qū)提出,有問(wèn)必有答。如果涉及商業(yè)需求,需要較完整/詳盡的工程,可以聯(lián)系作者133-2459-8743。
問(wèn)題描述
網(wǎng)友提出要做一個(gè)基于osgearth的導(dǎo)彈按軌跡飛行的程序,并放置一些地面站。我準(zhǔn)備基于最新的oe版本3.1,分幾個(gè)步驟把這個(gè)功能給做出來(lái)。節(jié)號(hào)命名為18.1, 18.2以示連貫。oe當(dāng)前最新版本是3.1,說(shuō)老實(shí)話不是很穩(wěn)定。其提供的效果圖如下:

本節(jié)資源
本文集包括本節(jié)所有資源包括模型代碼都在此下載,按節(jié)的序號(hào)有文件或文件夾:
注意:務(wù)必使用瀏覽器打開(kāi):
鏈接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取碼:xrf5
本節(jié)功能
本節(jié)就一個(gè)功能,加載一個(gè)導(dǎo)彈,讓其在上一節(jié)的基礎(chǔ)上,從發(fā)射架那里打到地面站那里。

具體實(shí)現(xiàn)
這里我們輸入的是一連串的經(jīng)緯高,組成導(dǎo)彈的路徑。然后生成一個(gè)animationPath就可以了。第10節(jié) 實(shí)例-雙擊跑過(guò)去操作器 在這一節(jié)也用了animationPath,animationPath最關(guān)鍵的參數(shù)是位置、朝向,位置好說(shuō),關(guān)鍵點(diǎn)就是位置。關(guān)鍵在朝向。有了位置、朝向、時(shí)間直接就可以生成animationPath。
要計(jì)算導(dǎo)彈在一個(gè)點(diǎn)的朝向確非易事,要先搞明白一件事情:就是導(dǎo)彈在建模時(shí)有個(gè)方向,這是導(dǎo)彈的局部坐標(biāo)。將其放在地球上是使用的這樣的方法:
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);
我們要知道m(xù)ts這個(gè)矩陣,將物體從世界坐標(biāo)系的(0,0,0)給移到地表,除了改變了位置以外,還改變了朝向。這個(gè)要想象一下,假如平移則放在地表的角度是不對(duì)的。拿坐標(biāo)軸來(lái)比一下,在世界坐標(biāo)下這個(gè)軸是這樣的(Y軸正北,Z軸從地心連,X軸正東):

本例中計(jì)算朝向使用了一個(gè)函數(shù)叫做:void GetFlyPosture(osg::Vec3d First, osg::Vec3d Second, double& PitchAngle, double& yAngleHengGun, double& YawAngle)
給定起點(diǎn)、終點(diǎn),然后計(jì)算出導(dǎo)彈的俯仰角、橫滾角、航向角。這里詳細(xì)的判斷了起點(diǎn)和終點(diǎn)的經(jīng)緯高之間的關(guān)系,讀者可以看一下理解一下,比如經(jīng)緯度沒(méi)有變,只高度變化,則就是順著地表垂直向上發(fā)射。