上一章节
十三、OSG学习笔记-osgDB文件读写-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146165712
本章节代码:
OsgStudy/EventHandle · CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/master/OsgStudy/EventHandle
一、事件的概念
事件:是计算机应用程序和人通过外设进行交互的途径。
核心模块 OSG::GA,通过事件回调,遍历响应各个事件处理的handle方法,所以在是现实时,可以通过自定义handle处理方法,从而实现事件操作器;
示例代码如下:
/**
osg 事件处理器
**/
#include <windows.h>
#include <iostream>
#include <osgViewer/Viewer>
#include <osgDB/ReaderWriter>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventHandler>
#include <osg/MatrixTransform>
class TestInput:public osgGA::GUIEventHandler
{
public:
// aa ,就是viewer
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override
{
osgViewer::Viewer* vw = dynamic_cast<osgViewer::Viewer*>(&aa);
switch (ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
std::cout << ea.getKey() << std::endl;
_keyMap[ea.getKey()] = true;
if (((_keyMap['w'] == true) || (_keyMap['W'] == true)) && ((_keyMap['a'] == true) || (_keyMap['A'] == true)))
{
std::cout << "应该向左前方走" << std::endl;
}
if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Alt_L)
{
std::cout << "按下了左边的ALT键" << std::endl;
}
break;
case osgGA::GUIEventAdapter::KEYUP:
_keyMap[ea.getKey()] = false;
break;
case osgGA::GUIEventAdapter::PUSH:
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
{
std::cout << "左键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
}
else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)
{
std::cout << "右键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
}
else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON)
{
std::cout << "中键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
}
else {
}
break;
case osgGA::GUIEventAdapter::DRAG:// 拖拽
std::cout << "你DRAG了" << std::endl;
break;
case osgGA::GUIEventAdapter::SCROLL: // 滚轮事件
if (ea.getScrollingMotion() == osgGA::GUIEventAdapter::SCROLL_UP)// 滚轮向上
{
osg::ref_ptr<osg::MatrixTransform> mx = new osg::MatrixTransform;
mx->addChild(vw->getSceneData());
mx->setMatrix(osg::Matrix::rotate(0.1, osg::Vec3f(1.0, 0, 0)));
vw->setSceneData(mx);
}
else if (ea.getScrollingMotion() == osgGA::GUIEventAdapter::SCROLL_DOWN) // 滚轮向下
{
osg::ref_ptr<osg::MatrixTransform> mx = new osg::MatrixTransform;
mx->addChild(vw->getSceneData());
mx->setMatrix(osg::Matrix::rotate(-0.1, osg::Vec3f(1.0, 0, 0)));
vw->setSceneData(mx);
}
break;
case osgGA::GUIEventAdapter::RESIZE:
std::cout << "改变窗口大小" << std::endl;
break;
default:
break;
}
//return true;// 如果为true,这这个事件不往后传递。
return false;
}
private:
std::map<int, bool> _keyMap; // 按键状态记录map
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setUpViewInWindow(50, 50, 1500, 1000);
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
osg::ref_ptr<TestInput> Test = new TestInput;
viewer->addEventHandler(Test);// 加入事件
viewer->run();
return 0;
}