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

1、视点的位置

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

3、视点向上的方向向量

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

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

实现的漫游代码如下:

 //是否漫游
//视角移动的 效果
void LargeScaleManipulator::setIsTrans(bool b)
{
isTrans = b;
}
void LargeScaleManipulator::setcurrentviewmatrix(osg::Vec3 eye, osg::Vec3 center, osg::Vec3 up)
{
currenteye = eye;
currentcenter = center;
currentup = up;
} void LargeScaleManipulator::settargetviewmatrix(osg::Vec3 eye, osg::Vec3 center, osg::Vec3 up)
{
targeteye = eye;
targetcenter = center;
targetup = up;
} void LargeScaleManipulator::calintervalviewmatrix()
{
intervalcenter = (targetcenter - currentcenter) / ;
intervaleye = (targeteye - currenteye) / ;
intervalup = (targetup - currentup) / ;
} bool LargeScaleManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
{
if (ea.getEventType() == osgGA::GUIEventAdapter::FRAME)
{
if (isTrans)
{
if (fabs(intervaleye[]) < 1e- && fabs(intervaleye[]) < 1e-)
{
setTransformation(targeteye, targetcenter, targetup);
isTrans = false;
}
if (((fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[])) || (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[])))
&&((fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[])) || (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[]))))
{
if (fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[]))
{
currenteye += intervaleye;
}
if (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[]))
{
currentcenter += intervalcenter;
}
currentup += intervalup;
setTransformation(currenteye, currentcenter, currentup);
}
else
{
setTransformation(targeteye, targetcenter, targetup);
isTrans = false;
}
}
}
return OrbitManipulator::handle(ea, us);
}

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

调用代码如下:

   osg::Vec3d target;
target.set(x, y, z);
osg::Vec3d currenteye;
osg::Vec3d currentcenter;
osg::Vec3d currentup;
osg::Vec3d targeteye;
osg::Vec3d targetcenter;
osg::Vec3d targetup; m_pOsgView->getCamera()->getViewMatrixAsLookAt(currenteye, currentcenter, currentup); targeteye = target + currenteye - currentcenter;
targetcenter = target;
targetup = currentup; KeySwitchMatrixManipulator* keyswitchManipulator = dynamic_cast<KeySwitchMatrixManipulator*>(m_pDataManagerSingleton->getViewer()->getCameraManipulator());
if (keyswitchManipulator)
{
keyswitchManipulator->selectMatrixManipulator();
LargeScaleManipulator* mp = dynamic_cast<LargeScaleManipulator*>(keyswitchManipulator->getCurrentMatrixManipulator());
if (mp)
{
mp->setcurrentviewmatrix(currenteye, currentcenter, currentup);
mp->settargetviewmatrix(targeteye, targetcenter, targetup);
mp->calintervalviewmatrix();
mp->isTrans = true;
}
}

OSG漫游到指定坐标点位置的更多相关文章

  1. vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏

    vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏,支持每个网页用不同的IP登陆,支持多线程自动点击 适合自动打怪,游戏练级,配合自动识图功能,自动验证码技术,可以实现更多功能. ...

  2. C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息

    原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...

  3. .NET指定程序集的位置

    有两种方法用来指定程序集的位置: 使用 <codeBase> 元素. 使用 <probing> 元素. 还可以使用 .NET Framework 配置工具 (Mscorcfg. ...

  4. vscode指定扩展安装位置

    默认情况下,(Windows)vscode的安装路径为C:\Users\用户名\.vscode\extensions. 如果想要自定义扩展的安装路径,无法直接在vscode中修改.但是,在启动vsco ...

  5. iOS-UIView一些坐标和位置方法封装

    新建基于UIView扩展类 UIView+wkjFrame,此类是为了方便获取一些基于UIView类UI控件的坐标和位置的简化,直接引用即可 UIView+wkjFrame.h - (CGPoint) ...

  6. 【android】模拟点击某个指定坐标作用在View上

    /** * 模拟点击某个指定坐标作用在View上 * @param view * @param x * @param y */ public void clickView(View view,floa ...

  7. 关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置

    1.cocos2d-X中的坐标(0,0),就是运行框的左下角位置,所以运行框看起来就是一个第一象限. 2.节点的锚点就是我们setPosition所设定的位置,默认锚点是在节点的中心,也就是setPo ...

  8. 使用Hbuilder开发IOS应用上架审核提示请指定用户在位置许可模式警报中使用位置的预定用途。

    使用Hbuilder开发IOS应用时,遇到上架App被拒的问题,被拒原因: 你的应用程序使用位置服务,但并没有按照iOS人机界面指南中的要求,在位置模式警报中阐明它的用途. 要解决此问题,请指定用户在 ...

  9. WPF中获取指定坐标依赖对象数据项

    上图中红色框区域是一个自定义的ListBox控件,需要实现的功能是,点击红框区域中某项时,获取当前选中项的数据项 控件的MouseDown事件部分代码为: var x = TreeHelper.Fin ...

随机推荐

  1. linux下postgresql的安装与卸载

    安装: sudo apt-get update sudo apt-get install postgresql 启动: sudo /etc/init.d/postgresql start 查看是否启动 ...

  2. jQuery1.7版本之后的on方法

    之前就一直受这个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于 live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动 ...

  3. sonarQube环境搭建--常见问题及解决

    环境配置:MySQL Server 5.7     Jdk1.8 1.安装mysql数据库(默认安装一路默认到底,注意不要先新建用户账号) a) Mysql 环境变量配置: b)新增my.ini文件: ...

  4. Civil War

    Civil War 编辑 <Civil War>是美国硬摇滚乐队枪炮与玫瑰的一首单曲,首次收录于1990年的群星慈善专辑<Nobody's Child: Romanian Angel ...

  5. 题解 P1868 【饥饿的奶牛】

    题目链接:P1868 饥饿的奶牛 题面 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧 ...

  6. 用python解析word文件(一):paragraph

    太长了,我决定还是拆开三篇写.   (一)段落篇(paragraph)(本篇) (二)表格篇(table) (三)样式篇(style) 选你所需即可.下面开始正文. 最近公司的项目,需要在页面上显示w ...

  7. cocos2d-x发生undefined reference to `XX'异常 一劳永逸解决的方法

    转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 ...

  8. asp.net Web API简单的特性路由配置

    一,控制器代码: [RoutePrefix("ajilisiwei")]  //加URL前缀 (非必需)    public class ShoppingController : ...

  9. [AHOI2005]矿藏编码

    嘟嘟嘟 这道题题面我是看了小半天才懂(太菜了),然后就发现好水啊. 只要维护一个栈,存的是t,代表当前的正方形是2t * 2t的,然后从头开始扫序列,如果遇到2,就把栈顶元素取出来,然后放进去四个t ...

  10. App-IOS与Android弱网环境测试

    弱网环境下App的功能是否正常使用,是否会发生Crash的等情况? 1.IOS ios系统一般自带弱网环境测试,可以通过设置各种网络环境,模拟弱网环境,如3G,wifi,very bad Networ ...