Ogre3D,多个监视器和鼠标光标

时间:2012-03-06 15:34:44

标签: opengl rendering mouse multiple-monitors ogre3d

我正在开发一个需要在OpenGL中进行多头渲染的应用程序。现在,我可以渲染到多个屏幕,但我的鼠标光标的行程仅限于一个屏幕。但是,我希望能够在所有渲染的屏幕上使用鼠标光标。

有没有人遇到同样的问题,如果有的话,你是怎么解决它的?

1 个答案:

答案 0 :(得分:6)

我找到了一个有效的解决方案。首先,我必须在窗口模式而不是全屏模式下实例化我的Ogre::RenderWindow对象 - 通过实例化没有边框的Ogre::RenderWindow对象来模拟全屏模式:

Ogre::NameValuePairList options;
options["left"] = "0";
options["top"] = "0";
options["border"] = "none";
options["monitorIndex"] = "0";
m_pVisWindow[0] = mRoot->createRenderWindow("Window1", 1920, 1200, false, &options);

options["monitorIndex"] = "1";
m_pVizWindow[1] = mRoot->createRenderWindow("Window2", 1920, 1200, false, &options);

options["monitorIndex"] = "2";
m_pVizWindow[2] = mRoot->createRenderWindow("Window3", 1920, 1200, false, &options);

options["monitorIndex"] = "3";
m_pVizWindow[3] = mRoot->createRenderWindow("Window4", 1920, 1200, false, &options);

options["monitorIndex"] = "4";
m_pVizWindow[4] = mRoot->createRenderWindow("Window5", 1920, 1200, false, &options);

options["monitorIndex"] = "5";
m_pVizWindow[5] = mRoot->createRenderWindow("Window6", 1920, 1200, false, &options);

在附加到每个Ogre::FrameListener的{​​{1}}的构造函数中(在这种情况下,继承自Ogre::RenderWindow,我基本上必须销毁现有的ExampleFrameListener并实例化一个新的参数,用于为非独占输入配置mInputManager。有关如何以及为何执行此操作的详细说明,请参见here

OIS

我仍然需要在物理上点击一个特定的渲染窗口才能给它焦点,所以如果有一种方法可以将焦点授予mInputManager->destroyInputObject(mMouse); mInputManager->destroyInputObject(mKeyboard); mInputManager->destroyInputObject(mJoy); OIS::InputManager::destroyInputSystem(mInputManager); // override OIS construction to avoid grabbing mouse OIS::ParamList pl; size_t windowHnd = 0; std::ostringstream windowHndStr; window->getCustomAttribute("WINDOW", &windowHnd); windowHndStr << windowHnd; pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); #if defined OIS_WIN32_PLATFORM pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" ))); pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND"))); pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE"))); #elif defined OIS_LINUX_PLATFORM 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 mInputManager = OIS::InputManager::createInputSystem( pl ); //Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse) mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, false )); mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, false )); try { mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject( OIS::OISJoyStick, false )); } catch(...) { mJoy = 0; } 事件的渲染窗口,那就太好了 - 但是,这适合我现在的需要......