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) / ;
  24. intervaleye = (targeteye - currenteye) / ;
  25. intervalup = (targetup - currentup) / ;
  26. }
  27.  
  28. bool LargeScaleManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
  29. {
  30. if (ea.getEventType() == osgGA::GUIEventAdapter::FRAME)
  31. {
  32. if (isTrans)
  33. {
  34. if (fabs(intervaleye[]) < 1e- && fabs(intervaleye[]) < 1e-)
  35. {
  36. setTransformation(targeteye, targetcenter, targetup);
  37. isTrans = false;
  38. }
  39. if (((fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[])) || (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[])))
  40. &&((fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[])) || (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[]))))
  41. {
  42. if (fabs(currenteye[] - targeteye[]) >= fabs(intervaleye[]))
  43. {
  44. currenteye += intervaleye;
  45. }
  46. if (fabs(currentcenter[] - targetcenter[]) >= fabs(intervalcenter[]))
  47. {
  48. currentcenter += intervalcenter;
  49. }
  50. currentup += intervalup;
  51. setTransformation(currenteye, currentcenter, currentup);
  52. }
  53. else
  54. {
  55. setTransformation(targeteye, targetcenter, targetup);
  56. isTrans = false;
  57. }
  58. }
  59. }
  60. return OrbitManipulator::handle(ea, us);
  61. }

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

调用代码如下:

  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();
  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. }

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. 1.创建maven 项目 动态web工程完整示例

    注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装maven 一.创建项目 1.新建maven项目,如果不在上 ...

  2. PLSQL中使用二维存储结构---二维数组

    代码如下:  --PLSQL中没有数组的概念 用TYPE 和Table of Record来代替多维数组--create by jenrry 20171028-- 1.0 建立存放列的测试表creat ...

  3. [WSUS] [Windows 10 Upgrade 1607/1703] 升级出错,出现 0xC1800118 或者卡在下载中…… 0%后失败

    1. 安装 KB3159706 ,并进行安装后维护操作:https://support.microsoft.com/en-us/help/3159706/update-enables-esd-decr ...

  4. MySQL审核工具Inception

    http://www.ywnds.com/?p=9423 https://github.com/mysql-inception/inception 一.Inception简介 Inception是集审 ...

  5. [翻译] NSDate-TimeAgo

    NSDate-TimeAgo https://github.com/kevinlawler/NSDate-TimeAgo NSDate+TimeAgo has merged with DateTool ...

  6. PowerShell管理SCOM_批量设置维护模式(上 )

    #定义存储需要置为维护模式的计算机名称列表 $serverlist = "C:\scomm\servers.txt" #定义脚本执行结果的输出位置 $server_maintena ...

  7. AltiumDesigner元器件搜索中英文对照

    个人常用 扬声器 spearker 计量表(电流表,电压表) meter 变压器 Trans CT 肖特基二极管 D Schotty 额外补充 英文名称       中文释义 2N3904  NPN型 ...

  8. PHP设计模式系列 - 工厂模式

    工厂模式 提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤. 工厂模式 实际上就是建立一个统一的类实例化的函数接口.统一调用,统一控制. 工厂模式是php项目开发中,最常用的设计 ...

  9. debian安装及使用mysql

    在Debian中安装MySQL服务器是很方便的,使用apt-get命令即可完成. debian:~# apt-get install mysql-server mysql-client mysql-s ...

  10. Django 自定义模板标签和过滤器

    1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次. ...