OpenSceneGraph: рдореВрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддрдХрдиреАрдХ

рдЫрд╡рд┐

рдкрд░рд┐рдЪрдп


рдпрд╣ рд▓реЗрдЦ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд░ рдЗрддрдирд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, OpenSceneGraph рдЗрдВрдЬрди рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

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

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

1. рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк


C / C ++ рдореЗрдВ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЕрдм рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ рдЬрдм рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

OSG рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреВрд▓ рд╣реИред

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ

рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг
main.h

#ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif // MAIN_H 

main.cpp

 #include "main.h" int main(int argc, char *argv[]) { osg::ArgumentParser args(&argc, argv); std::string filename; args.read("--model", filename); osg::ref_ptr<osg::Node> root = osgDB::readNodeFile(filename); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


QtCreator рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ



рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдирд╛, рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ ( рдЙрд╕реА OpenSceneGraph-Data рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЯреНрд░рдХ рдореЙрдбрд▓)



рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдЗрди рд▓рд╛рдЗрди рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ

 osg::ArgumentParser args(&argc, argv); 

osg рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ :: ArgumentParser рдХрдорд╛рдВрдб рд▓рд╛рдЗрди parser рд╡рд░реНрдЧред рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рдкрд░, рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 std::string filename; args.read("--model", filename); 

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

 osg::ref_ptr<osg::Node> root = osgDB::readNodeFile(filename); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); 

рдУрд╕ рдХреА рдкрдврд╝рдиреЗ () рд╡рд┐рдзрд┐ :: ArgumentParser рд╡рд░реНрдЧ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рди рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░, рд╡реИрдХреНрдЯрд░ рдЖрджрд┐ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдлреНрд▓реЛрдЯ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ

 float size = 0.0f; args.read("--size", size); 

рдпрджрд┐ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорд╛рди рд╡реИрд╕рд╛ рд╣реА рд░рд╣реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдХрд╛рд░ рдЪрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдерд╛ред

2. рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рддрдВрддреНрд░


OpenSceneGraph рдореЗрдВ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЯреНрд░реЗрд╕ рдФрд░ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реИред OSG рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рдЗрдВрдЬрди рдХреЛрд░ рд╕реНрддрд░ рдкрд░ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЬрд╛рдирдХрд╛рд░реА (рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ, рд╕реВрдЪрдирд╛рдУрдВ) рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рдбреЗрд╡рд▓рдкрд░ osg :: рд╕реВрдЪрд┐рдд () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ << рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджреЗрд╢ рд╕реНрддрд░ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ: ALWAYS, FATAL, WARN, NOTICE, INFO, DEBUG_INFO рдФрд░ DEBUG_FPред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 osg::notify(osg::WARN) << "Some warning message" << std::endl; 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдУрдПрд╕рдЬреА рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐, рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░, рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ (рд▓реЙрдЧ рдХреЗ рд░реВрдк рдореЗрдВ) рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╡рд┐рдЬреЗрдЯ рд╕рд╣рд┐рдд рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрдВрдЬрди рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХрд╛ рдСрд╕рдЧ :: рдиреЛрдЯрд┐рдлрд╝реИрдВрдбрд▓рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ
main.h

 #ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <fstream> #endif // MAIN_H 

main.cpp

 #include "main.h" class LogFileHandler : public osg::NotifyHandler { public: LogFileHandler(const std::string &file) { _log.open(file.c_str()); } virtual ~LogFileHandler() { _log.close(); } virtual void notify(osg::NotifySeverity severity, const char *msg) { _log << msg; } protected: std::ofstream _log; }; int main(int argc, char *argv[]) { osg::setNotifyLevel(osg::INFO); osg::setNotifyHandler(new LogFileHandler("../logs/log.txt")); osg::ArgumentParser args(&argc, argv); osg::ref_ptr<osg::Node> root = osgDB::readNodeFiles(args); if (!root) { OSG_FATAL << args.getApplicationName() << ": No data loaded." << std::endl; return -1; } osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо LogFileHandler рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ osg рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИ :: NotifyHandlerред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ _log рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЦреБрд▓рдиреЗ рдФрд░ рдмрдВрдж рд╣реЛрдиреЗ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди () рд╡рд┐рдзрд┐ рдПрдХ рдРрд╕реА рд╣реА рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ OSG рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рдлрд╛рдЗрд▓ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рднреЗрдЬ рджрд┐рдпрд╛ рдерд╛ред

рд╡рд░реНрдЧ LogFileHandler

 class LogFileHandler : public osg::NotifyHandler { public: LogFileHandler(const std::string &file) { _log.open(file.c_str()); } virtual ~LogFileHandler() { _log.close(); } virtual void notify(osg::NotifySeverity severity, const char *msg) { _log << msg; } protected: std::ofstream _log; }; 

