#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 跟随的更多相关文章

  1. OSG 实现跟随节点的相机(转)

      本章教程将继续使用回调和节点路径(NodePath)来检索节点的世界坐标. 本章目标: 在一个典型的仿真过程中,用户可能需要从场景中的各种车辆和人物里选择一个进行跟随.本章将介绍一种将摄像机“依附 ...

  2. OSG开源教程(转)

    例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...

  3. OSGMFC

    在OSG的Demo中找到MFC_OSG类文件. #pragma once #include <osgViewer/Viewer> #include <osgViewer/Viewer ...

  4. [osg][osgEarth][原]基于OE自定义自由飞行漫游器(初级版)

    由于受够了OE的漫游器,想搞个可以在全球飞行的漫游器,所以就做了一个: 请无视我的起名规则······ 类头文件:EarthWalkManipulator.h #pragma once //南水之源 ...

  5. [原][osgEarth]在osgearth中添加相机路径动画

    在osg中添加相机动画路径请参考:http://www.cnblogs.com/lyggqm/p/8075277.html 这里的代码是在osgearth中添加相机动画路径漫游器: #include ...

  6. osg for android学习之一:windows下编译(亲测通过)【转】

    1. 首先需要一个OSG for android的环境 (1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新 ...

  7. osg编译日志-release

    1>------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake does ...

  8. osg 加载 fbx文件

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <os ...

  9. osg 添加 fbx插件 osg中编译fbx

    使用osg加载fbx模型,需要自己编译fbx插件,编译流程与插件使用案例如下 代码地址:https://github.com/shelltdf/osgFBX CMake Error: The foll ...

随机推荐

  1. unity之龙骨动画

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 做游戏有史以来,第一次接触到龙骨动画,为新人引个路吧. (1)首先拿到美术给我三个文件,分别是name_ske. ...

  2. querySelector和getElementById方法的区别

    一.querySelector() 的定义 querySelector() 方法选择指定 CSS 选择器的第一个元素 querySelectorAll() 方法选择指定的所有元素 二.与 getEle ...

  3. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  4. webpack 配置react脚手架(四):路由配置

    1. 由于 react-router 是集成了 react-router-dom 和 react-router-native的一起的,所以这里要使用的是 react-router-dom, 2. 安装 ...

  5. UML类图介绍

    一.概述 UML类图用来定义系统中的类,包括描述类的结构和类之间的关系.类图的主要作用于描述系统的静态结构. 类图的基本模型元素如下:

  6. js事件冒泡/捕获

  7. 一步一步使用webpack搭建项目

    MPA |-src |-main.js 项目打包的入口文件 |-App.vue 项目的根组件(项目一启动,见到的第一个页面) |-package.json 项目的描述文件,用于记录安装了哪些包 |-w ...

  8. 52、[源码]-Spring源码总结

    52.[源码]-Spring源码总结 总结 一.Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息: xml注册bean: 注解注册Bean:@Service.@Component ...

  9. Kylin介绍 (很有用)

    转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...

  10. 【luogu4474王者之剑】--网络流

    题目描述 这是在阿尔托利亚·潘德拉贡成为英灵前的事情,她正要去拔出石中剑成为亚瑟王,在这之前她要去收集一些宝石. 宝石排列在一个n*m的网格中,每个网格中有一块价值为v(i,j)的宝石,阿尔托利亚·潘 ...