Ogre与OIS实现键盘响应

这篇具有很好参考价值的文章主要介绍了Ogre与OIS实现键盘响应。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ogre与OIS实现键盘响应

环境:

  • ubuntu 18.04
  • Ogre 1.12.13
  • OIS 1.3.0

ubuntu下安装OIS

sudo apt-get install libois-dev -y

帧监听是基于一个观察者的模式。
在OGRE中其工作流程是:
在帧被渲染前,Ogre::Root 遍历所有被添加的FrameListener并调用其frameStarted()方法。直到frameStarted返回false时,帧监听终止,程序结束。

CMakeLists.txt

find_package(OGRE REQUIRED COMPONENTS Bites RTShaderSystem CONFIG)
#...
target_link_libraries(test OgreBites OgreRTShaderSstem -lOIS)

using OIS

InputManager函数说明

Public Member Functions
virtual Object* createInputObject(Type iType, bool bufferMode)=0; 产生一个输入设备!
virtual void destroyInputObject (Object *obj)=0; 销毁一个输入设备
Static Public Member Functions
InputManager* createInputSystem(std::size_t winHandle); 产生输入控制管理系统
InputManager* createInputSystem(ParamList ¶mList); 创建控制管理系统
void destroyInputSystem(InputManager *manager); 销毁控制管理系统

鼠标键盘函数说明

鼠标的2个重要类是Mouse,MouseListener,相应的键盘的2个重要类是Keyboard,KeyListener 。

Mouse的重要函数:

Public Member Functions
virtual void setEventCallback (MouseListener *mouseListener);
const MouseState& getMouseState () const;
virtual void capture();

MouseListener的重要函数

Public Member Functions
virtual void mouseMoved( const MouseEvent &arg ) = 0;
virtual void mousePressed( const MouseEvent &arg, MouseButtonID id ) = 0;
virtual void mouseReleased( const MouseEvent &arg, MouseButtonID id ) = 0;

Keyboard的重要函数

Public Member Functions
virtual bool isKeyDown (KeyCode key)=0;
virtual void setEventCallback (KeyListener *keyListener);
virtual void capture();//继承自Object类

KeyListener的重要函数

Public Member Functions
virtual bool keyPressed( const KeyEvent &arg ) = 0;
virtual void keyReleased( const KeyEvent &arg ) = 0;

初始化

OIS::ParamList pl;
size_t windowHnd = 0;
std::ostringstream windowHndStr;
m_win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
m_InputManager = OIS::InputManager::createInputSystem( pl );

或者

size_t hWnd = 0;
m_win->getCustomAttribute("WINDOW", &hWnd);
m_InputManager = OIS::InputManager::createInputSystem(hWnd);

自定义监听器

#include "OgreFrameListener.h"
#include "OgreRenderWindow.h"
#include <ois/OISEvents.h>
#include <ois/OISInputManager.h>
#include <ois/OISKeyboard.h>

