查看: 166|回复: 2

osgerth模拟飞机在三维地球上飞行的问题

[复制链接]

该用户从未签到

发表于 2021-3-4 17:45:19 | 显示全部楼层 |阅读模式
自己可以在arcgisonline.earth上正常加载cessna.osg模型,然后生成animationPath预设置路径,最后通过AnimationPathCallback回调,但是最终不能显示动画,不知道哪里出了问题,给恳请大神解答下,感激不尽,代码如下,没有报错,只能显示个地球,不见飞机模型

#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include<osg/MatrixTransform>
#include<osgEarth/MapNode>
#include<osg/AnimationPath>
#include<osg/CoordinateSystemNode>


#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/ExampleResources>



//地表矩阵操作器
//当前点转化为绝对世界坐标系    CoordinateSystem坐标系



//设置预飞行路径点(经、维、高、速度)
//将输入的点生成一个AnimationPath路径
osg::AnimationPath *CreatPath(osg::Vec4Array *ctrl)
{

        osg::Matrix TurnMatrix;

        double shuipingAngle;
        double chuizhiAnglle;
        double time = 0;

        //旋转4元素,旋转角度
        osg:uat _rotation;

        //世界坐标系内的两点
        osg::Vec3d positionCur;
        osg::Vec3d positionNext;


        osg::ref_ptr<osg::AnimationPath>animationPath = new osg::AnimationPath;
        //设置是否循环飞行
        animationPath->setLoopMode(osg::AnimationPath::NO_LOOPING);


        //循环读取预设点      迭代器
        for (osg::Vec4Array::iterator iter = ctrl->begin(); iter != ctrl->end(); iter++)
        {

                //iter2为iter的下一个点
                osg::Vec4Array::iterator iter2 = iter;
                iter2++;

                //如果只有两个点,跳出循环
                if (iter2 == ctrl->end())
                        break;

                double x, y, z;


                osg::ref_ptr<osg::CoordinateSystemNode> csn1 = new osg::CoordinateSystemNode;
                csn1->setEllipsoidModel(new osg::EllipsoidModel);
                //把经纬度转换为绝对世界坐标系   csn->获取椭球体模型    latitude纬度  longtitude经度
                csn1->getEllipsoidModel()->convertLatLongHeightToXYZ(osg:egreesToRadians(iter->y()), osg::DegreesToRadians(iter->x()), iter->z(), x, y, z);
                positionCur = osg::Vec3(x, y, z);
                csn1->getEllipsoidModel()->convertLatLongHeightToXYZ(osg::DegreesToRadians(iter2->y()), osg::DegreesToRadians(iter2->x()), iter2->z(), x, y, z);
                positionNext = osg::Vec3(x, y, z);


                //求出水平夹角
                //如果经度相同
                if (iter->x() == iter2->x())
                {
                        //如果两点经度相同,水平夹角为90度
                        shuipingAngle = osg:I_2;
                }
                else
                {
                        //atan(维度/经度)
                        shuipingAngle = atan((iter2->y() - iter->y()) / (iter2->x() - iter->x()));
                        if (iter2->x() > iter->x())
                        {
                                shuipingAngle += osg::PI;
                        }
                }


                //求垂直夹角
                if (iter->z() == iter2->z())
                {
                        chuizhiAnglle = 0;
                }
                else
                {
                        //如果如果两点在同一经维度,只有高度不同时  sqrt[(x2-x2)**2 + (y2-y1)**2 + (z2-z1)**2 - (z2-z1)**2]=0
                        if (0 == sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())) - pow((positionNext.z() - positionCur.z()), 2)))
                        {
                                chuizhiAnglle = osg::PI_2;
                        }
                        //如果经纬度不同
                        else
                        {
                                //垂直角度   atan{(z2-z1) / (sqrt[(x2-x2)**2 + (y2-y1)**2 + (z2-z1)**2 - (z2-z1)**2])}
                                chuizhiAnglle = atan((iter2->z() - iter->z()) / (sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())) - pow((positionNext.z() - positionCur.z()), 2))));
                        }
                        if (chuizhiAnglle >= osg::PI_2)
                        {
                                chuizhiAnglle = osg::PI_2;
                        }
                        if (chuizhiAnglle <= -osg::PI_2)
                        {
                                chuizhiAnglle = -osg::PI_2;
                        }
                }



                //前面求出了第一个点处飞机的朝向,接下来需要求朝向所对应的变换矩阵(TurnMatrix),求出此变换矩阵后,和飞机矩阵相乘,就能形成飞机转向的动作
                //求出飞机世界坐标系在经纬高度坐标系下的值
                csn1->getEllipsoidModel()->computeLocalToWorldTransformFromLatLongHeight(osg::DegreesToRadians(iter->y()), osg::DegreesToRadians(iter->x()), iter->z(), TurnMatrix);
                //飞机转向角          绕x轴 不用转                               绕y轴旋转                            绕z轴旋转
                _rotation.makeRotate(0, osg::Vec3(1.0, 0.0, 0.0), chuizhiAnglle, osg::Vec3(0.0, 1.0, 0.0), shuipingAngle, osg::Vec3(0.0, 0.0, 1.0));
                //把旋转矩阵乘到飞机的变换矩阵上
                TurnMatrix.preMultRotate(_rotation);

                //生成插入点,ControlPoint包含模型位置和朝向     生成第一个点的AnimationPath
                animationPath->insert(time, osg::AnimationPath::ControlPoint(positionCur, TurnMatrix.getRotate()));


                //求下一个点的时间
                double dist = sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())) - pow((positionNext.z() - positionCur.z()), 2));

                //如果速度等于0,飞机到达该点时间无限大
                if (iter2->w() == 0)
                {
                        time += 100000000;
                }
                //如果速度不等于0,飞机到达该点时间等于 距离/速度
                else
                {
                        time += (dist / iter2->w());
            }

        }

        //生成最后一个点的AnimationPath
        animationPath->insert(time, osg::AnimationPath::ControlPoint(positionNext, TurnMatrix.getRotate()));
        return animationPath.release();
}





