场景图形管理-多视图与相机(3)

这篇具有很好参考价值的文章主要介绍了场景图形管理-多视图与相机(3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在OSG中多视图的管理是通过osgViewer::CompositeViewer类来实现的。该类负责多个视图的管理及同步工作,继承自osgViewer;:ViewerBase类,继承关系图如图8-13所示

场景图形管理-多视图与相机(3),OSG,c++,图形渲染,3d

图8-13 osgViewer::CompositeViewer 的继承关系图

        在前面已经讲到,osgViewer:ViewerBase 类主要负责线程管理设置线程模式启动线程等工作在多视图渲染时,线程管理一直都是一个令人非常头痛的问题,但这些底层工作在 osgViewer::CompositeViewer类中已经实现了。如果读者想了解得更详细,可参看osgViewer/CompositeViewer.cpp源代码。

        对于osgViewer::CompositeViewer,它内部已经包含了多个视图(osg::View),使用它来表示一个视图当然是可以的,此时osgViewer:CompositeViewer 的作用与标准的osgViewer::Viewer 对象并无太大差别,但是比起每次只管理一个视图的情形来说,管理和使用多个视图还是显得略微麻烦。因此,建议在只有一个视图时尽量选择使用 osgViewer::Viewer。当然,有时可能需要用到不止一个视图,也可能在多个视口内显示同一视图的内容(如多数 CAD 软件),或同时显示一个3D场景和一幅小地图视图,或读取多个模型文件并分别独立地进行控制。对于这些程序来说,往往需要在一个或多个场景(osgVicwer:Scene)上管理多个视图(osgView)此时程序的管理方式要比单独的osgViewer.:Viewer情形下复杂得多。事实上,程序的细节程度总是与问题的复杂程度成比例的,因此,我们有必要在正确的条件下选择正确的实现方式。

        在osgViewer:CompositeViewer中添加视图或移除视图可以用下面的成员函数:

void addView(osgViewer.:View*view)//添加一个视图
void removeView(osgViewer::View*view)//移除一个视图
osgViewer::View *getView(unsigned i) //得到视图的索引
const  osgViewer::View *getView(unsigned i)const//得到视图的索引
unsigned int getNumViews() const//得到视图的个数

        在论坛上,有很多人会提问如何来做一个“鹰眼”,其实,这是比较简单的实现。用osgViewer.:CompositeViewer类实现多视图管理,让一个小地图HUD显示一个视图,另一个视图染主窗口即可。本书并没有专门提供一个相关的例子,读者可以通过修改本书的例子来自行完成

  1. 多视图相机渲染示例

        多视图相机渲染示例的代码如程序清单8-5所示

// 多视图相机渲染示例
void compositeViewer_8_5(const string &strDataFolder)
{
	// 创建CompositeViewer对象
	osg::ref_ptr<osgViewer::CompositeViewer> viewer = new osgViewer::CompositeViewer();

	// 获取牛的模型
	string strDataPath = strDataFolder + "cow.osg";
	osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile(strDataPath);

	// 读取飞机模型
	strDataPath = strDataFolder + "cessna.osg";
	osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile(strDataPath);

	// 优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(cow.get());
	optimizer.optimize(cessna.get());

	// 设置图形环境特性
	osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
	traits->x = 100;
	traits->y = 100;
	traits->width = 900;
	traits->height = 700;
	traits->windowDecoration = true;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;

	// 创建图形环境特性
	osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
	if (gc->valid())
	{
		osg::notify(osg::INFO) << " GraphicsWIndow has been created successfully." << endl;

		// 清除窗口颜色及颜色和深度缓冲
		gc->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.6f, 1.0f));
		gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	}
	else
	{
		osg::notify(osg::NOTICE) << " GrraphicsWidnow has not been created successfully." << endl;
	}

	//视图1
	{
		// 创建视图1
		osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
		viewer->addView(view.get());

		// 设置视图场景数据
		view->setSceneData(cow.get());

		// 设置相机视口及图形环境
		view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width / 2, traits->height / 2));
		view->getCamera()->setGraphicsContext(gc.get());

		// 设置操作器
		view->setCameraManipulator(new osgGA::TrackballManipulator);

		// 添加事件处理
		view->addEventHandler(new osgViewer::StatsHandler);
		view->addEventHandler(new osgViewer::WindowSizeHandler);
		view->addEventHandler(new osgViewer::ThreadingHandler);
		view->addEventHandler(new osgViewer::RecordCameraPathHandler);
	}

	// 视图2
	{
		osg::ref_ptr<osgViewer::View> view = new osgViewer::Viewer;
		viewer->addView(view.get());

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

		view->setCameraManipulator(new osgGA::TrackballManipulator);
	}

	// 视图3
	{
		osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
		viewer->addView(view.get());
		view->setSceneData(cessna.get());

		// 根据分辨率确定合适的投影来保证显示的图形不变形
		double fovy, aspectRatio, zNear, zFar;
		view->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
		double newAspectRatio = double(traits->width) / double(traits->height/2);
		double aspectRaitoChange = newAspectRatio / aspectRatio;
		if (aspectRaitoChange != 1.0)
		{
			view->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRaitoChange, 1.0, 1.0);
		}

		view->getCamera()->setViewport(new osg::Viewport(0, traits->height / 2, traits->width, traits->height / 2));
		view->getCamera()->setGraphicsContext(gc.get());
		view->setCameraManipulator(new osgGA::TrackballManipulator);
	}

	viewer->realize();
	viewer->run();
}

        运行程序,截图如图8-14所示