рдЕрдЧрд▓рд╛, рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

 osg::setNotifyLevel(osg::INFO); 

INFO рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреН, рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реВрдЪрдирд╛рдУрдВ рд╕рд╣рд┐рдд рдЗрдВрдЬрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯред

 osg::setNotifyHandler(new LogFileHandler("../logs/log.txt")); 

рд╕реВрдЪрдирд╛ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

 osg::ArgumentParser args(&argc, argv); osg::ref_ptr<osg::Node> root = osgDB::readNodeFiles(args); if (!root) { OSG_FATAL << args.getApplicationName() << ": No data loaded." << std::endl; return -1; } 

рдЙрд╕реА рд╕рдордп, рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдбреЗрдЯрд╛ рдХреА рдХрдореА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, OSG_FATAL рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рдореЛрдб рдореЗрдВ рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ



рдЗрд╕ рддрд░рд╣ рдПрдХ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рд╣реЛ рд░рд╣реА рд╣реИ

OSG рд▓реЙрдЧ рдЙрджрд╛рд╣рд░рдг
 Opened DynamicLibrary osgPlugins-3.7.0/mingw_osgdb_osgd.dll CullSettings::readEnvironmentalVariables() CullSettings::readEnvironmentalVariables() Opened DynamicLibrary osgPlugins-3.7.0/mingw_osgdb_deprecated_osgd.dll OSGReaderWriter wrappers loaded OK CullSettings::readEnvironmentalVariables() void StateSet::setGlobalDefaults() void StateSet::setGlobalDefaults() ShaderPipeline disabled. StateSet::setGlobalDefaults() Setting up GL2 compatible shaders CullSettings::readEnvironmentalVariables() CullSettings::readEnvironmentalVariables() CullSettings::readEnvironmentalVariables() CullSettings::readEnvironmentalVariables() ShaderComposer::ShaderComposer() 0xa5ce8f0 CullSettings::readEnvironmentalVariables() ShaderComposer::ShaderComposer() 0xa5ce330 View::setSceneData() Reusing existing scene0xa514220 CameraManipulator::computeHomePosition(0, 0) boundingSphere.center() = (-6.40034 1.96225 0.000795364) boundingSphere.radius() = 16.6002 CameraManipulator::computeHomePosition(0xa52f138, 0) boundingSphere.center() = (-6.40034 1.96225 0.000795364) boundingSphere.radius() = 16.6002 Viewer::realize() - No valid contexts found, setting up view across all screens. Applying osgViewer::ViewConfig : AcrossAllScreens . . . . ShaderComposer::~ShaderComposer() 0xa5ce330 ShaderComposer::~ShaderComposer() 0xa5ce8f0 ShaderComposer::~ShaderComposer() 0xa5d6228 close(0x1)0xa5d3e50 close(0)0xa5d3e50 ContextData::unregisterGraphicsContext 0xa5d3e50 DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. ShaderComposer::~ShaderComposer() 0xa5de4e0 close(0x1)0xa5ddba0 close(0)0xa5ddba0 ContextData::unregisterGraphicsContext 0xa5ddba0 Done destructing osg::View DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. DatabasePager::RequestQueue::~RequestQueue() Destructing queue. Closing DynamicLibrary osgPlugins-3.7.0/mingw_osgdb_osgd.dll Closing DynamicLibrary osgPlugins-3.7.0/mingw_osgdb_deprecated_osgd.dll 


рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд▓рдЧ рд╕рдХрддреА рд╣реИ - рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдбрд┐рдмрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, OSG std :: cout standard output рдФрд░ error messages рдХреЛ std :: cerr stream рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ GUI рддрддреНрд╡реЛрдВ рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рд╕реВрдЪрдирд╛рдПрдБ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FATAL) рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╕рд┐рд╕реНрдЯрдо рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреА рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ

 osg::setNotifyLevel(osg::FATAL); . . . osg::notify(osg::WARN) << "Some message." << std::endl; 

рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдмрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

3. рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд░реЛрдзрди