int main()
{

        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;

        //操作器
        osg::ref_ptr<osgEarth::Util::EarthManipulator> earthManipulator = new osgEarth::Util::EarthManipulator;
        //设置相机操作器
        viewer->setCameraManipulator(earthManipulator);


        osg::ref_ptr<osg::Group> root = new osg::Group;
        osg::ref_ptr<osg::Node> earth = osgDB::readNodeFile("arcgisonline.earth");
        root->addChild(earth);

        //设置现场数据
        viewer->setSceneData(root.get());
        //实现
        viewer->realize();


        osg::ref_ptr<osg::Node> plane = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);

        osg::Matrix matrix;       
        osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
        mt->addChild(plane);


        osg::ref_ptr<osg::MatrixTransform> mtfly = new osg::MatrixTransform;
        osg::ref_ptr<osg::CoordinateSystemNode> csn = new osg::CoordinateSystemNode;
        csn->setEllipsoidModel(new osg::EllipsoidModel);
        csn->getEllipsoidModel()->computeLocalToWorldTransformFromLatLongHeight(osg::DegreesToRadians(40.0), osg::DegreesToRadians(116.0), 650000, matrix);
        matrix.preMult(osg::Matrix::scale(9000, 9000, 9000));

        mtfly->setMatrix(matrix);
        mtfly->addChild(mt);
        root->addChild(mtfly);