class MyFrameListener :public FrameListener
{
public:
	MyFrameListener(RenderWindow* win){
		size_t windowHnd = 0;
		std::stringstream windowHndStr;
		win->getCustomAttribute("WINDOW", &windowHnd);//创建窗口句柄,以获取输入事件
		windowHndStr << windowHnd;//类型转换
		
		//创建输入系统,使用参数表创建输入系统
		OIS::ParamList pl;
		pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
		//产生输入控制管理系统
		mMan= OIS::InputManager::createInputSystem(pl);
		//创建键盘接口,用于查询用户按下了哪个键
		mKey= static_cast<OIS::Keyboard*>(mMan->createInputObject(OIS::OISKeyboard, false));
	}
	~MyFrameListener(){
		//销毁一个输入设备
		mMan->destroyInputObject(mKey);//销毁键盘
		//销毁控制管理系统
		OIS::InputManager::destroyInputSystem(mMan);
	}
	bool frameStarted(const Ogre::FrameEvent &evt){
		mKey->capture();//在started类中添加键盘状态获取函数capture
		if (mKey->isKeyDown(OIS::KC_ESCAPE))
		{
			return false;
		}
		else if (mKey->isKeyDown(OIS::KC_F1))
		{
			//按键需要实现的功能,如移动camera等
			
			return true;
		}
		return true;
	}
private:
	OIS::InputManager* mMan;
	OIS::Keyboard*mKey; //创建键盘对象:OIS::Keyboard* _key;如果是鼠标:OIS::Mouse*_mouse;
};
#include "OgreApplicationContext.h"
//省
class OgreFrame: public OgreBites::ApplicationContext
{
public:
	OgreFrame()
	{
		mFrameListener = NULL;
	}
	~OgreFrame()
	{
		if (mFrameListener)
		{
			delete mFrameListener;
		}
	}
	protected:
	void createScene()
	{
		// add a plane
		Plane plane(Vector3::UNIT_Y, -10);
		Ogre::MeshManager::getSingleton().createPlane("plane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 1500, 1500, 200,200, true, 1, 5,5,Vector3::UNIT_Z);
		Entity *ent = mSceneMgr->createEntity("LightPlaneEntity","plane");
		mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
		ent->setMaterialName("Examples/BeachStones");
		//add a light
		Light *light = mSceneMgr->createLight("Light1");
		light->setType(Ogre::Light::LT_DIRECTIONAL);
		light->setDirection(Vector3(1,-1,0));
		//add Model
		SceneNode *node = mSceneMgr->createSceneNode("Node1");
		mSceneMgr->getRootSceneNode()->addChild(node);
		Entity *Sinbad = mSceneMgr->createEntity("Sinbad", "Sinbad.mesh");
		mSinbadNode = node->createChildSceneNode("SinbadNode");
		mSinbadNode->setScale(3.0f,3.0f,3.0f);
		mSinbadNode->setPosition(Vector3(0,4.0f,0));
		mSinbadNode->attachObject(Sinbad);
		//add Shadow
		mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
	}
	void createCamera()
	{
		mCamera = mSceneMgr->createCamera("MyCamera1");
		mCamera->setPosition(0,100,200);
		mCamera->lookAt(0,0,0);
		mCamera->setNearClipDistance(5);
	}
	void createFrameListener()
	{
		mFrameListener = new MyFrameListener(mSinbadNode, mWindow);
		mRoot->addFrameListener(mFrameListener);
	}
private:
SceneNode *mSinbadNode;
MyFrameListener*mFrameListener;
};

int main()
{
	OgreFrame app;
	app.go();
	return 0;
}

问题:

  1. 通过自定义帧监听器的方式监听键盘响应之后,自带的鼠标响应失效了???
  2. ubuntu虚拟桌面通过OgreBites::InputListener实现的键盘和鼠标监听器无响应????

OIS使用参考文章来源地址https://www.toymoban.com/news/detail-616230.html

以下程序解决鼠标无响应的问题:

#include "OgreFrameListener.h"
#include "OgreRenderWindow.h"
#include <ois/OISEvents.h>
#include <ois/OISInputManager.h>
#include <ois/OISKeyboard.h>

class MyFrameListener :public FrameListener,public OIS::MouseListener,public OIS::KeyListener
{
public:
	MyFrameListener(RenderWindow* win){
		size_t windowHnd = 0;
		std::stringstream windowHndStr;
		win->getCustomAttribute("WINDOW", &windowHnd);//创建窗口句柄,以获取输入事件
		windowHndStr << windowHnd;//类型转换
		
		//创建输入系统,使用参数表创建输入系统
		OIS::ParamList pl;
		pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
#if defined(OIS_LINUX_PALATFORM)
		pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
		pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
		pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
		pl.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
#endif
		//产生输入控制管理系统
		mMan = OIS::InputManager::createInputSystem(pl);
		//创建键盘接口,用于查询用户按下了哪个键
		mKey = static_cast<OIS::Keyboard*>(mMan->createInputObject(OIS::OISKeyboard, true));
		mMouse = static_cast<OIS::Mouse*>(mMan->createInputObject(OIS::OISMouse, true));
		mKey->setEventCallBack(this);
		mMouse->setEventCallBack(this);
	}
	~MyFrameListener(){
		//销毁一个输入设备
		mMan->destroyInputObject(mKey);//销毁键盘
		mMan->destroyInputObject(mMouse);//销毁键盘
		//销毁控制管理系统
		OIS::InputManager::destroyInputSystem(mMan);
	}
	bool frameStarted(const Ogre::FrameEvent &evt){
		mKey->capture();//在started类中添加键盘状态获取函数capture
		mMouse->capture();
		return true;
	}
	bool mouseMoved(const OIS::MouseEvent &e){
		return true;
	}
	bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id){
		return true;
	}
	bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id){
		return true;
	}
	bool keyPressed(const OIS::KeyEvent &e){
		if (e.key == OIS::KC_ESCAPE)
		{
			//getRoot()->queueEndRendering();//退出
			return false;
		}
		else if (e.key == OIS::KC_F1)
		{
			//按键需要实现的功能,如移动camera等
			
		}
		return true;
	}
	bool keyReleased(const OIS::KeyEvent &e){
		return true;
	}
private:
	OIS::InputManager* mMan;
	OIS::Keyboard*mKey; //创建键盘对象:OIS::Keyboard* _key;如果是鼠标:OIS::Mouse*_mouse;
	OIS::Mouese* mMouse;
};

