第18.4節(jié) OE3.1實(shí)例-導(dǎo)彈在地球上沿路徑飛行

致謝

感謝網(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)定。其提供的效果圖如下:


image.png

本節(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ā)射架那里打到地面站那里。


image.png

具體實(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軸正東):


image.png

本例中計(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ā)射。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容