
рдкрд░рд┐рдЪрдп
рддреАрди-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдП рдЧрдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рдмрдбрд╝реА рджреБрдирд┐рдпрд╛" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ - рдордВрдЪ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрд╕реАрдорд┐рдд рдЖрдВрджреЛрд▓рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рд╡рд╛рд▓реЗ рд▓рдВрдмреЗ рджреГрд╢реНрдпред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рдордЭрджрд╛рд░ рд╕реАрдорд╛рдУрдВ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг: OSG рдЗрдВрдЬрди рдкрд░ рд░реЗрд▓рд╡реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╕рдордп "рдмрдбрд╝реА рджреБрдирд┐рдпрд╛"ред рд╡рд╣ рд╕рдм рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЯреНрд░реЗрди рдХреЗ рдкреАрдЫреЗ рджреБрдирд┐рдпрд╛ рдХреЛ рдЦрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рдВрдЧреВрд░реЛрдВ рдХреЛ ...рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЖрд╡реЗрджрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИ: рдХреЗрд╡рд▓ рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдореЙрдбрд▓, рдмрдирд╛рд╡рдЯ рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ; рджреВрд░рд╕реНрде рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░ рдореЗрдВ рдХрдореА; рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рд╕реЗ рдЕрдм рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддрд╛рд░рдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдЧреЗрдо рдЗрдВрдЬрди рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдЬ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕реЗ OpenSceneGraph рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
1. рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░ (LOD) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╕реЗ рдЗрд╕рдХреА рджреВрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рддреАрди-рдЖрдпрд╛рдореА рдореЙрдбрд▓ рдХреЗ рдЫреЛрдЯреЗ рд╡рд┐рд╡рд░рдг рдПрдХ рдмрдбрд╝реА рджреВрд░реА рдкрд░ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдмрдлрд░ рдореЗрдВ рдХреБрд▓ рдЬреНрдпрд╛рдорд┐рддреАрдп рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕реАрдорд╛ рдХреЛ рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬреЛ рдмрдбрд╝реА рдЦреБрд▓реА рджреБрдирд┐рдпрд╛ рдмрдирд╛рддреЗ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред
OSG рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ osg :: LOD рд╡рд░реНрдЧ, рдЬреЛ рдПрдХ рд╣реА osg :: рд╕рдореВрд╣ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рджреВрд░реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд▓рди рдореЗрдВ рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЗрд╕ рд╕реНрддрд░ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
osg :: LOD рдЖрдкрдХреЛ рдЗрд╕ рд░реЗрдВрдЬ рдХреЛ рддреБрд░рдВрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдмрд╛рд▓ рдиреЛрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╕реЗрдЯрд░реЗрдВрдЬ (рдЕрдиреНрдп рддрд░реАрдХреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
osg::ref_ptr<osg::LOD> lodNode = new osg::LOD; lodNode->addChild(node2, 500.0f, FLT_MAX); lodNode->addChild(node1); . . . lodNode->setRange(1, 0.0f, 500.0f);
рд╣рдо рд╕реЗрд╕рдирд╛ рдХреЛ рдкреАрдбрд╝рд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ
рд▓реЛрдж рдЙрджрд╛рд╣рд░рдгmain.h #ifndef MAIN_H #define MAIN_H #include <osg/LOD> #include <osgDB/ReadFile> #include <osgUtil/Simplifier> #include <osgViewer/Viewer> #endif
main.h #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> modelL3 = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Node> modelL2 = dynamic_cast<osg::Node *>(modelL3->clone(osg::CopyOp::DEEP_COPY_ALL)); osg::ref_ptr<osg::Node> modelL1 = dynamic_cast<osg::Node *>(modelL3->clone(osg::CopyOp::DEEP_COPY_ALL)); osgUtil::Simplifier simplifer; simplifer.setSampleRatio(0.5f); modelL2->accept(simplifer); simplifer.setSampleRatio(0.1f); modelL1->accept(simplifer); osg::ref_ptr<osg::LOD> root = new osg::LOD; root->addChild(modelL1.get(), 200.0f, FLT_MAX); root->addChild(modelL2.get(), 50.0f, 200.0f); root->addChild(modelL3.get(), 0.0f, 50.0f); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЙрдбрд▓ рд▓реЛрдб рдХрд░реЗрдВ
osg::ref_ptr<osg::Node> modelL3 = osgDB::readNodeFile("../data/cessna.osg");
рдЕрдм рдЖрдкрдХреЛ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрдИ (рд╣рдо рдЦреБрдж рдХреЛ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗ) рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓реЛрди () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдиреЛрдб рдХреЗ рд▓рд┐рдП, рдХрдХреНрд╖рд╛ рдХреА рддрдерд╛рдХрдерд┐рдд "рдЧрд╣рд░реА" рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рджреЛ рдмрд╛рд░ рднрд░реА рд╣реБрдИ рдиреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред
osg::ref_ptr<osg::Node> modelL2 = dynamic_cast<osg::Node *>(modelL3->clone(osg::CopyOp::DEEP_COPY_ALL)); osg::ref_ptr<osg::Node> modelL1 = dynamic_cast<osg::Node *>(modelL3->clone(osg::CopyOp::DEEP_COPY_ALL));
рдЕрдм рд╣рдо рдЗрди рдореЙрдбрд▓реЛрдВ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВ osgUtil рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП :: рд╕рд┐рдВрдкрд▓реАрдлрд╝рд╛рдпрд░ рдХреНрд▓рд╛рд╕ред рдореЙрдбрд▓ рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреА рдбрд┐рдЧреНрд░реА рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕реЗрдЯрд╕рдореНрдкрд▓рд┐рдпреЛ рдЕрдиреБрдкрд╛рдд () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ - рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдХрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдЙрддрдирд╛ рд╣реА рдХрдо рд╡рд┐рд╕реНрддреГрдд рд╣реЛрдЧрд╛ред
osgUtil::Simplifier simplifer; simplifer.setSampleRatio(0.5f); modelL2->accept(simplifer); simplifer.setSampleRatio(0.1f); modelL1->accept(simplifer);
рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЗ рдореЙрдбрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдиреЛрдб рдореЗрдВ рдЪрд╛рд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдСрд╕рдЧ :: LOD рдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрддрд░ рдХреА рдкреНрд░рджрд░реНрд╢рди рджреВрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
osg::ref_ptr<osg::LOD> root = new osg::LOD; root->addChild(modelL1.get(), 200.0f, FLT_MAX); root->addChild(modelL2.get(), 50.0f, 200.0f); root->addChild(modelL3.get(), 0.0f, 50.0f);
FLT_MAX рдХрд╛ рдорддрд▓рдм рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП "рдЕрд╕реАрдо" рдмрдбрд╝реА рджреВрд░реА рд╣реИред рджрд░реНрд╢рдХ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ
рд╡рд┐рд╡рд░рдг 3 рдХрд╛ рд╕реНрддрд░

рд╡рд┐рд╕реНрддрд╛рд░ 2 рдХрд╛ рд╕реНрддрд░

рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╕реНрддрд░ 1

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХреИрдорд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЬреНрдпрд╛рдорд┐рддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрдо рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЗ рдЙрдЪреНрдЪ рдпрдерд╛рд░реНрдерд╡рд╛рдж рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2. рджреГрд╢реНрдп рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рд▓реЛрдбрд┐рдВрдЧ рддрдХрдиреАрдХ
OSG рдЗрдВрдЬрди рдУрд╕реНрдЧ :: рдкреНрд░реЛрдХреНрд╕реАрдиреЛрдб рдФрд░ рдСрд╕реНрдЧ :: PagedLOD рдХреНрд▓рд╛рд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджреГрд╢реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдСрд░реНрдЧ :: рд╕рдореВрд╣ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
Osg рдХрд╛ рдПрдХ рдиреЛрдб :: ProxyNode рдкреНрд░рдХрд╛рд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЙрдиреНрдЪ рд╕рдордп рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рджреГрд╢реНрдп рдореЗрдВ рдбрд┐рд╕реНрдХ рд╕реЗ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдореЙрдбрд▓реЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрд╣ рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореЙрдбрд▓ рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рд▓реЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рд╕реНрдХ рдкрд░ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setFileName () addChild (рдХреЗ рдмрдЬрд╛рдп) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
Osg :: PagedNode рдиреЛрдб рдХреЛ osg :: LOD рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ OpenGL рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рджреГрд╢реНрдп рдХреЗ рд╕реБрдЪрд╛рд░реВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
3. рдореЙрдбрд▓ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ (рд░рдирдЯрд╛рдЗрдо) рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдУрдПрд╕рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ :: ProxyNode рд╣реЛрддреА рд╣реИред
рд╕рдореАрдкрд╕реНрде рдЙрджрд╛рд╣рд░рдгmain.h #ifndef MAIN_H #define MAIN_H #include <osg/ProxyNode> #include <osgViewer/Viewer> #endif
main.cpp #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::ProxyNode> root = new osg::ProxyNode; root->setFileName(0, "../data/cow.osg"); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); }
рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╣реИ
osg::ref_ptr<osg::ProxyNode> root = new osg::ProxyNode; root->setFileName(0, "../data/cow.osg");
рдЧрд╛рдп рдореЙрдбрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд░реВрдЯ рдиреЛрдб рдХреЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореЙрдбрд▓ рдФрд░ рдЪрд╛рдЗрд▓реНрдб рдиреЛрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рдореЙрдбрд▓ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ - рдХреИрдорд░рд╛ рд╕реАрдзреЗ рдЧрд╛рдп рдХреЗ рджрд░реНрдкрдг рдкрдХреНрд╖ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд░реЗрдВрдбрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдХреИрдорд░рд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдм рдиреЛрдб 0 рдЕрднреА рддрдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛ред рджрд░реНрд╢рдХ рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдХреИрдорд░рд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЙрдбрд▓ рд▓реЛрдб рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо рдорд╛рдЙрд╕ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЛрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? osg :: ProxyNode рдФрд░ osg :: PagedLOD рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред OSG рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рднреЗрдЬ рджреЗрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдореЗрдВ рд▓реЛрдб рдХрд░ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдпрд╣ рддрдВрддреНрд░ рдХрдИ рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рд╕реНрдХ рдФрд░ рдбрд╛рдпрдирд╛рдорд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрдВрдЬрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд░реЗрдВрдбрд░ рдУрд╡рд░рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ osg :: ProxyNode рдиреЛрдбреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░реЙрдХреНрд╕реА рдиреЛрдб рдХреА рддрд░рд╣, рдУрдПрд╕рдЬреА :: PagedLOD рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрдлрд┐рд▓рдиреЗрдо () рд╡рд┐рдзрд┐ рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрддрд╛ рд░реЗрдВрдЬ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдУрдПрд╕рдЬреА :: рдПрд▓рдУрдбреА рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╣реИред рдмрд╢рд░реНрддреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ cessna.osg рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕реНрддрд░ L1 рдХрд╛ рдПрдХ рд▓реЛ-рдкреЙрд▓реА рдореЙрдбрд▓ рд╣реИ, рд╣рдо рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ p рдиреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
osg::ref_ptr<osg::PagedLOD> pagedLOD = new osg::PagedLOD; pagedLOD->addChild(modelL1, 200.0f, FLT_MAX ); pagedLOD->setFileName( 1, "cessna.osg" ); pagedLOD->setRange( 1, 0.0f, 200.0f );
рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓рдПрд▓ 1 рдиреЛрдб рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рдЕрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдЪреНрдЪрд╛ рдЧреИрд░-рдкреНрд░реЙрдХреНрд╕реА рдиреЛрдб рд╣реИред
рдЬрдм рдкреНрд░рддрд┐рдкрд╛рджрди, рдУрдПрд╕рдЬреА рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ :: LOD рдФрд░ osg :: PagedLOD рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╕реЗрд╕ :: рдореЗрдЯреНрд░рд┐рдХреНрд╕рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╕рдирд╛ рдореЙрдбрд▓реЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕рдореВрд╣ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
osg::Node* createLODNode( const osg::Vec3& pos ) { osg::ref_ptr<osg::PagedLOD> pagedLOD = new osg::PagedLOD; тАж osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform; mt->setMatrix( osg::Matrix::translate(pos) ); mt->addChild( pagedLOD.get() ); return mt.release(); }
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреЛ 10,000 рд╡рд┐рдорд╛рдиреЛрдВ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
main.h #ifndef MAIN_H #define MAIN_H #include <osg/PagedLOD> #include <osg/MatrixTransform> #include <osgViewer/Viewer> #endif
main.cpp #include "main.h"
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдорд╛рди 50 рд╕рдордиреНрд╡рдп рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдорд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЗрд╡рд▓ рд╡реЗ рд╕реЗрд╕рдирд╛ рдЬреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ рд╡рд┐рдорд╛рди рдЬреЛ рдлреНрд░реЗрдо рд╕реЗ рдЧрд╛рдпрдм рд╣реЛрддреЗ рд╣реИрдВ рд╡реЗ рджреГрд╢реНрдп рдкреЗрдбрд╝ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖
OpenSceneGraph рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рдкрд╛рда рд╣рд╛рдЙ рдЯреВ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдЕрдВрддрд┐рдо рд╣реЛрдЧрд╛ред рдмрд╛рд░рд╣ рд▓реЗрдЦреЛрдВ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ, рдЕрднреНрдпрд╛рд╕ рдореЗрдВ OpenSceneGraph рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдлрд┐рдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЬрди рд░реВрд╕реА рднрд╛рд╖реА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрд╕рд╛рдзрди рдкрд░ OpenSceneGraph рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЧреНрд░рд╛рдлрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдУрдПрд╕рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рддрдХрдиреАрдХреЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдЪреНрдЫреА рд╕рд╛рдордЧреНрд░реА рдЬрдорд╛ рдХрд░рдиреЗ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдореИрдВ рдЕрд▓рд╡рд┐рджрд╛ рдирд╣реАрдВ рдХрд╣рддрд╛, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░
рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ
!