osgGA::KeySwitchMatrixManipulator 跟随
#ifdef _WIN32
#include <Windows.h>
#endif // _WIN32 #include <osg/Group>
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osg/Node> #include <osg/Geometry>
#include <osg/Image>
#include <osg/ShapeDrawable>
#include <osg/Texture2D> #include <osg/MatrixTransform>
#include <osg/AnimationPath> #include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers> #include <osgGA/DriveManipulator>
#include <osgGA/GUIEventHandler>
#include <osgGA/GUIEventAdapter>
#include <osgGA/GUIActionAdapter> #include <osgGA/AnimationPathManipulator>
#include <osgGA/KeySwitchMatrixManipulator> #include <osgUtil/LineSegmentIntersector> #include <iostream>
using namespace std; class Follow:public osgGA::KeySwitchMatrixManipulator
{
public:
Follow(osgViewer::Viewer *viewerParam)
{
m_vPosition = osg::Vec3(0.0, -200.0, -70.0);
m_vRotation = osg::Vec3(osg::PI_2, 0.0f, 0.0f);
m_fMoveSpeed = 2.0;
m_fAnglg = 2.5;
viewer1 = viewerParam;
} virtual void setByMatrix()
{ } virtual void setByInverseMatrix()
{ } virtual osg::Matrixd getMatrix() const
{
osg::Matrixd mat1;
mat1.makeRotate(m_vRotation.x(), osg::Vec3(1.0, 0.0, 0.0), m_vRotation.y(), osg::Vec3(0.0, 1.0, 0.0), m_vRotation.z(), osg::Vec3(0.0, 0.0, 1.0));
return mat1*osg::Matrixd::translate(m_vPosition);
} virtual osg::Matrixd getInverseMatrix() const
{
osg::Matrixd mat1;
mat1.makeRotate(m_vRotation.x(), osg::Vec3(1.0, 0.0, 0.0), m_vRotation.y(), osg::Vec3(0.0, 1.0, 0.0), m_vRotation.z(), osg::Vec3(0.0, 0.0, 1.0));
return osg::Matrixd::inverse(mat1*osg::Matrixd::translate(m_vPosition));
} virtual float getFusionDistanceValue() const {
//return _current->getFusionDistanceValue();
return viewer1->getFusionDistanceValue();
} virtual osgUtil::SceneView::FusionDistanceMode getFusionDistanceMode() const
{ return viewer1->getFusionDistanceMode();
} void changePosition(osg::Vec3 delta)
{
m_vPosition += delta;
} bool handle(const osgGA::GUIEventAdapter& gea,osgGA::GUIActionAdapter& gaa)
{
//
switch (gea.getEventType())
{
case osgGA::GUIEventAdapter::DOUBLECLICK:
std::cout << "-double click--" << std::endl;
break; case osgGA::GUIEventAdapter::KEYDOWN:
//std::cout << "-ket down--" << std::endl;
if (gea.getKey()==)
{
changePosition(osg::Vec3(m_fMoveSpeed*cosf(osg::PI_2 + m_vRotation[]), m_fMoveSpeed*sinf(osg::PI_2 + m_vRotation[]), ));
}
else if (gea.getKey()==)
{
changePosition(osg::Vec3(-m_fMoveSpeed*cosf(osg::PI_2 + m_vRotation[]), -m_fMoveSpeed*sinf(osg::PI_2 + m_vRotation[]), ));
}
else if (gea.getKey()== 0xFF53)
{
m_vRotation._v[] -= osg::DegreesToRadians(m_fAnglg);
}
else if (gea.getKey()==0xFF51)
{
m_vRotation._v[] += osg::DegreesToRadians(m_fAnglg);
}
else
{ } break; default:
break;
} return false;
} private:
osg::Vec3 m_vPosition;
osg::Vec3 m_vRotation;
float m_fMoveSpeed;
float m_fAnglg;
osgUtil::SceneView::FusionDistanceMode model1;
osgViewer::Viewer *viewer1;
}; int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer;
osg::ref_ptr<osg::Group> group1 = new osg::Group;
osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("D:\\参考手册\\BIM\\osg\\四合院2019.osgb"); group1->addChild(node1.get());
viewer1->setSceneData(group1);
viewer1->setUpViewInWindow(, , , , );
viewer1->setCameraManipulator(new Follow(viewer1)); //viewer1->addEventHandler(new osgViewer::WindowSizeHandler);
viewer1->realize(); return viewer1->run();
}


