OSG漫游到指定坐标点位置
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漫游到指定坐标点位置的更多相关文章
- vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏
vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏,支持每个网页用不同的IP登陆,支持多线程自动点击 适合自动打怪,游戏练级,配合自动识图功能,自动验证码技术,可以实现更多功能. ...
- C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息
原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...
- .NET指定程序集的位置
有两种方法用来指定程序集的位置: 使用 <codeBase> 元素. 使用 <probing> 元素. 还可以使用 .NET Framework 配置工具 (Mscorcfg. ...
- vscode指定扩展安装位置
默认情况下,(Windows)vscode的安装路径为C:\Users\用户名\.vscode\extensions. 如果想要自定义扩展的安装路径,无法直接在vscode中修改.但是,在启动vsco ...
- iOS-UIView一些坐标和位置方法封装
新建基于UIView扩展类 UIView+wkjFrame,此类是为了方便获取一些基于UIView类UI控件的坐标和位置的简化,直接引用即可 UIView+wkjFrame.h - (CGPoint) ...
- 【android】模拟点击某个指定坐标作用在View上
/** * 模拟点击某个指定坐标作用在View上 * @param view * @param x * @param y */ public void clickView(View view,floa ...
- 关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
1.cocos2d-X中的坐标(0,0),就是运行框的左下角位置,所以运行框看起来就是一个第一象限. 2.节点的锚点就是我们setPosition所设定的位置,默认锚点是在节点的中心,也就是setPo ...
- 使用Hbuilder开发IOS应用上架审核提示请指定用户在位置许可模式警报中使用位置的预定用途。
使用Hbuilder开发IOS应用时,遇到上架App被拒的问题,被拒原因: 你的应用程序使用位置服务,但并没有按照iOS人机界面指南中的要求,在位置模式警报中阐明它的用途. 要解决此问题,请指定用户在 ...
- WPF中获取指定坐标依赖对象数据项
上图中红色框区域是一个自定义的ListBox控件,需要实现的功能是,点击红框区域中某项时,获取当前选中项的数据项 控件的MouseDown事件部分代码为: var x = TreeHelper.Fin ...
随机推荐
- spring boot(10)-tomcat jdbc连接池
默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多.spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...
- AWK与SED命令
linux系统比较常用的AWK与SED命令,这两个命令主要是格式化文本文件信息.接下来将详细介绍这两个命令的基本用法以及可以实现的功能. 一.AWK命令 AWK语言的基本功能是在文件或者字符串中基于指 ...
- PHP接收IOS post过来的json数据无法解析的问题
在本地环境下运行解析OK 换到线上的环境解析失败 开始怀疑各种编码问题,解决均无效. 查看phpinfo 发现magic_quotes_gpc =on 终于找到问题所在,更改php.ini文件 mag ...
- SQL语句大全教程
创建数据库 CREATE DATABASE DBNAME 删除数据库 DROP DATABASE DBNAME Ø 基本常用查询 --selectselect * from student; --al ...
- 将亚马逊aws的ec2服务器的登陆方式改为密码登陆
1.在用密钥登陆ec2后,为root用户创建密码: sudo passwd root 系统会让你输入两次密码 2.切换为root用户,并且编辑sshd_config文件,PasswordAuthent ...
- 【转载】 C语言命令行小猪佩奇
// ASCII Peppa Pig by Milo Yip #include <math.h> #include <stdio.h> #include <stdlib. ...
- zabbix日常监控项TCP连接状态(六)
TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是time_wait值比较高的话,我们要考虑看 ...
- iPhone/android的viewport 禁止页面自动缩放
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scal ...
- APP案例分析-摩拜单车app
第二次作业-App案例分析 本次案例分析选用的是 摩拜单车IOS5.7.5版本 测试环境为 IPhone 6s (IOS11.0.1,含有3DTOUCH功能).本次案例分析仅针对APP 而言,并不涉及 ...
- 【收集】Python 微优化
1. 第二种方式可以节省寻找result的append属性的时间, 但会降低代码可读性和可维护性 # The way we're used to seeing it: result.append(&q ...