场景图形管理-多视图与相机(3),OSG,c++,图形渲染,3d

图8-14多视图相机渲染示例截图文章来源地址https://www.toymoban.com/news/detail-784739.html

到了这里,关于场景图形管理-多视图与相机(3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图形学】30 前向渲染多光照场景代码理解

    来源:《UNITY SHADER入门精要》   我们现在要注意光源的 5 个属性: 位置、方向、颜色、强度、衰减 。   在理解代码之前,我们依然需要熟悉我们的理论,主要我们要设置两个 Pass,注意它们的不同的特性,和要做的事情。   注意,据书中所说,注意两个 Pass 中的 #

    2023年04月20日
    浏览(26)
  • 【Unity 3D绳索】基于图形渲染的3D绳索模拟

            前一段被要求模拟一根绳索,因为种种原因,笔者最后决定通过数学函数和Mesh模拟出一根绳索,具体的思路是首先利用Verlet函数模拟绳索的刚性,之后利用Mesh渲染圆柱体将绳索模拟出来。                  首先,利用Verlet进行逻辑上的绳索创建,具体思路参考

    2024年04月29日
    浏览(28)
  • 3d效果图的应用场景和3d渲染的发展前景

    3D效果图一直都是视觉行业非常重要的一部分,它在不同领域都有广泛应用,通过效果图,设计师能够准确展示设计方案,方便沟通。本文将深入分析3D效果图在不同场景中的应用和未来发展趋势。 1、建筑领域 在建筑领域中,3D效果图被用于房屋、商场和酒店等的设计,通过

    2024年01月23日
    浏览(45)
  • 计算机图形学:绘制一个3d交互场景(1)

    OpenGL作为一种图形与硬件的接口,与其他图形程序开发工具相比较,它提供了众多图形函数,直观的编程环境简化了三维图形的绘制过程,使用OpenGL搭建一个三维场景,能够通过输入设备与场景内物体交互。 豪华单间 配置环境:vs22+freeglut库 1.绘制墙体使其成为封闭空间,在

    2024年02月11日
    浏览(82)
  • 计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

    《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis 》 摘要 我们见证了3D感知图像合成的快速进展,利用了生成视觉模型和神经渲染的最新进展。然而,现有的方法在两方面存在不足:首先,它们可能缺乏底层的3D表示,或者依赖于视图不一致的渲染,从而合

    2024年02月14日
    浏览(52)
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(39)
  • 【URP趟坑】Unity在URP中使用RenderTexture在UI中渲染带透明相机背景的PostProcessing场景

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近有个需求,需要使用Unity的URP通用管线来开发项目,其中有个场景是需要在UI中显示动态的角色模型,而且背景是透明的。初闻这个需求感觉挺简单的,普通管线下使用Rendertexture输出相机视角的内容

    2024年02月04日
    浏览(28)
  • 计算机视觉与图形学-神经渲染专题-Seal-3D(基于NeRF的像素级交互式编辑)

    摘要 随着隐式神经表示或神经辐射场 (NeRF) 的流行,迫切需要与隐式 3D 模型交互的编辑方法,以完成后处理重建场景和 3D 内容创建等任务。虽然之前的作品从不同角度探索了 NeRF 编辑,但它们在编辑灵活性、质量和速度方面受到限制,无法提供直接的编辑响应和即时预览。

    2024年02月13日
    浏览(32)
  • 3d场景重建&图像渲染 | 神经辐射场NeRF(Neural Radiance Fields)

         NeRF(Neural Radiance Fields,神经辐射场)是一种用于 3D场景重建和图像渲染 的深度学习方法。它由Ben Mildenhall等人在2020年的论文《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》中首次提出。NeRF通过学习场景的连续体积密度和颜色分布, 能够从任意视角准确地渲

    2024年03月17日
    浏览(63)
  • OSG三维渲染引擎编程学习之八十五:“第八章:OSG文字” 之 “8.4 文字特效实例”

    目录 第八章 OSG文字 8.4 文字特效实例       适当的文字信息对于显示场景信息是非常重要的。在OSG中,osgText提供了向场景中添加文字的强大功能,由于有第三方插件FreeType的支撑,可完全支持TrueType字体。       TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包