OSG-视口&LOD&Imposter

转载 2017年08月28日 22:33:11
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html
作者写的比较好,再次收藏,希望更多的人可以看到这个文章

互联网是是一个相互分形并学习的平台,我希望我每个人可以将我们认为有价值的东西,在不损害他人利益的情况下分享给更多的人。


多视口


多视口的原理是自己创建所有的相机,包括主相机,这样我们可以随意的添加相机。
首先我们要创建视口必须有以下几件东西,第一,了解整个屏幕的分辩率有多大,这样可以分辩视口的大小,好分割开来。第二,上下文。我们必须自己手动的打开设置上下文。每个视口的数据也不一定非要与主视口的相同。但是矩阵一般是同步的。也就是说:主视口里有栋楼,从视口里可以是平面图什么的。了解整个屏幕的分辩率可以用这个类:osg::GraphicsContext::WindowingSystemInterface意思是说系统接口,可以获得当前环境的各种信息。有一方法叫getScreenResolution,可以得到分辩率。之后上下文了,osg::GraphicsContext里面可以设置窗口大小,缓存什么的,大多数的东西都在这里面设置。



LOD


LOD即level of details
LOD比起PagedLOD而言并非十分的常用,有个地方用的特别多,那就是把一个好好的模型加一个视矩压成一个模型,这个模型比以前的看来就是多了个视矩的控制,远了看不见,近了能看见。
在模型中加LOD头结点的方式如下所示:


#include<osgDB/Registry>
#include<osgDB/ReadFile>
#include<osgDB/ReaderWri ter>
#include<osgDB/Wri teFile>
#include<osg/Node>
#include<osgViewer/Viewer>
 int main()
{
osgViewer::Viewer viewer;
 //读取模型
osg::Node*node=osgDB::readNodeFile("fountain.osg");
 //隐藏结点
node->asGroup()->getChild(0)->setNodeMask(0);
viewer.setSceneDa ta(node);
 //输出结点到free.os g中 
osgDB::writeNodeFile(*(viewer.getSceneData()),"free.osg",osgDB::Registry
::instance()->getOptions());
 return 0;
}



Imposter


Imposter用动态图片来替换场景的实用技术:imposter.可以把它法做LOD一样使用,只不过它
不是变模型变没有,而是使它换成一张图
示例代码如下:设置一个视矩,超过这个视距模型会变为一张动态图


#include<osgViewer/Viewer>
#include<osgGA/TrackballManipulator>
#include<osgSim/Impostor>
#include<osgDB/ReadFile>
 int main(inta rgc,cha r**a rgv)
{
 //申请viewer
osgViewer::Viewer viewer;
 //读取模型
osg::Node*node=osgDB::readNodeFile("ceep.ive");
 //申请一个i mpos tor结点
osgSim::Impos tor*sim=new osgSim::Impostor;
//在到之内显示模型,之外显示贴图
sim->addChild(node,0,50000);
sim->setImpostorThreshold(1000);
osg::Group*root=new osg::Group;
root->addChild(sim);
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}







关于OSG中各种变换的理解

最近学习OSG到第7章观察我们的世界,与之前学习的OpenGL有一些区别,当然学OpenGL时就一直不太懂各种坐标系以及变换。看了很久,现将内容整理如下。内容来自《OpenGL编程指南》+《OpenS...

16、osg中使用Imposter设置一个视矩,超过这个视距模型会变为一张动态图

代码如下: // fountain.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #inclu...

OSG中LOD的使用

LOD概念LOD是Level Of Detail 的缩写,LOD允许程序根据摄像机与物体的距离,来决定使用哪个模型。为什么要使用LOD使用LOD是为了兼顾程序的运行效率与物体显示的精细程度。当物体离摄...

15、osg中使用LOD设置当模型超过多少米,不显示模型

如下代码: // fountain.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #inclu...

osg中的LOD类

LOD () LOD (const LOD &, const CopyOp ©op=CopyOp::SHALLOW_COPY) 说明:构造函数,第二个构造函数为从已知的LOD构造新的LOD...

osg lod pageLOD 区别+模型节点状态比较

osg:: LOD;细节层次节点;根据观察者与LOD节点距离的层次变化,显示不同的子节点;osgspheresegment osg:: PagedLOD:分页细节层次节点;它与LOD节点的主要区别是可...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

osg demo26 LOD头结点

//DEMO26 //功能:输出free.osg ,这个模型是fountain的变换,使fountain在3000米外不显示 #include #include #include #incl...

OSG LOD示例

#include #include #include #include #include #include int main() { osg::ref_ptr

OSG_LOD细节层次模型

  • 2012年12月20日 11:20
  • 13KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG-视口&LOD&Imposter
举报原因:
原因补充:

(最多只允许输入30个字)