关闭

OSG-漫游

标签: 3DOSGOpen Scene Graphic漫游
254人阅读 评论(0) 收藏 举报
分类:
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html
作者写的比较好,再次收藏,希望更多的人可以看到这个文章

互联网是是一个相互分形并学习的平台,我希望我每个人可以将我们认为有价值的东西,在不损害他人利益的情况下分享给更多的人。


MatrixManipulator


场景的核心管理器是viewer,而漫游必须响应事件,比如鼠标动了,场景也在动。响应事件的类是osgGA::GUIEventHandler。我们想把响应事件的类派生一个新类出来,这个类专门用来根据响应控制viewer。这个类就是osgGA::MatrixManipulator,这个类有一些设置矩阵的公共接口,有了这些接口就可以有效的控制viewer了,根据不同的习惯,大家还会设置不同的控制方式,如同OSG自带的几个操作器,操作都不尽相同。来看一下漫游的主要流程如图6.1:



操作器必须从osgGA::MatrixManipulator派生而来。osgGA::MatrixManipulator有四个可以控制场景的重要接口:

virtual void setByMatrix(const osg::Matrixd&matrix)=0

 virtual void setByInverseMatrix(const osg::Matrixd&matrix)=0

 virtual osg::Matrixd getMatrix()const=0

 virtual osg::Matrixd getInverseMatrix()const=0

四个矩阵接口可以有效的向viewer来传递矩阵的相关信息。


碰撞检测


最简单的碰撞检测如下图所示:




TravelManipulator.dll中用到的就是如图所示的原理,黑三角形代表没有移动之的位置,控制移动的函数是ChangePosition(osg::Vec3&delta),参数意思是要移动的相对于当前点的增量,在黑三角形没有移动时该函数在计算时先假设一点newPosition为移动后的点,而后通过连接这两个点,而后通过判断与场景的模型是否有交点来判定这个移动可不可以执行,如图所示,两者之间有个大盒子,是穿不过去的,所以只有保持在原地。就算没有这个盒子,移动后的新点又与地面在某种程序上有一个交点,这证明移动是不可行的。这可以防止用户穿过地板到达地下去。


路径漫游


使用path文件的方法如下面示例

#include<osgDB/ReadFile>

#include<osgViewer/Viewer>

#include<osg/Node>

#include<osgGA/AnimationPathManipulator>

 void main()

{

osgViewer::Viewer viewer;

viewer.setSceneData(osgDB::readNodeFile("glider.osg"));

 //申请一个操作器,参数为一个path文件。
 
osg::ref_ptr<osgGA::AnimationPathManipulator>amp=new osgGA::AnimationPathManipulator("glider.path");

 //选择使用这个操作器。
 
viewer.setCameraManipulator(amp.get());

viewer.realize();

viewer.run();

}


我们可以用路径编辑器编辑path文件,或者可以控制程序中的某个物体的运动轨迹然后保存为path文件。



1
0
查看评论

【漫游大师6.0】漫游大师快速入门

一、实验准备 二、制作步骤 三、实验
  • liyongliang_2012
  • liyongliang_2012
  • 2014-05-13 16:43
  • 2260

Windows 7 在 windows 2008 里无法漫游用户配置文件的解决办法

如果按现在网络上转载的那些,好像都是基于XP/2003的,WIn7/2008有一点不同,不同点在共享上。 在要保存用户漫游的服务器上,改一下文共享名就OK了。 比如说要为User1域用户漫游: 建立User1.v2文件夹(注意,这里加了”.v2“,不加不成功!),然后共享,共享名为\\xxxx...
  • SM45744750
  • SM45744750
  • 2013-12-10 17:33
  • 2131

osg-

有时间再整理,osg虚拟现实。 三维场景中控制tank
  • u011409995
  • u011409995
  • 2014-09-20 13:46
  • 370

《LDA漫游指南》数学基础阅读笔记

《LDA漫游指南》数学基础阅读笔记第二章 烧脑的数学公式。。。廉颇老矣,扶我起来,朕还能算。。。gamma函数这个函数主要目的是计算阶乘可以通过这个函数来进行转化。举个栗子:这么一看,其实挺简单的哈,无非就是一个积分运算,无非是表现形式有些复杂而已。再来重复一遍:第一个烧脑结果: Γ(12)\Gam...
  • Zhaohui1995_Yang
  • Zhaohui1995_Yang
  • 2016-06-21 19:45
  • 3871

[Unity3D 版本5.X]实现一个自由漫游的摄像机

我学习Unity3D一小段时间了,第一个制作目标就是实现一个自由漫游的摄像机。 使用WSAD键控制摄像机的上下左右移动,使用鼠标右键控制摄像机的旋转。 这个功能比较简单,代码也一目了然,不做过多解释了,直接上代码。 //----------------------------------------...
  • oilcode
  • oilcode
  • 2017-05-29 20:46
  • 2508

Unity中关于场景漫游的两个方法(二)

第二个方法不仅不需要借助漫游插件实现漫游效果,而且还可以实现对物体的抓取,比第一种方法更加方便快捷。废话不多说,下面进入正题: 导入steamVR Plugin插件 steamVR Plugin可以直接从Asset Store中导入。 将预制体SteamVR 和 CameraRig拖入场景中,...
  • a435931517
  • a435931517
  • 2017-08-29 17:52
  • 630

OpenGL漫游模型示例

opengl漫游模型示例
  • wcl0617
  • wcl0617
  • 2016-05-09 13:34
  • 803

无线WiFi漫游的基本原理及搭建

原谅地址:http://lcbk.net/wifi/812.html 随着网络的普及,我们从宽带到光纤、从有线到无线、从单信道到多信道、从单频到双频,都深深刻着网络时代的烙印;不管你相不相信,网络时代真的来到了。 WiFi网络中关于“漫游”的议论纷争始终没有停止过,期间不免夹...
  • crazyman2010
  • crazyman2010
  • 2016-01-07 00:05
  • 8939

蓝海卓越三层漫游解决方案

1、什么是三层漫游        大型的无线网络,常见的像园区网络,都要求IP会话可以跨越三层进行漫游,为的是保证移动终端访问多个VLAN的时候应用和会话的持续性。例如,当一个用户使用VoIP通话的过程中在位于不同VLAN、不同三层网络的...
  • YLZY032
  • YLZY032
  • 2017-02-20 21:53
  • 308

Unity3D键盘+鼠标漫游脚本

两个代码都附在MainCamera上面,可以实现键盘加鼠标漫游 1、KeyMove.cs  键盘漫游 using UnityEngine; using System.Collections; public class KeyMove : MonoBehaviour {...
  • u013692049
  • u013692049
  • 2016-10-30 21:39
  • 1779
    个人资料
    • 访问:236800次
    • 积分:4256
    • 等级:
    • 排名:第8506名
    • 原创:139篇
    • 转载:26篇
    • 译文:1篇
    • 评论:188条
    Git Hub 地址
    个人信息
    QQ:609932088

    邮箱:Dream_Dog@163.com

    博客专栏
    文章分类
    最新评论