;
    //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp = new osg::Vec4Array;
        vatemp->push_back(osg::Vec4(116.0, 40.0, 650000.0, 50000));
        vatemp->push_back(osg::Vec4(116.0, 50.0, 100000.0, 8000));
        vatemp->push_back(osg::Vec4(116.0, 60.0, 500000.0, 500));

        osg::AnimationPath *ap = new osg::AnimationPath;
        ap = CreatPath(vatemp);
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
     mtfly->setUpdateCallback(new osg::AnimationPathCallback(ap, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0


         mtfly->addChild(plane);
         root->addChild(mtfly);
    //将视点移动到飞机处
        earthManipulator->setViewpoint(osgEarth::Viewpoint("模拟无人机", 116, 40, 0.0, 0.0, -90.0, 1e7));//const char* name, double lon, double lat, double z, double heading, double pitch, double range
        //设置跟踪节点
        //earthManipulator->setTetherNode(plane);
        viewer->setSceneData(root);
        return viewer->run();
}

该用户从未签到

 楼主| 发表于 2021-3-4 17:46:52 | 显示全部楼层
为感谢帮忙的大神,可以有偿回答问题

该用户从未签到

 楼主| 发表于 2021-3-30 19:56:18 | 显示全部楼层
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include<osg/MatrixTransform>
#include<osgEarth/MapNode>
#include<osg/AnimationPath>
#include<osg/CoordinateSystemNode>
#include <osg/PositionAttitudeTransform>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/ExampleResources>
//键盘事件
#include<osgViewer/ViewerEventHandlers>
//osgGA相关的库
#include<osgGA/StateSetManipulator>
#include<osgGA/TrackballManipulator>
#include<osgGA/FlightManipulator>
#include<osgGA/DriveManipulator>
#include<osgGA/KeySwitchMatrixManipulator>
#include<osgGA/AnimationPathManipulator>
#include<osgGA/TerrainManipulator>//地形



//设置预飞行路径点(经、维、高、速度)
//将输入的点生成一个AnimationPath路径
osg::AnimationPath *CreatPath(osg::Vec4Array *ctrl)
{

        osg::Matrix TurnMatrix;
        double shuipingAngle;
        double chuizhiAnglle;
        double time = 0;

        double jing, wei, gao;

        //旋转4元素,旋转角度
        osg:uat _rotation;

        //世界坐标系内的两点
        osg::Vec3d positionCur;
        osg::Vec3d positionNext;


        osg::ref_ptr<osg::AnimationPath>animationPath = new osg::AnimationPath;
        //设置是否循环飞行
        animationPath->setLoopMode(osg::AnimationPath:OOP);


        //循环读取预设点      迭代器
        for (osg::Vec4Array::iterator iter = ctrl->begin(); iter != ctrl->end(); iter++)
        {

                //iter2为iter的下一个点
                osg::Vec4Array::iterator iter2 = iter;
                iter2++;

                //如果只有两个点,跳出循环
                if (iter2 == ctrl->end())
                        break;

                double x, y, z;


                osg::ref_ptr<osg::CoordinateSystemNode> csn1 = new osg::CoordinateSystemNode;
                csn1->setEllipsoidModel(new osg::EllipsoidModel);
                //把经纬度转换为绝对世界坐标系   csn->获取椭球体模型    latitude纬度  longtitude经度
                csn1->getEllipsoidModel()->convertLatLongHeightToXYZ(osg:egreesToRadians(iter->y()), osg::DegreesToRadians(iter->x()), iter->z(), x, y, z);
                positionCur = osg::Vec3(x, y, z);
                csn1->getEllipsoidModel()->convertXYZToLatLongHeight(x, y, z, wei, jing, gao);
                //std::cout << "jingweigao=" << osg::RadiansToDegrees(jing) <<"  "<<osg::RadiansToDegrees( wei)<<"    " << gao << std::endl;

                //std::cout << "x1="<<x << " y1="<<y <<" z1="<< z <<" 纬度iter->y="<<iter->y()<<" 经度x()"<<iter->x()<< std::endl;
                csn1->getEllipsoidModel()->convertLatLongHeightToXYZ(osg::DegreesToRadians(iter2->y()), osg::DegreesToRadians(iter2->x()), iter2->z(), x, y, z);
                positionNext = osg::Vec3(x, y, z);
                //std::cout << "x2=" << x << " y2=" << y << " z2=" << z <<" 纬度iter2->y="<<iter2->y()<<" 经度x()"<<iter2->x()<< std::endl;


                //求出水平夹角
                //如果经度相同
                if (iter->x() == iter2->x())
                {
                        //如果两点经度相同,水平夹角为90度
                        shuipingAngle = osg:I_2;
                }
                else
                {
                        //atan(维度/经度)
                        shuipingAngle = atan((iter2->y() - iter->y()) / (iter2->x() - iter->x()));
                        if (iter2->x() > iter->x())
                        {
                                shuipingAngle += osg::PI;
                        }
                }


                //求垂直夹角
                if (iter->z() == iter2->z())
                {
                        chuizhiAnglle = 0;
                }
                else
                {
                        //如果如果两点在同一经维度,只有高度不同时  sqrt[(x2-x2)**2 + (y2-y1)**2 + (z2-z1)**2 - (z2-z1)**2]=0
                        if (0 == sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())) - pow((positionNext.z() - positionCur.z()), 2)))
                        {
                                chuizhiAnglle = osg::PI_2;
                        }
                        //如果经纬度不同
                        else
                        {
                                //                 垂直高度/底边
                                //垂直角度   atan{(z2-z1) / (sqrt[(x2-x2)**2 + (y2-y1)**2 + (z2-z1)**2 - (z2-z1)**2])}
                                chuizhiAnglle = atan((iter2->z() - iter->z()) / (sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())) - pow((positionNext.z() - positionCur.z()), 2))));
                        }
                        if (chuizhiAnglle >= osg::PI_2)
                        {
                                chuizhiAnglle = osg::PI_2;
                        }
                        if (chuizhiAnglle <= -osg::PI_2)
                        {
                                chuizhiAnglle = -osg::PI_2;
                        }
                }

                //1弧度=57.3°
                //std::cout << "shuiping=" << osg::RadiansToDegrees(shuipingAngle)<< "   chuizhi=" << osg::RadiansToDegrees(chuizhiAnglle)<< std::endl;
                //前面求出了第一个点处飞机的朝向,接下来需要求朝向所对应的变换矩阵(TurnMatrix),求出此变换矩阵后,和飞机矩阵相乘,就能形成飞机转向的动作
                //求出飞机世界坐标系在经纬高度坐标系下的值
                csn1->getEllipsoidModel()->computeLocalToWorldTransformFromLatLongHeight(osg::DegreesToRadians(iter->y()), osg::DegreesToRadians(iter->x()), iter->z(), TurnMatrix);
                //飞机转向角          绕x轴 不用转                               绕y轴旋转                            绕z轴旋转
                _rotation.makeRotate(0, osg::Vec3(1.0, 0.0, 0.0), chuizhiAnglle, osg::Vec3(0.0, 1.0, 0.0), shuipingAngle, osg::Vec3(0.0, 0.0, 1.0));
                //把旋转矩阵乘到飞机的变换矩阵上
                TurnMatrix.preMultRotate(_rotation);

                //生成插入点,ControlPoint包含模型位置和朝向     生成第一个点的AnimationPath
                animationPath->insert(time, osg::AnimationPath::ControlPoint(positionCur, TurnMatrix.getRotate()));


                //求下一个点的时间
                //      斜边长度=sqrt[(x2-x2)**2 + (y2-y1)**2 + (z2-z1)**2]
                double dist = sqrt(((positionNext.x() - positionCur.x())* (positionNext.x() - positionCur.x()) + (positionNext.y() - positionCur.y())*(positionNext.y() - positionCur.y()) + (positionNext.z() - positionCur.z())*(positionNext.z() - positionCur.z())));
                //std::cout << "距离=" << dist << std::endl;
                //如果速度等于0,飞机到达该点时间无限大
                if (iter2->w() == 0)
                {
                        time += 100000000;
                }
                //如果速度不等于0,飞机到达该点时间等于 距离/速度
                else
                {
                        time += (dist / iter2->w());
                }

        }

        //生成最后一个点的AnimationPath
        animationPath->insert(time, osg::AnimationPath::ControlPoint(positionNext, TurnMatrix.getRotate()));
        //std::cout << "时间=" << time << std::endl;
        return animationPath.release();
}



