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

八、OSG学习笔记-

前一章节:

        七、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

图解流程:

这里主要涉及的头文件类为:

#include<osgViewer/Viewer> // 依赖该文件

#include<osg/GraphicsContext> // 图形界面类
osg::GraphicsContext::WindowingSystemInterface // 设备类
#include<windows.h>
#include<iostream>
#include<osgViewer/Viewer> // 依赖该文件

#include<osg/GraphicsContext> // 图形界面类

int main()
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	// osg::GraphicsContext::WindowingSystemInterface 为 Viewer,中静态创建的,只需要有Viewer,就可以了。
	osg::GraphicsContext::WindowingSystemInterface* ws = osg::GraphicsContext::getWindowingSystemInterface();
	if (!ws)
	{
		std::cout << "Get device interface failure, WindowingSystemInterface is Null" << std::endl;
	}
	else
	{
 // ws 就是设备窗口的对象。
		std::cout << "Get device interface success!" << std::endl;              
	}
	return 0;
}

下面代码中用于获取设备分辨率,跟设置分辨率:

#include<windows.h>
#include<iostream>
#include<osgViewer/Viewer>
#include<osg/GraphicsContext>


int main()
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	// osg::GraphicsContext::WindowingSystemInterface 为 Viewer,中静态创建的,只需要有Viewer,就可以了。
	osg::GraphicsContext::WindowingSystemInterface* ws = osg::GraphicsContext::getWindowingSystemInterface();
	unsigned int height = 0;
	unsigned int width = 0;

	// 用于配置图形上下文(如窗口或离屏渲染环境)的核心类。
	// Traits: 类的主要功能是定义图形上下文的初始化属性,包括窗口属性、硬件加速选项、缓冲区配置等。
	//	       通过设置其成员变量,开发者可以灵活控制 OSG 应用程序的渲染环境。
	osg::GraphicsContext::Traits traits;

	if (!ws)
	{
		std::cout << "Get device interface failure, WindowingSystemInterface is Null" << std::endl;
	}
	else
	{
		std::cout << "Get device interface success!" << std::endl;
		ws->getScreenResolution(traits, width, height);
		std::cout << "系统分辨率为:" << width << " X " << height << std::endl;
		std::cout << "边框:" << traits.windowDecoration << std::endl;
		traits.x = 0;
		traits.y = 0;
		traits.width = 800;
		traits.height = 600;
		// 还可以设置设备的分辨率:(谨慎使用)
		ws->setScreenResolution(traits, 800, 600);//这句代码后两个参数会修改屏幕分辨率。

	}
	return 0;
}

程序执行结果如下图:

windows,中查看显示设置,如下图,结果表面二者结果一致,获取正确。

调整窗口大小:

代码如下:

#include<windows.h>
#include<iostream>

#include<osgViewer/Viewer>
#include<osgViewer/ViewerEventHandlers>
#include <osg/GraphicsContext>
#include <osgDB/ReadFile>

// UI事件
#include<osgGA/GUIEventHandler>
#include<osgGA/GUIActionAdapter>

class ChangeWindow : public osgGA::GUIEventHandler
{
public:
	ChangeWindow() {
		m_first = false;
	}
	bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
	{
		if (!m_first)
		{
			osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
			osgViewer::Viewer::Windows ws;
			m_first = true;
			viewer->getWindows(ws);
			if (!ws.empty())
			{
				// 设置窗口大小,启始坐标:
				osgViewer::Viewer::Windows::iterator iter = ws.begin();
				for (; iter != ws.end(); iter++)
				{
					(*iter)->setWindowRectangle(320, 100, 1600, 1000);

					// 去除边框:
					(*iter)->setWindowDecoration(false);

					// 设置不使用鼠标
					//(*iter)->useCursor(false);

					// 设置鼠标样式
					(*iter)->setCursor(osgViewer::GraphicsWindow::WaitCursor);
				}
			}
		}
		return false;
	}

private:
	bool m_first{false};
};

int main()
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	osgViewer::Viewer::Windows ws;

	viewer->setSceneData(osgDB::readNodeFile("glider.osg"));

	viewer->getWindows(ws);
	if (ws.empty())
	{
		std::cout << "has not create windows" << std::endl;
	}
	viewer->addEventHandler(new ChangeWindow());
	
	viewer->run(); //  run 函数中创建窗口。
	return 0;
}

相关文章:

  • spring cloud 微服务部署(2025年)第四章:Nacos、LoadBalancer、GateWay、Ribbon集成之跨服务调用ribbon
  • 【CSS进阶】CSS元素的水平、垂直居中方法
  • C++ 实践扩展(Qt Creator 联动 Visual Studio 2022)
  • 【线段树模板】
  • 今日AI和商界事件(2025-02-15)
  • Halo 配置QQ邮箱验证教程
  • jenkins 配置ssh拉取gitlab
  • 基于nuScenes数据集和DeepSeek模型的端到端自动驾驶解决方案
  • 文件夹上传到github分支最后github上面还是没有文件和文件夹
  • 3.从零开始学会Vue--{{生命周期,工程化,组件化}}
  • 素数环(信息学奥赛一本通-2110)
  • 对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端
  • C++ Primer 返回值和return语句
  • 数组_长度最小的子数组
  • 1-2 gitee创建远程仓库
  • 题解:洛谷 P4054 [JSOI2009] 计数问题
  • Beszel监控Docker安装
  • 变相提高大模型上下文长度-RAG文档压缩-3.优化map-reduce(reranker过滤+社区聚类)
  • 华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
  • Redis进阶使用
  • 中国巴西民间推动建立经第三方验证的“森林友好型”牛肉供应链
  • 马上评丨岂能为流量拿自己的生命开玩笑
  • 专访|导演刘江:给谍战题材注入现实主义的魂
  • 十大券商看后市|A股中枢有望逐步震荡抬升,把握结构性行情
  • 年轻小将绽放光芒!中国短跑男女接力队直通东京世锦赛
  • 江西省司法厅厅长张强已任江西省委政法委分管日常工作副书记