• OSG漫游到指定坐标点位置


    OSG中从当前场景位置漫游到指定点坐标位置,osg中场景的视口状态包括如下参数:

    1、视点的位置

    2、参考点的位置,该点通常为场景中的中心轴上的点

    3、视点向上的方向向量

    ( const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up );

    通过这三个参数就可以确定视口中模型的状态位置

    实现的漫游代码如下:

     1 //是否漫游
     2 //视角移动的 效果
     3 void LargeScaleManipulator::setIsTrans(bool b)
     4 {
     5     isTrans = b;
     6 }
     7 void LargeScaleManipulator::setcurrentviewmatrix(osg::Vec3 eye, osg::Vec3 center, osg::Vec3 up)
     8 {
     9     currenteye = eye;
    10     currentcenter = center;
    11     currentup = up;
    12 }
    13 
    14 void LargeScaleManipulator::settargetviewmatrix(osg::Vec3 eye, osg::Vec3 center, osg::Vec3 up)
    15 {
    16     targeteye = eye;
    17     targetcenter = center;
    18     targetup = up;
    19 }
    20 
    21 void LargeScaleManipulator::calintervalviewmatrix()
    22 {
    23     intervalcenter = (targetcenter - currentcenter) / 60;
    24     intervaleye = (targeteye - currenteye) / 60;
    25     intervalup = (targetup - currentup) / 60;
    26 }
    27 
    28 
    29 bool LargeScaleManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
    30 {    
    31     if (ea.getEventType() == osgGA::GUIEventAdapter::FRAME)
    32     {
    33         if (isTrans)
    34         {
    35             if (fabs(intervaleye[0]) < 1e-6 && fabs(intervaleye[1]) < 1e-6)
    36             {
    37                 setTransformation(targeteye, targetcenter, targetup);
    38                 isTrans = false;
    39             }
    40             if (((fabs(currenteye[0] - targeteye[0]) >= fabs(intervaleye[0])) || (fabs(currentcenter[0] - targetcenter[0]) >= fabs(intervalcenter[0])))
    41                 &&((fabs(currenteye[1] - targeteye[1]) >= fabs(intervaleye[1])) || (fabs(currentcenter[1] - targetcenter[1]) >= fabs(intervalcenter[1]))))
    42             {
    43                 if (fabs(currenteye[0] - targeteye[0]) >= fabs(intervaleye[0]))
    44                 {
    45                     currenteye += intervaleye;
    46                 }
    47                 if (fabs(currentcenter[0] - targetcenter[0]) >= fabs(intervalcenter[0]))
    48                 {
    49                     currentcenter += intervalcenter;
    50                 }
    51                 currentup += intervalup;
    52                 setTransformation(currenteye, currentcenter, currentup);
    53             }
    54             else
    55             {
    56                 setTransformation(targeteye, targetcenter, targetup);
    57                 isTrans = false;
    58             }
    59         }
    60     }
    61     return OrbitManipulator::handle(ea, us);
    62 }

    以上就是通过传入一个当前位置状态,然后给定一个目标位置状态,通过设置漫游速度,场景就会一直朝着目标位置变换,也就有了漫游效果

    调用代码如下:

     1   osg::Vec3d target;
     2     target.set(x, y, z);
     3     osg::Vec3d currenteye;
     4     osg::Vec3d currentcenter;
     5     osg::Vec3d currentup;
     6     osg::Vec3d targeteye;
     7     osg::Vec3d targetcenter;
     8     osg::Vec3d targetup;
     9 
    10     m_pOsgView->getCamera()->getViewMatrixAsLookAt(currenteye, currentcenter, currentup);
    11 
    12     targeteye = target + currenteye - currentcenter;
    13     targetcenter = target;
    14     targetup = currentup;
    15 
    16     KeySwitchMatrixManipulator* keyswitchManipulator = dynamic_cast<KeySwitchMatrixManipulator*>(m_pDataManagerSingleton->getViewer()->getCameraManipulator());
    17     if (keyswitchManipulator)
    18     {
    19         keyswitchManipulator->selectMatrixManipulator(0);
    20         LargeScaleManipulator* mp = dynamic_cast<LargeScaleManipulator*>(keyswitchManipulator->getCurrentMatrixManipulator());
    21         if (mp)
    22         {
    23             mp->setcurrentviewmatrix(currenteye, currentcenter, currentup);
    24             mp->settargetviewmatrix(targeteye, targetcenter, targetup);
    25             mp->calintervalviewmatrix();
    26             mp->isTrans = true;
    27         }
    28     }
  • 相关阅读:
    ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor
    vscode中使用node服务调试,会在promise的reject出现断点报错
    koa-router匹配多个路由添加中间件函数
    react-router中的路由钩子使用
    在less中不能正常使用css3的calc属性的解决方法
    react-redux安装失败的问题
    npm脚本命令npm run script的使用
    npx的使用和理解
    babel的命令行工具babel-cli解析
    babel的.babelrc解析
  • 原文地址:https://www.cnblogs.com/marblemm/p/10214754.html
Copyright © 2020-2023  润新知