osgGA::KeySwitchMatrixManipulator 跟随的更多相关文章
- OSG 实现跟随节点的相机(转)
		
本章教程将继续使用回调和节点路径(NodePath)来检索节点的世界坐标. 本章目标: 在一个典型的仿真过程中,用户可能需要从场景中的各种车辆和人物里选择一个进行跟随.本章将介绍一种将摄像机“依附 ...
 - OSG开源教程(转)
		
例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...
 - OSGMFC
		
在OSG的Demo中找到MFC_OSG类文件. #pragma once #include <osgViewer/Viewer> #include <osgViewer/Viewer ...
 - [osg][osgEarth][原]基于OE自定义自由飞行漫游器(初级版)
		
由于受够了OE的漫游器,想搞个可以在全球飞行的漫游器,所以就做了一个: 请无视我的起名规则······ 类头文件:EarthWalkManipulator.h #pragma once //南水之源 ...
 - [原][osgEarth]在osgearth中添加相机路径动画
		
在osg中添加相机动画路径请参考:http://www.cnblogs.com/lyggqm/p/8075277.html 这里的代码是在osgearth中添加相机动画路径漫游器: #include ...
 - osg for android学习之一:windows下编译(亲测通过)【转】
		
1. 首先需要一个OSG for android的环境 (1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新 ...
 - osg编译日志-release
		
1>------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake does ...
 - osg 加载 fbx文件
		
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <os ...
 - osg 添加  fbx插件  osg中编译fbx
		
使用osg加载fbx模型,需要自己编译fbx插件,编译流程与插件使用案例如下 代码地址:https://github.com/shelltdf/osgFBX CMake Error: The foll ...
 
随机推荐
- Usages for IntelliJ & Eclipse
			
IntelliJ ⌘E Select a recently opened file from the list. ⌘/ (left command + /)⌥⌘/ (right command + / ...
 - CQRS的全称是Command Query Responsibility Segregation
			
CQRS时,我们在讨论些神马? 当我写下这个标题的时候,我就有些后悔了,题目有点大,不太好控制.但我还是打算尝试一下,通过这篇内容来说清楚CQRS模式,以及和这个模式关联的其它东西.希望我能说得清 ...
 - 「数据结构与算法之链表(Python)」(四)
			
什么是链表 顺序表的储存分为一体式结构和分离式结构,但总的来说存储数据的内存是一块连续的单元,每次申请前都要预估所需要的内存空间大小.这样就不能随意的增加我们需要的数据了.链接就是为了解决这个问题.它 ...
 - clean()方法的简单应用
			
clean()方法主要用于验证相互依赖的字段,例如注册时,填写的“密码”和“确认密码”要相等时才符合要求. 在调用表单clean() 方法的时候,所有字段的验证方法已经执行完(表单字段的默认验证(如C ...
 - 深入理解JavaScript之实现继承的7种方式
			
1.原型链继承 核心:将父类的实例作为子类的原型 首先,要知道构造函数.原型和实例之间的关系:构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针. func ...
 - python - django (cookie)
			
# """ Cookile: # 因为 HTTP 请求是没有状态的,每一次请求都是独立的 Cookile 的存储: # 保存在浏览器上的 键值对. # 服务器控制着响应, ...
 - SQL动态标签
			
MyBatis的动态SQL详解MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不 ...
 - 使用 ServerSocket 建立聊天服务器-1
			
1.代码目录 2.ChatSocket.java --------------------------------------------------------------------------- ...
 - 使用Python+selenium实现第一个自动化测试脚本
			
原blog 一,安装Python. python官方下载地址:https://www.python.org/downloads/ 安装后点击开始菜单,在菜单最上面能找到IDLE. IDLE是pytho ...
 - 洛谷P1006 传纸条(多维DP)
			
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们 ...