LOD概念
LOD是Level Of Detail 的缩写,LOD允许程序根据摄像机与物体的距离,来决定使用哪个模型。
为什么要使用LOD
使用LOD是为了兼顾程序的运行效率与物体显示的精细程度。当物体离摄像机很远的时候,物体看起来就是一个点,这时候你使用再精细的模型,最终屏幕上成像也是一个点。而你用的模型越精细,计算机内部需要的计算量越大。所以当物体离相机远的时候,使用粗略模型,当物体离相机近的时候,使用精细模型。
OSG中LOD的使用
#include <osg/LOD>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
int main(int argc, char** argv)
{
osg::ref_ptr<osg::LOD> lod = new osg::LOD();
lod->addChild(osgDB::readNodeFile("cow.osg"), 0.0f, 20);
lod->addChild(osgDB::readNodeFile("cessna.osg"), 20, 100);
lod->addChild(osgDB::readNodeFile("clock.osgt"), 100, FLT_MAX);
osgViewer::Viewer viewer;
viewer.setSceneData(lod.get());
return viewer.run();
}
要运行上述代码,确保已经下载了OSG Data,并将OSG Data路径加入了环境变量中。
OSG中的LOD的使用比较简单,OSG内部已经给我们处理好了,只需要告诉OSG,在什么距离范围内,使用使用模型就可以了。比如上面代码,物体与摄像机距离在0~20的范围内,使用牛的模型(cow.osg),在20~100的范围内,使用飞机模型(cessna.osg),在100~FLT_MAX的范围内,使用时钟模型(clock.osgt)。
另外,由于osg::LOD继承自Group类,所以它本身可以直接被加入场景中。