OSG多视口创建:osgViewer::CompositeViewer

news2024/11/26 15:40:48

1、效果

  在osg的实际应用场景中,有时候需要同时创建多个场景视图,并保证各个场景视图中有不一样的显示和操作:例如:漫游器、照相机、粒子效果、多个模型组合等。此时就要用到OSG提供的osgViewer::CompositeViewer类来实现这个需求了。
在这里插入图片描述

2、源码

#include <iostream>

#include <osgUtil/Optimizer>
#include <osgDB/ReadFile>

#include <osg/Material>
#include <osg/Geode>
#include <osg/BlendFunc>
#include <osg/Depth>
#include <osg/Projection>
#include <osg/PolygonOffset>
#include <osg/MatrixTransform>
#include <osg/Camera>
#include <osg/FrontFace>

#include <osgText/Text>

#include <osgGA/TerrainManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>

#include <osgViewer/CompositeViewer>

#include <osg/io_utils>

#pragma comment(lib, "OpenThreadsd.lib")
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgTextd.lib")
#pragma comment(lib, "osgSimd.lib")

int main(int argc, char** argv)
{
	//创建CompositeViewer
	osgViewer::CompositeViewer viewer;

	if (viewer.getNumViews() == 0)
	{

		osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
		if (!wsi)
		{
			osg::notify(osg::NOTICE) << "Error, no WindowSystemInterface available, cannot create windows." << std::endl;
			return 1;
		}

		unsigned int width, height;
		osg::GraphicsContext::ScreenIdentifier main_screen_id;

		main_screen_id.readDISPLAY();
		main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
		wsi->getScreenResolution(main_screen_id, width, height);

		osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
		traits->x = 600;
		traits->y = 400;
		traits->width = 1000;
		traits->height = 800;
		traits->windowDecoration = true;
		traits->doubleBuffer = true;
		traits->sharedContext = 0;
		traits->readDISPLAY();
		traits->setUndefinedScreenDetailsToDefaultScreen();

		osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

		// 第一个视图
		{
			osgViewer::View* view = new osgViewer::View;

			osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("D:\\osg3.6.5_oe3.1\\OpenSceneGraph_Data\\dumptruck.osg");

			view->setName("View one");
			viewer.addView(view);

			view->setSceneData(scene);

			view->getCamera()->setName("Cam three");
			view->getCamera()->setProjectionMatrixAsPerspective(30.0, double(traits->width) / double(traits->height / 2), 1.0, 1000.0);
			view->getCamera()->setViewport(new osg::Viewport(0, traits->height / 2, traits->width / 2, traits->height / 2));
			view->getCamera()->setGraphicsContext(gc.get());
			view->setCameraManipulator(new osgGA::TerrainManipulator);
		}

		// 第二个视图
		{
			osgViewer::View* view = new osgViewer::View;
			view->setName("View two");

			osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("D:\\osg3.6.5_oe3.1\\OpenSceneGraph_Data\\cow.osgt");
			viewer.addView(view);

			view->setSceneData(scene);
			view->getCamera()->setName("Cam two");
			view->getCamera()->setViewport(new osg::Viewport(traits->width / 2, traits->height / 2, traits->width / 2, traits->height / 2));
			view->getCamera()->setGraphicsContext(gc.get());
			view->setCameraManipulator(new osgGA::TerrainManipulator);

		}

		// 第三个视图
		{
			osgViewer::View* view = new osgViewer::View;
			view->setName("View three");

			osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("D:\\osg3.6.5_oe3.1\\OpenSceneGraph_Data\\cessnafire.osgt");
			viewer.addView(view);

			view->setSceneData(scene);
			view->getCamera()->setName("Cam one");
			view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width / 2, traits->height / 2));
			view->getCamera()->setGraphicsContext(gc.get());

			osg::ref_ptr<osgGA::StateSetManipulator> statesetManipulator = new osgGA::StateSetManipulator;
			statesetManipulator->setStateSet(view->getCamera()->getOrCreateStateSet());

			view->setCameraManipulator(new osgGA::TerrainManipulator);
			view->addEventHandler(statesetManipulator.get());

			view->addEventHandler(new osgViewer::StatsHandler);
			view->addEventHandler(new osgViewer::HelpHandler);
			view->addEventHandler(new osgViewer::WindowSizeHandler);
			view->addEventHandler(new osgViewer::ThreadingHandler);
			view->addEventHandler(new osgViewer::RecordCameraPathHandler);
		}


		// 第四个视图
		{
			osgViewer::View* view = new osgViewer::View;
			view->setName("View four");

			osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("D:\\osg3.6.5_oe3.1\\OpenSceneGraph_Data\\robot.osg");
			viewer.addView(view);

			view->setSceneData(scene);
			view->getCamera()->setName("Cam one");
			view->getCamera()->setViewport(new osg::Viewport(traits->width / 2, 0, traits->width / 2, traits->height / 2));
			view->getCamera()->setGraphicsContext(gc.get());

			// add the state manipulator
			osg::ref_ptr<osgGA::StateSetManipulator> statesetManipulator = new osgGA::StateSetManipulator;
			statesetManipulator->setStateSet(view->getCamera()->getOrCreateStateSet());

			view->setCameraManipulator(new osgGA::TerrainManipulator);
			view->addEventHandler(statesetManipulator.get());

			view->addEventHandler(new osgViewer::StatsHandler);
			view->addEventHandler(new osgViewer::HelpHandler);
			view->addEventHandler(new osgViewer::WindowSizeHandler);
			view->addEventHandler(new osgViewer::ThreadingHandler);
			view->addEventHandler(new osgViewer::RecordCameraPathHandler);
		}

	}

	return viewer.run();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言&#xff0c;前端使用HTML、CSS、BootStrap等技术搭建界面平台&#xff0c;后端使用Django框架处理请求&#xff0c;并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…