int main()
{

        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        //操作器
        osg::ref_ptr<osgEarth::Util::EarthManipulator> earthManipulator = new osgEarth::Util::EarthManipulator;
        //设置相机操作器
        viewer->setCameraManipulator(earthManipulator);

        //添加状态事件,可以相应键盘和鼠标事件,响应L
        viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
        //窗口大小变化,响应F
        viewer->addEventHandler(new osgViewer::WindowSizeHandler);
        //添加路径记录 Z
        viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
        //帮助文档显示H
        viewer->addEventHandler(new osgViewer::HelpHandler);
        //截屏 C
        viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
        //视角追踪
        viewer->addEventHandler(new osgViewer::ThreadingHandler);
        //添加一些常用状态设置,响应W,S
        viewer->addEventHandler(new osgViewer::StatsHandler);
        /**
        //添加一些操作器
        {
                osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> ksm = new osgGA::KeySwitchMatrixManipulator;
                ksm->addMatrixManipulator('1',"Trackball",new osgGA::TrackballManipulator());
                ksm->addMatrixManipulator('2',"Flight",new osgGA::FlightManipulator());
                ksm->addMatrixManipulator('3',"Drive",new osgGA::DriveManipulator());
                ksm->addMatrixManipulator('4',"Terrain",new osgGA::TerrainManipulator());
                viewer->setCameraManipulator(ksm.get());
        }
        */

        osg::ref_ptr<osg::Group> root = new osg::Group;
        osg::ref_ptr<osg::Node> earth = osgDB::readNodeFile("./clear.earth");
        root->addChild(earth);
        //设置现场数据
        viewer->setSceneData(root.get());
        //实现
        viewer->realize();

        //模型1
        osg::ref_ptr<osg::Node> plane = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix;
        osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
        mt->addChild(plane);
        osg::ref_ptr<osg::MatrixTransform> mtfly = new osg::MatrixTransform;
        matrix.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly->setMatrix(matrix);
        mtfly->addChild(mt);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp = new osg::Vec4Array;
        vatemp->push_back(osg::Vec4(116.0, 39.0, 60.0, 71.0));
        vatemp->push_back(osg::Vec4(116.0, 39.07, 50.0, 61.0));
        vatemp->push_back(osg::Vec4(116.0 ,39.17, 55.0, 52.0));
        vatemp->push_back(osg::Vec4(115.98, 59.01, 60.0, 11.0));
        vatemp->push_back(osg::Vec4(116.0, 59.0, 60.0, 11.0));
        osg::AnimationPath *ap = new osg::AnimationPath;
        ap = CreatPath(vatemp);
        osg::PositionAttitudeTransform* fly = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly->addChild(mtfly);
        fly->setUpdateCallback(new osg::AnimationPathCallback(ap, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        root->addChild(fly);

        /**
        //模型二
        osg::ref_ptr<osg::Node> plane2 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane2->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix2;
        osg::ref_ptr<osg::MatrixTransform> mt2 = new osg::MatrixTransform;
        mt2->addChild(plane2);
        osg::ref_ptr<osg::MatrixTransform> mtfly2 = new osg::MatrixTransform;
        matrix2.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly2->setMatrix(matrix2);
        mtfly2->addChild(mt2);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp2 = new osg::Vec4Array;
        vatemp2->push_back(osg::Vec4(116.002, 38.999, 60.0, 71.0));
        vatemp2->push_back(osg::Vec4(116.002, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap2 = new osg::AnimationPath;
        ap2 = CreatPath(vatemp2);
        osg::PositionAttitudeTransform* fly2 = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly2->setUpdateCallback(new osg::AnimationPathCallback(ap2, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly2->addChild(mtfly2);
        root->addChild(fly2);



        //模型三
        osg::ref_ptr<osg::Node> plane3 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane3->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix3;
        osg::ref_ptr<osg::MatrixTransform> mt3 = new osg::MatrixTransform;
        mt3->addChild(plane3);
        osg::ref_ptr<osg::MatrixTransform> mtfly3 = new osg::MatrixTransform;
        matrix3.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly3->setMatrix(matrix3);
        mtfly3->addChild(mt3);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp3 = new osg::Vec4Array;
        vatemp3->push_back(osg::Vec4(115.998, 38.999, 60.0, 71.0));
        vatemp3->push_back(osg::Vec4(115.998, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap3 = new osg::AnimationPath;
        ap3 = CreatPath(vatemp3);
        osg::PositionAttitudeTransform* fly3 = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly3->setUpdateCallback(new osg::AnimationPathCallback(ap3, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly3->addChild(mtfly3);
        root->addChild(fly3);




        //模型四
        osg::ref_ptr<osg::Node> plane4 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane4->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix4;
        osg::ref_ptr<osg::MatrixTransform> mt4 = new osg::MatrixTransform;
        mt4->addChild(plane4);
        osg::ref_ptr<osg::MatrixTransform> mtfly4 = new osg::MatrixTransform;
        osg::ref_ptr<osg::CoordinateSystemNode> csn4 = new osg::CoordinateSystemNode;
        matrix4.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly4->setMatrix(matrix4);
        mtfly4->addChild(mt4);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp4 = new osg::Vec4Array;
        vatemp4->push_back(osg::Vec4(115.996, 38.998, 60.0, 71.0));
        vatemp4->push_back(osg::Vec4(115.996, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap4 = new osg::AnimationPath;
        ap4 = CreatPath(vatemp4);
        osg::PositionAttitudeTransform* fly4 = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly4->setUpdateCallback(new osg::AnimationPathCallback(ap4, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly4->addChild(mtfly4);
        root->addChild(fly4);


        //模型五
        osg::ref_ptr<osg::Node> plane5 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane5->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix5;
        osg::ref_ptr<osg::MatrixTransform> mt5 = new osg::MatrixTransform;
        mt5->addChild(plane5);
        osg::ref_ptr<osg::MatrixTransform> mtfly5 = new osg::MatrixTransform;
        matrix5.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly5->setMatrix(matrix5);
        mtfly5->addChild(mt5);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp5 = new osg::Vec4Array;
        vatemp5->push_back(osg::Vec4(116.004, 38.998, 60.0, 71.0));
        vatemp5->push_back(osg::Vec4(116.004, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap5 = new osg::AnimationPath;
        ap5 = CreatPath(vatemp5);
        osg::PositionAttitudeTransform* fly5 = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly5->setUpdateCallback(new osg::AnimationPathCallback(ap5, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly5->addChild(mtfly5);
        root->addChild(fly5);



        //模型六
        osg::ref_ptr<osg::Node> plane6 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane6->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix6;
        osg::ref_ptr<osg::MatrixTransform> mt6 = new osg::MatrixTransform;
        mt6->addChild(plane6);
        osg::ref_ptr<osg::MatrixTransform> mtfly6 = new osg::MatrixTransform;
        matrix6.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly6->setMatrix(matrix6);
        mtfly6->addChild(mt6);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp6 = new osg::Vec4Array;
        vatemp6->push_back(osg::Vec4(115.994, 38.997, 60.0, 71.0));
        vatemp6->push_back(osg::Vec4(115.994, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap6 = new osg::AnimationPath;
        ap6 = CreatPath(vatemp6);
        osg::PositionAttitudeTransform* fly6 = new osg::PositionAttitudeTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly6->setUpdateCallback(new osg::AnimationPathCallback(ap6, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly6->addChild(mtfly6);
        root->addChild(fly6);


        //模型7
        osg::ref_ptr<osg::Node> plane7 = osgDB::readNodeFile("cessna.osg");
        //没有这句代码,飞机是黑色的
        plane7->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
        osg::Matrix matrix7;
        osg::ref_ptr<osg::MatrixTransform> mt7 = new osg::MatrixTransform;
        mt7->addChild(plane7);
        osg::ref_ptr<osg::MatrixTransform> mtfly7 = new osg::MatrixTransform;
        matrix7.preMult(osg::Matrix::scale(2, 2, 2)*osg::Matrix::rotate(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)));
        mtfly7->setMatrix(matrix7);
        mtfly7->addChild(mt7);
        //飞机飞行路径
        osg::ref_ptr<osg::Vec4Array> vatemp7 = new osg::Vec4Array;
        vatemp7->push_back(osg::Vec4(116.006, 38.997, 60.0, 71.0));
        vatemp7->push_back(osg::Vec4(116.006, 39.07, 50.0, 61.0));
        osg::AnimationPath *ap7 = new osg::AnimationPath;
        ap7 = CreatPath(vatemp7);
        //osg::PositionAttitudeTransform* fly7 = new osg::PositionAttitudeTransform;
        osg::MatrixTransform *fly7 = new osg::MatrixTransform;
        //AnimationPathCallback可以直接附加到将节点转换为在场景中移动子图
        fly7->setUpdateCallback(new osg::AnimationPathCallback(ap7, 0.0, 1.0));  //AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0
        fly7->addChild(mtfly7);
        root->addChild(fly7);
        */



        //将视点移动到飞机处   pitch俯仰角  yaw偏航角   roll横滚角
        earthManipulator->setViewpoint(osgEarth::Viewpoint("模拟无人机", 116.0, 39.0, 0.0, 0.0, -30.0, 5e2));//const char* name, double lon, double lat, double z, double heading(水平角度), double pitch(垂直角度), double range(视点距离)
        //设置跟踪节点
        //earthManipulator->setTetherNode(mtfly);
        viewer->setSceneData(root);
        //return viewer->run();
        while (!viewer->done())
        {
                viewer->frame();
        }
        return 0;
}



已经解决,代码如上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表