рдУрдПрд╕рдЬреА :: рдЬреНрдпрд╛рдорд┐рддрд┐ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЯрд┐рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╣реБрднреБрдЬ рдЬрд╛рд▓ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╛рдЗрдореЗрдЯ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдореЙрдбрд▓ рдХреЗ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЗ рдРрд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЪреЗрд╣рд░реЗ, рдХрд┐рдирд╛рд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдзред рдпрд╣ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЪреЗрд╣рд░реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╡реЗ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред OSG рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЬрди рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрдВрдХреНрд╢рдирд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рдкреЙрд▓реАрдЧреЛрдирд▓ рдореЗрд╖ рдХреЗ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред C ++ рдореЗрдВ, рдПрдХ рдлрд╝рдирдХрд╛рд░ рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Osg :: рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  1. osg :: Drawable :: AttributeFunctor - рд╕рдВрдХреЗрдд рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдЧреБрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЖрднрд╛рд╕реА рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ


 virtual void apply( osg::Drawable::AttributeType type, unsigned int size, osg::Vec3* ptr ) { //  3-     ptr. //      } 

  1. osg :: Drawable :: ConstAttributeFunctor - рдкрд┐рдЫрд▓реЗ рдлрд╝рдирдХрд╛рд░ рдХрд╛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг: рд╡реИрдХреНрдЯрд░ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рдирд┐рд░рдВрддрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. osg :: PrimitiveFunctor - OpenGL рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдЖрдбрд╝ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рдЧрдИ рдлрд╝рдВрдХреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдирдХрд╛рд░ рдХреЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрдкрд╡рд░реНрдЧ рд╣реИрдВ: рдСрдЧ :: рдЯреЗрдореНрдкреНрд▓реЗрдЯрдкреНрд░рд┐рдЯрд┐рд╡ рдлрд╝рдВрдХреНрдЯрд░ <> рдФрд░ рдСрдЧ :: рдЯреНрд░рд╛рдПрдВрдЧрд▓рдлрд╝рдирдХреНрдЯрд░ <>ред рдпреЗ рдХрдХреНрд╖рд╛рдПрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрджрд┐рдо рдХреЛрдиреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдСрдкрд░реЗрдЯрд░ () рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреА рд╣реИрдВред
  3. osg :: PrimitiveIndexFunctor - рдкрд┐рдЫрд▓реЗ рдлрдирдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрджрд┐рдо рдХреЗ рд╢реАрд░реНрд╖ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

Osg рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ :: рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп, рдЬреИрд╕реЗ рдХрд┐ osg :: ShapeDrawable рдФрд░ osg :: Geometry, рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХрд╛рд░ () рд╡рд┐рдзрд┐ рд╣реИред

4. рдЖрджрд┐рдо рдХрд╡рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг


рд╣рдо рддреНрд░рд┐рдХреЛрдгреАрдп рдЪреЗрд╣рд░реЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреБрдЫ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред

рдлрдирдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Geode> #include <osg/Geometry> #include <osg/TriangleFunctor> #include <osgViewer/Viewer> #include <iostream> #endif 

main.cpp

 #include "main.h" std::string vec2str(const osg::Vec3 &v) { std::string tmp = std::to_string(vx()); tmp += " "; tmp += std::to_string(vy()); tmp += " "; tmp += std::to_string(vz()); return tmp; } struct FaceCollector { void operator()(const osg::Vec3 &v1, const osg::Vec3 &v2, const osg::Vec3 &v3) { std::cout << "Face vertices: " << vec2str(v1) << "; " << vec2str(v2) << "; " << vec2str(v3) << std::endl; } }; int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back( osg::Vec3(0.0f, 0.0f, 0.0f) ); vertices->push_back( osg::Vec3(0.0f, 0.0f, 1.0f) ); vertices->push_back( osg::Vec3(1.0f, 0.0f, 0.0f) ); vertices->push_back( osg::Vec3(1.0f, 0.0f, 1.5f) ); vertices->push_back( osg::Vec3(2.0f, 0.0f, 0.0f) ); vertices->push_back( osg::Vec3(2.0f, 0.0f, 1.0f) ); vertices->push_back( osg::Vec3(3.0f, 0.0f, 0.0f) ); vertices->push_back( osg::Vec3(3.0f, 0.0f, 1.5f) ); vertices->push_back( osg::Vec3(4.0f, 0.0f, 0.0f) ); vertices->push_back( osg::Vec3(4.0f, 0.0f, 1.0f) ); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back( osg::Vec3(0.0f, -1.0f, 0.0f) ); osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; geom->setVertexArray(vertices.get()); geom->setNormalArray(normals.get()); geom->setNormalBinding(osg::Geometry::BIND_OVERALL); geom->addPrimitiveSet(new osg::DrawArrays(GL_QUAD_STRIP, 0, 10)); osg::ref_ptr<osg::Geode> root = new osg::Geode; root->addDrawable(geom.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); osg::TriangleFunctor<FaceCollector> functor; geom->accept(functor); return viewer.run(); } 


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрдИ рдмрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЬреНрдпрд╛рдорд┐рддрд┐ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╣рдо рдПрдХ рдлреЗрд╕рдХреЛрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдСрдкрд░реЗрдЯрд░ () рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

 struct FaceCollector { void operator()(const osg::Vec3 &v1, const osg::Vec3 &v2, const osg::Vec3 &v3) { std::cout << "Face vertices: " << vec2str(v1) << "; " << vec2str(v2) << "; " << vec2str(v3) << std::endl; } }; 

рдпрд╣ рдСрдкрд░реЗрдЯрд░, рдЬрд┐рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рд┐рдд рддреАрди рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред Vec2str рдлрд╝рдВрдХреНрд╢рди рдХреЛ osg :: Vec3 рд╡реЗрдХреНрдЯрд░ рд╕реЗ std :: string рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдлрд╝рдирдХрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреНрдпрд╛рдорд┐рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ

 osg::TriangleFunctor<FaceCollector> functor; geom->accept(functor); 

рдпрд╣ рдХреЙрд▓, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рдирд▓ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдХрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ "рдбреНрд░рд╛рдЗрдВрдЧ" рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдореЗрдВ рдРрд╕реА рдЬреНрдпрд╛рдорд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИ



рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд┐рдХрд╛рд╕

 Face vertices: 0.000000 0.000000 0.000000; 0.000000 0.000000 1.000000; 1.000000 0.000000 0.000000 Face vertices: 0.000000 0.000000 1.000000; 1.000000 0.000000 1.500000; 1.000000 0.000000 0.000000 Face vertices: 1.000000 0.000000 0.000000; 1.000000 0.000000 1.500000; 2.000000 0.000000 0.000000 Face vertices: 1.000000 0.000000 1.500000; 2.000000 0.000000 1.000000; 2.000000 0.000000 0.000000 Face vertices: 2.000000 0.000000 0.000000; 2.000000 0.000000 1.000000; 3.000000 0.000000 0.000000 Face vertices: 2.000000 0.000000 1.000000; 3.000000 0.000000 1.500000; 3.000000 0.000000 0.000000 Face vertices: 3.000000 0.000000 0.000000; 3.000000 0.000000 1.500000; 4.000000 0.000000 0.000000 Face vertices: 3.000000 0.000000 1.500000; 4.000000 0.000000 1.000000; 4.000000 0.000000 0.000000 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рдХреЙрд▓рд┐рдВрдЧ рдЬрд┐рдпреЛрдо-> рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (...), рддреНрд░рд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдУрдкрдирдЬреАрдПрд▓ рдХреЙрд▓ рдХреА рдирдХрд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ



Osg :: TemplatePrimitiveFunctor рд╡рд░реНрдЧ рди рдХреЗрд╡рд▓ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп OpenGL рдЖрджрд┐рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛

 //   void operator()( const osg::Vec3&, bool ); //   void operator()( const osg::Vec3&, const osg::Vec3&, bool ); //   void operator()( const osg::Vec3&, const osg::Vec3&, const osg::Vec3&, bool ); //   void operator()( const osg::Vec3&, const osg::Vec3&, const osg::Vec3&, const osg::Vec3&, bool ); 


5. рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди


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

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

рдЖрдЧрдВрддреБрдХ рдХреЛ рдЙрдкрд╡рд░реНрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЖрднрд╛рд╕реА рдЕрдзрд┐рднрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП () рддрд░реАрдХреЗ рдУрд╕реНрдЧ :: NodeVisitor рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдПред рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрдЦреНрдп OSG рдиреЛрдб рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рдЖрдЧрдВрддреБрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рджреГрд╢реНрдп рдХреЗ рдЧреНрд░рд╛рдл рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╕рдордп рджреЗрдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд░реВрд░рдд рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред

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

рдЖрд╡реЗрджрди рдХреЗ рдУрд╡рд░рд▓реЛрдб () рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХреАрдХреГрдд рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ

 virtual void apply( osg::Node& ); virtual void apply( osg::Geode& ); virtual void apply( osg::Group& ); virtual void apply( osg::Transform& ); 

рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рд╕рдмрдЧреНрд░рд╛рдл рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреНрд░реЙрд▓ рдореЛрдб рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 ExampleVisitor visitor; visitor->setTraversalMode( osg::NodeVisitor::TRAVERSE_ALL_CHILDREN ); node->accept( visitor ); 

рдмрд╛рдИрдкрд╛рд╕ рдореЛрдб рдХрдИ рдкреНрд░рдЧрдгрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

  1. TRAVERSE_ALL_CHILDREN - рд╕рднреА рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред
  2. TRAVERSE_PARENTS - рд╡рд░реНрддрдорд╛рди рдиреЛрдб рд╕реЗ рд╡рд╛рдкрд╕ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ, рд░реВрдЯ рдиреЛрдб рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ
  3. TRAVERSE_ACTIVE_CHILDREN - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рдиреЛрдбреНрд╕ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрд┐рдирдХреА рджреГрд╢реНрдпрддрд╛ osg :: рд╕реНрд╡рд┐рдЪ рдиреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреА рд╣реИред


6. рдЬрд▓рддреА рд╣реБрдИ рд╕реЗрд╕рдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдбреЗрд╡рд▓рдкрд░ рд╣рдореЗрд╢рд╛ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

рдлрдирдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <iostream> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class InfoVisitor : public osg::NodeVisitor { public: InfoVisitor() : _level(0) { setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); } std::string spaces() { return std::string(_level * 2, ' '); } virtual void apply(osg::Node &node); virtual void apply(osg::Geode &geode); protected: unsigned int _level; }; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void InfoVisitor::apply(osg::Node &node) { std::cout << spaces() << node.libraryName() << "::" << node.className() << std::endl; _level++; traverse(node); _level--; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void InfoVisitor::apply(osg::Geode &geode) { std::cout << spaces() << geode.libraryName() << "::" << geode.className() << std::endl; _level++; for (unsigned int i = 0; i < geode.getNumDrawables(); ++i) { osg::Drawable *drawable = geode.getDrawable(i); std::cout << spaces() << drawable->libraryName() << "::" << drawable->className() << std::endl; } traverse(geode); _level--; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { osg::ArgumentParser args(&argc, argv); osg::ref_ptr<osg::Node> root = osgDB::readNodeFiles(args); if (!root.valid()) { OSG_FATAL << args.getApplicationName() << ": No data leaded. " << std::endl; return -1; } InfoVisitor infoVisitor; root->accept(infoVisitor); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рд╣рдо InfoVisitor рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕реЗ osg :: NodeVisitor рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ

 class InfoVisitor : public osg::NodeVisitor { public: InfoVisitor() : _level(0) { setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); } std::string spaces() { return std::string(_level * 2, ' '); } virtual void apply(osg::Node &node); virtual void apply(osg::Geode &geode); protected: unsigned int _level; }; 

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

рдЕрдм рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ () рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

 void InfoVisitor::apply(osg::Node &node) { std::cout << spaces() << node.libraryName() << "::" << node.className() << std::endl; _level++; traverse(node); _level--; } 

рдпрд╣рд╛рдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред рдиреЛрдб рдХреЗ рд▓рд┐рдП LibraryName () рд╡рд┐рдзрд┐ OSG рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдиреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ className рд╡рд┐рдзрд┐ рдиреЛрдб рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ OSG рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 std::cout << spaces() << node.libraryName() << "::" << node.className() << std::endl; 

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

рдУрдПрд╕рдЬреА рдХреЗ рдЕрдВрддрд┐рдо рдиреЛрдб рдХреЗ рд▓рд┐рдП :: рдЬрд┐рдУрдб, рдЗрд╕рдХрд╛ рдУрд╡рд░рд▓реЛрдб рд▓рд╛рдЧреВ () рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ

 void InfoVisitor::apply(osg::Geode &geode) { std::cout << spaces() << geode.libraryName() << "::" << geode.className() << std::endl; _level++; for (unsigned int i = 0; i < geode.getNumDrawables(); ++i) { osg::Drawable *drawable = geode.getDrawable(i); std::cout << spaces() << drawable->libraryName() << "::" << drawable->className() << std::endl; } traverse(geode); _level--; } 

рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╡рд░реНрддрдорд╛рди рдЬреНрдпрд╛рдорд┐рддреАрдп рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

 for (unsigned int i = 0; i < geode.getNumDrawables(); ++i) { osg::Drawable *drawable = geode.getDrawable(i); std::cout << spaces() << drawable->libraryName() << "::" << drawable->className() << std::endl; } 

рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рджреГрд╢реНрдп рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ

 osg::ArgumentParser args(&argc, argv); osg::ref_ptr<osg::Node> root = osgDB::readNodeFiles(args); if (!root.valid()) { OSG_FATAL << args.getApplicationName() << ": No data leaded. " << std::endl; return -1; } 

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

 InfoVisitor infoVisitor; root->accept(infoVisitor); 

рдЖрдЧреЗ рджрд░реНрд╢рдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рд╣реИрдВ, рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХрдИ рдмрд╛рд░ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж

 $ visitor ../data/cessnafire.osg 

рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреЗрдВрдЧреЗ

 osg::Group osg::MatrixTransform osg::Geode osg::Geometry osg::Geometry osg::MatrixTransform osgParticle::ModularEmitter osgParticle::ModularEmitter osgParticle::ParticleSystemUpdater osg::Geode osgParticle::ParticleSystem osgParticle::ParticleSystem osgParticle::ParticleSystem osgParticle::ParticleSystem 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рд▓реЛрдбреЗрдб рд╕реАрди рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдкреЗрдбрд╝ рдорд┐рд▓рд╛ рд╣реИред рдорд╛рдл рдХрд░рдирд╛, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдиреЛрдбреНрд╕ рдХрд╣рд╛рдБ рд╣реИрдВ? рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - * .osg рдкреНрд░рд╛рд░реВрдк рдХреЗ рдореЙрдбрд▓ рд╕реНрд╡рдпрдВ рдХрдВрдЯреЗрдирд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рди рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдУрдПрд╕рдЬреА рджреГрд╢реНрдп рдХреЗ рдПрдХ рд╕рдмрдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рднреА рджреЗрддреЗ рд╣реИрдВред рдореЙрдбрд▓ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐, рд░реВрдкрд╛рдВрддрд░рдг, рдХрдг рдкреНрд░рднрд╛рд╡ рдЬреЛ рдзреБрдПрдВ рдФрд░ рд▓реМ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА OSG рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЗ рдиреЛрдб рд╣реИрдВредрдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдХреЛ рдпрд╛ рддреЛ * .osg рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рджрд░реНрд╢рдХ рд╕реЗ * .osg рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЖрдЧрдВрддреБрдХ рдпрд╛рдВрддреНрд░рд┐рдХреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

7. рдЕрдиреБрдкреНрд░рд╕реНрде () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛


OSG рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИ рдЯреНрд░реИрд╡рд░реНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ред рд╣рд░ рдмрд╛рд░ рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ osg :: NodeVisitor рдФрд░ рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдХреМрди рд╕рд╛ рдорд╛рд░реНрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдЕрджреНрдпрддрди, рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдпрд╛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ)ред рдЕрдзрд┐рдХрд╛рдВрд╢ OSG рд╣реЛрд╕реНрдЯ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред

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

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

рдЕрдирд┐рдореЗрд╖ рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Switch> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class AnimatingSwitch : public osg::Switch { public: AnimatingSwitch() : osg::Switch(), _count(0) {} AnimatingSwitch(const AnimatingSwitch &copy, const osg::CopyOp &copyop = osg::CopyOp::SHALLOW_COPY) : osg::Switch(copy, copyop), _count(copy._count) {} META_Node(osg, AnimatingSwitch); virtual void traverse(osg::NodeVisitor &nv); protected: unsigned int _count; }; void AnimatingSwitch::traverse(osg::NodeVisitor &nv) { if (!((++_count) % 60) ) { setValue(0, !getValue(0)); setValue(1, !getValue(1)); } osg::Switch::traverse(nv); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("../data/cessnafire.osg"); osg::ref_ptr<AnimatingSwitch> root = new AnimatingSwitch; root->addChild(model1.get(), true); root->addChild(model2.get(), false); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЖрдЗрдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рд╣рдо рдПрдХ рдирдпрд╛ AnimatingSwitch рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ osg рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ :: рд╕реНрд╡рд┐рдЪред

 class AnimatingSwitch : public osg::Switch { public: AnimatingSwitch() : osg::Switch(), _count(0) {} AnimatingSwitch(const AnimatingSwitch &copy, const osg::CopyOp &copyop = osg::CopyOp::SHALLOW_COPY) : osg::Switch(copy, copyop), _count(copy._count) {} META_Node(osg, AnimatingSwitch); virtual void traverse(osg::NodeVisitor &nv); protected: unsigned int _count; }; void AnimatingSwitch::traverse(osg::NodeVisitor &nv) { if (!((++_count) % 60) ) { setValue(0, !getValue(0)); setValue(1, !getValue(1)); } osg::Switch::traverse(nv); } 

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред

 AnimatingSwitch() : osg::Switch(), _count(0) {} 

рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛, OSG рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛

 AnimatingSwitch(const AnimatingSwitch &copy, const osg::CopyOp &copyop = osg::CopyOp::SHALLOW_COPY) : osg::Switch(copy, copyop), _count(copy._count) {} 

рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рдФрд░ рдУрдПрд╕рдЬреА :: рдХреЙрдкреАрдСрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреА рдХреЙрдкреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реБрдВрджрд░ рдЕрдЬреАрдм рдкрддреНрд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ

 META_Node(osg, AnimatingSwitch); 

рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ рдХрд┐ рдСрд╕реНрдЧ :: рдиреЛрдб рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЛ рдорд╣рддреНрд╡ рджреЗрддреЗ рд╣реИрдВ, рддрдм рддрдХ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдУрдПрд╕рдЬреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ: рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдлрд╝реАрд▓реНрдб _count рд╢рд╛рдорд┐рд▓ рд╣реИ - рдмрд╣реБрдд рдХрд╛рдЙрдВрдЯрд░ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд╛рд░рдЧрдорди () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ

 void AnimatingSwitch::traverse(osg::NodeVisitor &nv) { if (!((++_count) % 60) ) { setValue(0, !getValue(0)); setValue(1, !getValue(1)); } osg::Switch::traverse(nv); } 

рдиреЛрдбреНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдореВрд▓реНрдп (рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рдмрдврд╝рд╛рдирд╛) 60 рдХрд╛ рдЧреБрдгрдХ рд╣реЛрдЧрд╛ред рд╣рдо рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ



рдЪреВрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрд╡рд░реНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдиреЗ рдУрд╡рд░рд▓реЛрдб рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рдЖрдЧреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ osg :: NodeVisitor рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреА рдХреБрдВрдЬреА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЗ рд╡рд░реНрддрдорд╛рди рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЕрджреНрдпрддрди рдХрд░рдирд╛, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЕрджреГрд╢реНрдп рдЪреЗрд╣рд░реЛрдВ рдХреЛ рдХрддрд░рдирд╛ред рдкрд╣рд▓реЗ рджреЛ рдиреЛрдб рдХреЙрд▓рдмреИрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкрд╛рд╕ рдХреЛ рдСрдЧ :: NodeVisitor to osg :: CullVisitor рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 osgUtil::CullVisitor *cv = dynamic_cast<osgUtil::CullVisitor *>(&nv); if (cv) { ///  - ,     } 


8. рдХреЙрд▓рдмреИрдХ рддрдВрддреНрд░


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

рдЗрдВрдЬрди рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреЗ рдХреЙрд▓рдмреИрдХ рд╣реЛрддреЗ рд╣реИрдВред рдХреЙрд▓рдмреИрдХ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдСрд╕реНрдЧ :: NodeCallback рдХреЛ рджреГрд╢реНрдп рдиреЛрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ osg :: Drawable: UpdateCallback, osg :: Drawable :: EventCallback рдФрд░ osg - рдбреНрд░реЙрдмрд▓: CullCallback - рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рдорд┐рддрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдПред

Osg :: NodeCallback рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЕрддрд┐-рдпреЛрдЧреНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдСрдкрд░реЗрдЯрд░ () рдСрдкрд░реЗрдЯрд░ рд╣реИред рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрд▓ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреЛрдб рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реЗрдЯрдЕрдкрдбреЗрдЯ рдХреЙрд▓рдмреИрдХ () рдпрд╛ рдРрдб рдпреВрдкреАрдбреЗрдЯ рдХреЙрд▓рдмреИрдХ () рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рдСрдкрд░реЗрдЯрд░ () рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдиреЛрдбреНрд╕ рдХреЗ рджреГрд╢реНрдп рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ OSG рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреА рд╣реИред

рдкрд╣рд▓рд╛ рдирд╛рдордХреЙрд▓рдмреИрдХ рдлрд╝рдирдХрд╛рд░рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдХрд┐рд╕реА рд╡рд╕реНрддреБ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐
рдиреЛрдб рдЕрдкрдбреЗрдЯрдСрд╕рдЧ :: рдиреЙрдбрдХреЙрд▓рдмреИрдХрдСрдкрд░реЗрдЯрд░ ()osg :: рдиреЛрдб :: setUpdateCallback ()
рдиреЛрдб рдШрдЯрдирд╛рдСрд╕рдЧ :: рдиреЙрдбрдХреЙрд▓рдмреИрдХрдСрдкрд░реЗрдЯрд░ ()osg :: рдиреЛрдб :: setEventCallback ()
рдиреЛрдб рдХреНрд▓рд┐рдкрд┐рдВрдЧрдСрд╕рдЧ :: рдиреЙрдбрдХреЙрд▓рдмреИрдХрдСрдкрд░реЗрдЯрд░ ()osg :: рдиреЛрдб :: setCullCallback ()
рдЬреНрдпрд╛рдорд┐рддрд┐ рдЕрджреНрдпрддрдиosg::Drawable::UpdateCallbackupdate()osg::Drawable::setUpdateCallback()
osg::Drawable::EventCallbackevent()osg::Drawable::setEventCallback()
osg::Drawable::CullCallbackcull()osg::Drawable::setCullCallback()
osg::StateAttributeCallbackoperator()osg::StateAttribute::setUpdateCallback()
osg::StateAttributeCallbackoperator()osg::StateAttribute::setEventCallback()
osg::Uniform::Callbackoperator()osg::Uniform::setUpdateCallback()
osg::Uniform::Callbackoperator()osg::Uniform::setEvevtCallback()
osg::Camera::DrawCallbackoperator()osg::Camera::PreDrawCallback()
osg::Camera::DrawCallbackoperator()osg::Camera::PostDrawCallback()


9. osg::Switch


рдереЛрдбрд╝рд╛ рдФрд░ рдКрдкрд░, рд╣рдордиреЗ рд╡рд┐рдорд╛рди рдХреЗ рджреЛ рдореЙрдбрд▓ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛ред рдЕрдм рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдУрдПрд╕рдЬреА рдХреЙрд▓рдмреИрдХ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░реЗрдВрдЧреЗред

рдХреЙрд▓рдмреИрдХрд╕реНрд╡рд┐рде рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Switch> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class SwitchingCallback : public osg::NodeCallback { public: SwitchingCallback() : _count(0) {} virtual void operator()(osg::Node *node, osg::NodeVisitor *nv); protected: unsigned int _count; }; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void SwitchingCallback::operator()(osg::Node *node, osg::NodeVisitor *nv) { osg::Switch *switchNode = static_cast<osg::Switch *>(node); if ( !((++_count) % 60) && switchNode ) { switchNode->setValue(0, !switchNode->getValue(0)); switchNode->setValue(1, !switchNode->getValue(0)); } traverse(node, nv); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("../data/cessnafire.osg"); osg::ref_ptr<osg::Switch> root = new osg::Switch; root->addChild(model1, true); root->addChild(model2, false); root->setUpdateCallback( new SwitchingCallback ); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЖрдкрдХреЛ osg :: NodeCallback рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реБрдЖ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ osg рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ :: рд╕реНрд╡рд┐рдЪ рдиреЛрдб

 class SwitchingCallback : public osg::NodeCallback { public: SwitchingCallback() : _count(0) {} virtual void operator()(osg::Node *node, osg::NodeVisitor *nv); protected: unsigned int _count; }; 

_Count рдХрд╛рдЙрдВрдЯрд░ рдЕрдкрдиреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП osg :: рд╕реНрд╡рд┐рдЪ рдиреЛрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдСрдкрд░реЗрдЯрд░ () рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

 void SwitchingCallback::operator()(osg::Node *node, osg::NodeVisitor *nv) { osg::Switch *switchNode = static_cast<osg::Switch *>(node); if ( !((++_count) % 60) && switchNode ) { switchNode->setValue(0, !switchNode->getValue(0)); switchNode->setValue(1, !switchNode->getValue(0)); } traverse(node, nv); } 

рдЬрд┐рд╕ рдиреЛрдб рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдиреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЛрдб рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдСрдЧ :: рд╕реНрд╡рд┐рдЪ, рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдиреЛрдб рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрд╡рд┐рдЪ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

 osg::Switch *switchNode = static_cast<osg::Switch *>(node); 

рд╣рдо рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╡реИрдз рдорд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЬрдм рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВ 60 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧреА

 if ( !((++_count) % 60) && switchNode ) { switchNode->setValue(0, !switchNode->getValue(0)); switchNode->setValue(1, !switchNode->getValue(0)); } 

рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░рд╛рд╡реЗрд▓ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрд╡рд░реНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ

 traverse(node, nv); 

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ рддреБрдЪреНрдЫ рд╣реИ, рд▓рд╛рдЗрди рдХреЛ рдЫреЛрдбрд╝рдХрд░

 root->setUpdateCallback( new SwitchingCallback ); 

рдЬрд╣рд╛рдБ рд╣рдо рдХреЙрд▓рдмреИрдХ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╣рдордиреЗ рдореВрд▓ рдиреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ :: рд╕реНрд╡рд┐рдЪред рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ



рдЕрдм рддрдХ, рд╣рдордиреЗ рджреЛ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╣рд╕реНрдпрдордп рдкрд╛рд░рдЧрдорди () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ: рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдФрд░ рдЗрд╕ рдЧреНрд░рд╛рдл рдХреЛ рдУрдПрд╕рдЬреА :: NodeVisitor рдХреНрд▓рд╛рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред

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

AddUpdateCallback () рд╡рд┐рдзрд┐рдпрд╛рдБ рдиреЛрдб рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВред SetUpdateCallback () рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рдФрд░ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╣реА рдиреЛрдб рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓рдмреИрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдордиреЗ OpenSceneGraph рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореВрд▓ рддрдХрдиреАрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЙрди рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рджреВрд░ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЫреВрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд▓реЗрдЦ рдХрд╛рдлреА рд▓рдВрдмрд╛ рдирд┐рдХрд▓рд╛), рдЗрд╕рд▓рд┐рдП

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

Source: https://habr.com/ru/post/hi437688/


All Articles