到了这里,关于Ogre与OIS实现键盘响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于MFC的键盘响应(热键触发事件)

    通过输入 CTRL + G 组合按键完成文件选择框弹出: 目标: 按下 CTRL + G ,弹出文件选择框 过程: 头文件添加消息申明 cpp文件添加消息映射 OnInitDialog添加全局热键注册 实现热键功能函数 MFC键盘宏定义: 功能键: VK_TAB : Tab键。 VK_SPACE : 空格键。 VK_BACK : 退格键(回退键)。

    2024年02月04日
    浏览(46)
  • 计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

    键盘响应中有一个函数叫做 waitKey ,所有的获取键盘键值都是通过waitKey函数实现的。 1.键盘响应事件 cv.waitKey( [, delay] ) -- retval delay如果没有声明或者delay=0,表示一直阻塞 delay大于0,表示阻塞指定毫秒数 retval返回的对应键盘键值,注意:在不同的操作系统中可能会有差异! 典

    2024年02月09日
    浏览(49)
  • 防抖分类(OIS EIS AIS)

    光学防抖分为两大类:基于镜片移动式的光学防抖和CCD移动式光学防抖 镜头防抖:         依靠镜头内部的陀螺仪将侦测到的微小移动信号传至微处理器,通过处理器计算得出校正所需位移量,然后通过补偿镜片组,根据镜头的抖动方向及位移量加以补偿,解决成像设备因

    2024年02月11日
    浏览(27)
  • C++中键盘响应结合OpenCV库进行图像灰度图、HSV图转换和亮度调整

    QuickDemo.cpp quick_opencv.h main.cpp 按键esc退出程序。 注意必须点击原图上再输入1或2或3才有响应。

    2024年02月20日
    浏览(66)
  • Android Camera2开启电子防抖(EIS)和光学防抖(OIS)

    刚好当前项目有录像功能,使用了第三方框架是基于Camera2引擎开发,当使用 Camera2 API 开发相机应用时,启用和关闭 EIS(电子防抖)是一个重要的功能。EIS 可以帮助减少相机拍摄时的抖动,从而提高图像和视频的稳定性;OIS是光学图片想稳定器,功能是通过镜头的浮动透镜来

    2024年01月18日
    浏览(28)
  • unity3D 鼠标键盘输入

    一、鼠标键盘输入 游戏的输入可以来自于鼠标,键盘,触摸屏,游戏手柄 显示一个Vector3类型的xyz的鼠标位置。 Input.GetButtonDown(0):0代表鼠标左键,1代表鼠标右键,如果鼠标左键按下返回true。 Input.GetKeyDown(\\\"space\\\"): 检测空格是否按下。 更多操作可以查看Unity Script API( UnityE

    2024年02月10日
    浏览(81)
  • GDAL OGR C++ API 学习之路 (5)OGRLayer篇 代码示例

    virtual  OGRStyleTable * GetStyleTable   ( ) 返回图层样式表 返回:  指向不应由调用方修改或释放的样式表的指针 virtual  void  SetStyleTableDirect (OGRStyleTable *poStyleTable  ) 设置图层样式表 参数: poStyleTable  -- 指向要设置的样式表的指针 Virtual  OGRErr  StartTransaction ( ) 对于支持事务的数

    2024年02月14日
    浏览(52)
  • Qt3D 输入类处理鼠标键盘动作

    Qt3D模块中的输入类用于处理用户输入,比如鼠标、键盘等输入事件。 ```cpp #include Qt3DExtras #include Qt3DInput #include Qt3DCore #include Qt3DRender #include Qt3DLogic #include Qt3DExtras int main(int argc, char *argv[]) {     QApplication app(argc, argv);     // 创建Qt3D窗     Qt3DExtras::Qt3DWindow view;     // 创建3

    2024年02月02日
    浏览(36)
  • 【Unity3D编辑器开发】Unity3D中实现查看键盘对应KeyCode值面板【方便开发】

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在开发中,会遇到要使用监控键盘输入的KeyCode值来执行代码的情况。 比如说: 但是,如果是一些不常

    2024年02月08日
    浏览(79)
  • Unity3D摄像机,键盘控制前后左右上下移动,鼠标控制旋转、放缩

    Unity3D中运行场景时,实现摄像机的前、后、左、右、上、下,以及鼠标滚轮的放缩,鼠标右键的旋转操作。亲测有效,可供参考。 按键功能介绍:W——前;S——后;A——左;D——右;Q——下降;E——上升;鼠标右键——旋转;鼠标滚轮——放缩。 Tourcamera脚本需要挂在摄

    2024年02月11日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包