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. KT_登录_流程图

    一.需求 关于系统登录功能,需求如下:1.登录需要输入用户名.密码2.如果连续密码输入错误4次,则自动锁定账号5分钟(也就是说5分钟之内不能再登录) 请根据以上需求,画一个登录操作流程图 二.绘图 版 ...

  2. 关于打开现有项目时数据库连接配置遇到的问题 连接字符串中的数据源值指定未安装的SQL Server的实例。要解决此问题,可选择安装匹配的SQL Server实例或修改连接字符串中的数据源值

    最近在看红皮书<ASP.NET MVC 5 高级编程>时,为了更好理解,边看书,边打开源代码查看,在VS(Visual Studio 2015)中将源代码打开,发现数据库连接是关闭的,本想 ...

  3. iOS开发中常用的数学函数

    iOS开发中常用的数学函数 /*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(,)); //result 9 NSLog(,)); //result 27 //开平方 ...

  4. 使用MVC Razor生成格式良好的HTML Body作为邮件内容

    PS: 实例化邮件类MailMessage有一个属性IsBodyHtml指示邮件正文是否是HTML格式. 我想利用Razor View的Model Binding / Rendering功能为我从AS ...

  5. zabbix之自动发现Tomcat多实例(第一种:已经部署完成,后续不再添加;第二种:后续或根据需要添加Tomcat实例)

    单一实例手动部署:https://www.cnblogs.com/huangyanqi/p/8522526.html 注释:参考的一位博主的博客后续做的修改,那个博主的网址找不到了!!!! 背景: 1 ...

  6. ASP.NET MVC 4 RC的JS/CSS打包压缩功能

    打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...

  7. map filter 的func 放在前面

    map    filter      的func 放在前面 sorted 在后 (    iter..  ,       key=function')

  8. lambda表达式和groovy闭包的区别

    groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许

  9. 【AT987】高橋君

    题目 成爷爷一眼秒,\(tql!!!\) 多组询问,求 \[\sum_{i=0}^kC_{n}^i \] 发现\(k<=n\)啊,于是我们可以把一组询问抽象成一个区间\([k,n]\) 左指针的 ...

  10. 多线程之Thread类

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...