#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. 用来遍历map集合的方法

    map集合是以键值对进行存储值的,所以遍历map集合无非就是获取键和值,根据实际需求,进行获取键和值. 1.无非就是通过map.keySet()获取到值,然后根据键获取到值. for(String s ...

  2. __str__()方法

    只要定义了__str__(self)方法,那么就会打印从这个方法中return的数据 class Car: def __init__(self, newWheelNum, newColor): sel ...

  3. 转,sql 50道练习题

    SQL语句50题   -- 一.创建教学系统的数据库,表,以及数据 --student(sno,sname,sage,ssex) 学生表--course(cno,cname,tno) 课程表--sc( ...

  4. 07_Kibana界面操作ES

    Kibana界面的API操作ES 1.创建索引 1.1 指定分片数量和备份数量 1.2 创建默认 2. 查看索引 2.1 查看单个索引设置 2.2 查看所有索引设置 3.文档管理 3.1 添加文档 3 ...

  5. 贴两个mysql优化的配置文件

    MySQL5.7以上my.cnf配置文件配置 低配置服务器配置 [client] #客户端设置 port = 3306 socket = /data/mysql/data/mysql.sock def ...

  6. mysql5.7版本以上下载安装

    1.mysql官网下载地址:https://downloads.mysql.com/archives/community/ 2.下载完成后解压,解压后如图: 3.放置位置,把解压好的文件夹放在自己喜欢 ...

  7. linux经常用的命令

    常用 安装包   centos   yum    /   Ubuntu  Debian  apt-get clear :清空终端       [cmd 下是cls] vi/vim  编辑器    详情 ...

  8. hdu6731 Angle Beats(ccpc秦皇岛A,计算几何)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6731 题意: 给出$n$个点,有$q$次询问 每次询问给出一个点$b$,求这$n+1$个点,组成直角 ...

  9. Spring Cloud Gateway(四):路由定义定位器 RouteDefinitionLocator

    本文基于 spring cloud gateway 2.0.1 1.简介 RouteDefinitionLocator 是路由定义定位器的顶级接口,它的主要作用就是读取路由的配置信息(org.spri ...

  10. Bean Shell常用内置变量

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log文件,使用方法:log.info( ...