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. 使用uwsgi发布项目

    1.先下载 uwsgi 指定豆瓣源下载 pip install -i https://pypi.douban.com/simple uwsgi 2.查看你的uwsgi基于那个python解释器运行的 ...

  2. ARC下block使用情况

    ARC与MRC的block有着一些区别,笔记整理ARC的block,仅仅是自己参考的笔记,详情请参考 http://www.cnbluebox.com/?p=255 在开始之前,请新建一个Model类 ...

  3. 设计多选一按钮ChooseOnlyButton

    设计多选一按钮ChooseOnlyButton 效果: 源码: ChooseOnlyButton.h 与 ChooseOnlyButton.m // // ChooseOnlyButton.h // ...

  4. [翻译] AFSoundManager

    AFSoundManager iOS audio playing (both local and streaming) and recording made easy through a comple ...

  5. Linux head/tail命令详解

    head命令用于显示文件的开头的内容.在默认情况下,head命令显示文件的头10行内容. tail命令用于显示文件的结尾的内容.在默认情况下,taild命令显示文件的后10行内容. head常见命令参 ...

  6. Spring @Autowired注解在非Controller/Service中注入为null

    参考:https://blog.csdn.net/qq_35056292/article/details/78430777 问题出现: 在一个非controller/service类中,我需要注入Co ...

  7. python第二十一课——str中的常用函数(重要)

    演示str中常用的一些函数: 1.join():将容器对象以某种特定的格式(字符串)进行拼接组合,最后以字符串的形式返回 lt=['i','love','you','very','much'] str ...

  8. 2879. [NOI2012]美食节【费用流】

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  9. mongodb的学习-6-命令简单使用

    1.创建数据库 use DATABASE_NAME 举例说明: > use another //创建了数据库another switched to db another > db anot ...

  10. pagination分页(支持首页,末页,跳转)

    最近在用jq做分页,大致的效果如下: jquery.pagination.js插件说明 用法如下: 1.引入jq.jquery.pagination.js.pagination.css 2.在页面上写 ...