Jmeter和Postman哪个做接口测试会更好

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

项目实战之理解代码一(vue.config.js)

文章目录 CDN 面经天天背&#xff0c;今天总算见到真的了。 OK&#xff0c;接下来让我们走进前端优化性能方式之一&#xff1a;CDN CDN CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是用于存储和传输静态资源&#xff08;如 JavaScript、CSS…

如何为一个Type类赋值

如何为一个Type类赋值 前言案例准备一、简单赋值 前言 今天我在写代码的时候遇到一个神奇的类——Type,虽然说我们都心知肚明这个类代表着什么&#xff08;字面意思嘛&#xff0c;很好理解&#xff09;&#xff0c;但是实操起来却无从下手&#xff0c;就如何对Type类进行赋值&…

基于 golang 从零到一实现时间轮算法 (二)

Go实现单机版时间轮 上一章介绍了时间轮的相关概念&#xff0c;接下来我们会使用 golang 标准库的定时器工具 time ticker 结合环状数组的设计思路&#xff0c;实现一个单机版的单级时间轮。 首先我们先运行一下下面的源码&#xff0c;看一下如何使用。 https://github.com/x…

一招优化百度网盘下载速度,不开会员也能提高几十倍倍下载速度

​ 百度网盘&#xff08;原百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、Linux信创版、青春版、TV版、iPhone版和iPad版&#xff0c;并覆盖了主流联网车和非联网车。 用…

2023年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材&#xff0c;山东省安全员C证大纲整理…

Python 异常处理:try、except、else 和 finally 的使用指南

异常处理 当发生错误&#xff08;或我们称之为异常&#xff09;时&#xff0c;Python 通常会停止执行并生成错误消息。 try 块用于测试一段代码是否存在错误。 except 块用于处理错误。 else 块用于在没有错误时执行代码。 finally 块用于无论 try 和 except 块的结果如何…

vivado生成bit流错误---[DRC UCIO-1]

拿着开发板的例程&#xff0c;只修改了FPGA芯片&#xff0c;FPGA芯片是同一系列的。运行编译产生bit流出现如下错误 [DRC UCIO-1] Unconstrained Logical Port: 20 out of 22 logical ports have no user assigned specific location constraint (LOC). This may cause I/O con…

U盘显示无媒体怎么办?方法很简单

当出现U盘无媒体情况时&#xff0c;您可以在磁盘管理工具中看到一个空白的磁盘框&#xff0c;并且在文件资源管理器中不会显示出来。那么&#xff0c;导致这种问题的原因是什么呢&#xff1f;我们又该怎么解决呢&#xff1f; 导致U盘无媒体的原因是什么&#xff1f; 当您遇到上…

基于SSM的防疫信息登记系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【WinForm详细教程七】WinForm中的DataGridView控件

文章目录 1.主要属性DataSource行&#xff08;Row 相关属性&#xff09;列&#xff08;Column 相关属性&#xff09;单元格&#xff08;Cell 相关属性&#xff09;逻辑删除AllowUserToAddRowsAllowUserToDeleteRowsAllowUserToOrderColumns其他布局和行为属性 2.控件中的行、列…

昨天面了个哥们,也就问了4个问题,但好像他被我虐了···

公司最近在招自动化测试岗&#xff0c;居然一天内就收了几百份简历&#xff01;想不到吧&#xff1f;&#xff01;都快面吐了&#xff0c;想招一个合适的技术同学太不容易了&#xff0c;需要去挖的细节太多了。一般来说&#xff0c;很多人都会被问接口工具、aap自动化、测试框架…

Docker Swarm实现容器的复制均衡及动态管理:详细过程版

Swarm简介 Swarm是一套较为简单的工具&#xff0c;用以管理Docker集群&#xff0c;使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口&#xff0c;换言之&#xff0c;各种形式的Docker Client(dockerclient in go, docker_py…

YOLO算法改进6【中阶改进篇】:depthwise separable convolution轻量化C3

常规卷积操作 对于一张55像素、三通道&#xff08;shape为553&#xff09;&#xff0c;经过33卷积核的卷积层&#xff08;假设输出通道数为4&#xff0c;则卷积核shape为3334&#xff0c;最终输出4个Feature Map&#xff0c;如果有same padding则尺寸与输入层相同&#xff08;…

基于设深度学习的人脸性别年龄识别系统 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…

R语言657中单色colors颜色索引表---全平台可用

R语言657中单色colors颜色索引表—全平台可用

记一次pdjs时安装glob出现,npm ERR! code ETARGET和npm ERR! code ELIFECYCLE

如往常一样&#xff0c;我使用pdjs来编译proto文件&#xff0c;但出现了以下报错&#xff1a; 大致就是pdjs的util在尝试执行npm install glob^7.2.1 escodegen^1.13.0时出错了 尝试手动执行安装&#xff0c;escodegen被正确安装&#xff0c;但glob^7.2.1出错 npm ERR! code E…

Adobe:受益于人工智能,必被人工智能反噬

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;Adobe(ADBE)受益于生成式人工智能的兴起&#xff0c;其一直能实现两位数的收入增长就证明了这一点。 &#xff08;2&#xff09;在生成式人工智能兴起时&#xff0c;该公司就快…