八、OSG学习笔记-

诗林  金牌会员 | 2025-2-18 01:56:45 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 718|帖子 718|积分 2154

前一章节:
        七、OSG学习笔记-碰撞检测-CSDN博客
https://blog.csdn.net/weixin_36323170/article/details/145558132?spm=1001.2014.3001.5501
一、了解OSG图元加载显示流程
本章节代码:
OsgStudy/wids · CuiQingCheng/OsgStudy - 码云 - 开源中国
https://gitee.com/cuiqingcheng/osg-study/tree/master/OsgStudy/wids
图解流程:

这里主要涉及的头文件类为:
  1. #include<osgViewer/Viewer> // 依赖该文件
  2. #include<osg/GraphicsContext> // 图形界面类
  3. osg::GraphicsContext::WindowingSystemInterface // 设备类
复制代码
  1. #include<windows.h>
  2. #include<iostream>
  3. #include<osgViewer/Viewer> // 依赖该文件
  4. #include<osg/GraphicsContext> // 图形界面类
  5. int main()
  6. {
  7.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  8.         // osg::GraphicsContext::WindowingSystemInterface 为 Viewer,中静态创建的,只需要有Viewer,就可以了。
  9.         osg::GraphicsContext::WindowingSystemInterface* ws = osg::GraphicsContext::getWindowingSystemInterface();
  10.         if (!ws)
  11.         {
  12.                 std::cout << "Get device interface failure, WindowingSystemInterface is Null" << std::endl;
  13.         }
  14.         else
  15.         {
  16. // ws 就是设备窗口的对象。
  17.                 std::cout << "Get device interface success!" << std::endl;              
  18.         }
  19.         return 0;
  20. }
复制代码
下面代码中用于获取装备分辨率,跟设置分辨率:
  1. #include<windows.h>
  2. #include<iostream>
  3. #include<osgViewer/Viewer>
  4. #include<osg/GraphicsContext>
  5. int main()
  6. {
  7.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  8.         // osg::GraphicsContext::WindowingSystemInterface 为 Viewer,中静态创建的,只需要有Viewer,就可以了。
  9.         osg::GraphicsContext::WindowingSystemInterface* ws = osg::GraphicsContext::getWindowingSystemInterface();
  10.         unsigned int height = 0;
  11.         unsigned int width = 0;
  12.         // 用于配置图形上下文(如窗口或离屏渲染环境)的核心类。
  13.         // Traits: 类的主要功能是定义图形上下文的初始化属性,包括窗口属性、硬件加速选项、缓冲区配置等。
  14.         //               通过设置其成员变量,开发者可以灵活控制 OSG 应用程序的渲染环境。
  15.         osg::GraphicsContext::Traits traits;
  16.         if (!ws)
  17.         {
  18.                 std::cout << "Get device interface failure, WindowingSystemInterface is Null" << std::endl;
  19.         }
  20.         else
  21.         {
  22.                 std::cout << "Get device interface success!" << std::endl;
  23.                 ws->getScreenResolution(traits, width, height);
  24.                 std::cout << "系统分辨率为:" << width << " X " << height << std::endl;
  25.                 std::cout << "边框:" << traits.windowDecoration << std::endl;
  26.                 traits.x = 0;
  27.                 traits.y = 0;
  28.                 traits.width = 800;
  29.                 traits.height = 600;
  30.                 // 还可以设置设备的分辨率:(谨慎使用)
  31.                 ws->setScreenResolution(traits, 800, 600);//这句代码后两个参数会修改屏幕分辨率。
  32.         }
  33.         return 0;
  34. }
复制代码
程序执行效果如下图:

windows,中查看显示设置,如下图,效果外貌二者效果一致,获取正确。

调整窗口巨细:
代码如下:
  1. #include<windows.h>
  2. #include<iostream>
  3. #include<osgViewer/Viewer>
  4. #include<osgViewer/ViewerEventHandlers>
  5. #include <osg/GraphicsContext>
  6. #include <osgDB/ReadFile>
  7. // UI事件
  8. #include<osgGA/GUIEventHandler>
  9. #include<osgGA/GUIActionAdapter>
  10. class ChangeWindow : public osgGA::GUIEventHandler
  11. {
  12. public:
  13.         ChangeWindow() {
  14.                 m_first = false;
  15.         }
  16.         bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
  17.         {
  18.                 if (!m_first)
  19.                 {
  20.                         osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
  21.                         osgViewer::Viewer::Windows ws;
  22.                         m_first = true;
  23.                         viewer->getWindows(ws);
  24.                         if (!ws.empty())
  25.                         {
  26.                                 // 设置窗口大小,启始坐标:
  27.                                 osgViewer::Viewer::Windows::iterator iter = ws.begin();
  28.                                 for (; iter != ws.end(); iter++)
  29.                                 {
  30.                                         (*iter)->setWindowRectangle(320, 100, 1600, 1000);
  31.                                         // 去除边框:
  32.                                         (*iter)->setWindowDecoration(false);
  33.                                         // 设置不使用鼠标
  34.                                         //(*iter)->useCursor(false);
  35.                                         // 设置鼠标样式
  36.                                         (*iter)->setCursor(osgViewer::GraphicsWindow::WaitCursor);
  37.                                 }
  38.                         }
  39.                 }
  40.                 return false;
  41.         }
  42. private:
  43.         bool m_first{false};
  44. };
  45. int main()
  46. {
  47.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  48.         osgViewer::Viewer::Windows ws;
  49.         viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
  50.         viewer->getWindows(ws);
  51.         if (ws.empty())
  52.         {
  53.                 std::cout << "has not create windows" << std::endl;
  54.         }
  55.         viewer->addEventHandler(new ChangeWindow());
  56.        
  57.         viewer->run(); //  run 函数中创建窗口。
  58.         return 0;
  59. }
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表