OSG中LOD的使用

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类,所以它本身可以直接被加入场景中。

你可能感兴趣的:(OSG)