当前位置: 首页 > article >正文

十四、OSG学习笔记-事件响应

上一章节

十三、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;
}


http://www.kler.cn/a/593019.html

相关文章:

  • Qt 控件概述 QWdiget 1.1
  • 事件系统简介+Button组件+Toggle简介
  • 一次Linux下 .net 调试经历
  • 【C++】list(下):list类的模拟实现(含反向迭代器实现)
  • 2025赛逸展,消费电子企业角逐科技创新奖
  • 网络编程--服务器双客户端聊天
  • Java设计模式之享元模式
  • 【深度学习与大模型基础】第7章-特征分解与奇异值分解
  • Docker build 会在本地产生巨大的文件
  • vue3计算当前日期往前推一个月的日期,当前日期往前推7天
  • 用 C 语言理解封装、继承、多态
  • 单机 elasticsearch下载,安装,配置,启动,百度云链接提供
  • 技术视界 | 灵巧手的工作空间:解锁机器人精细操作的无限可能
  • PHP工程师转向Java开发定制的教材及教程信息,结合两种语言的差异点进行针对性推荐
  • 【计算机网络】2物理层
  • 群体智能优化算法-黏菌优化算法(Slime Mould Algorithm, SMA,含Matlab源代码)
  • vmware tools灰化
  • 如何排查和修复 MSSQL 数据库连接失败的问题
  • 【模拟】扫雷
  • 【机器学习】算法分类