【问题标题】:Ogre3D, Multiple Monitors, and the Mouse CursorOgre3D、多显示器和鼠标光标
【发布时间】:2012-03-06 15:34:44
【问题描述】:

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

有没有人遇到过同样的问题,如果有,您是如何解决的?

【问题讨论】:

    标签: opengl rendering mouse multiple-monitors ogre3d


    【解决方案1】:

    我找到了一个可行的解决方案。首先,我必须在窗口模式而不是全屏模式下实例化我的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::RenderWindowOgre::FrameListener 的构造函数中(在这种情况下,它继承自ExampleFrameListener,我基本上必须销毁现有的mInputManager 并使用用于配置@987654329 的参数实例化一个新的@ @ 用于非排他性输入。有关如何以及为什么这样做的更详细说明,请参见 here

    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;
    }
    

    我仍然必须物理单击特定的渲染窗口才能使其获得焦点,所以如果有一种方法可以在 mouseover 事件上将焦点授予渲染窗口,那就太好了 - 但是,这个适合我现在的需要...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2012-01-24
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多