OpenSceneGraph: рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рдЫрд╡рд┐

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


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

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, C ++ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░, рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЪреМрдЦрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд╕рд┐рджреНрдз Qt рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ QObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдШрдЯрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рднреА рдореМрдЬреВрдж рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, OpenSceneGraph рдЗрдВрдЬрди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рд╕рд╛рдЗрдХрд┐рд▓" рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдЬрд┐рд╕рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

OSG рдПрдХ рдЕрдореВрд░реНрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдПрдХ рдУрд░, рдпрд╣ рдУрдкрдирдЬреАрдПрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдУрдкрдиреАрдЧреЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рдкреВрд░реЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рднреА рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП MFC, Qt, .net for Windows) рдХреЗ рднреАрддрд░ рднреА рд╣реИрдВред

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

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, OSG, рдСрд░реНрдЧреЗрдЬрд╛ :: GUIEventHilller рд╡рд░реНрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдЬреЗрдЯ рдИрд╡реЗрдВрдЯреНрд╕ рдФрд░ рдпреВрдЬрд░ рдЗрдирдкреБрдЯ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдмреЗрд╕рд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ addEventHandler () рдореЗрдердб рдХреЛ рд╣рдЯрд╛рдХрд░ рдФрд░ RemoveEventHandler () рдореЗрдердб рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рдХ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХрдВрдХреНрд░реАрдЯ рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рдХреЛ рдУрд╢рдЧрд╛ :: GUIEventHandler рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдореЗрдВ рд╣реИрдВрдбрд▓ () рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд┐рдзрд┐ рджреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ: osgGA :: GUIEventAdapter, рдЬрд┐рд╕рдореЗрдВ GUI рдФрд░ osg :: GUIActionAdepter рдХреА рдШрдЯрдирд╛ рдХрддрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рд╣реИ

bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdepter &aa) { //        } 

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

 osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer *>(&aa); 

1. рдХреАрдмреЛрд░реНрдб рдФрд░ рдорд╛рдЙрд╕ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ


OsgGA :: GUIEventAdapter () рд╡рд░реНрдЧ OSG рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред GetEventType () рд╡рд┐рдзрд┐ рдИрд╡реЗрдВрдЯ рдХреНрдпреВ рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╡рд░реНрддрдорд╛рди GUI рдИрд╡реЗрдВрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░, рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╣реИрдВрдбрд▓ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред

рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд░рд╡рд┐рд╡рд░рдгрдШрдЯрдирд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЗ рддрд░реАрдХреЗ
PUSH / RELEASE / DOUBLECLICKрдХреНрд▓рд┐рдХ / рд░рд┐рд▓реАрдЬрд╝ рдФрд░ рдорд╛рдЙрд╕ рдмрдЯрди рдкрд░ рдбрдмрд▓ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВgetX (), getY () - рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред getButton () - рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдХрд╛ рдХреЛрдб (LEFT_MOUSE_BUTTON, RIGHT_MOUSE_BUTTON, MIDDLE_MOUSE_BUTTON
рд╕реНрдХреНрд░реЙрд▓рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдорд╛рдЙрд╕ рд╡реНрд╣реАрд▓ (s)getScrollingMotion () - SCROOL_UP, SCROLL_DOWN, SCROLL_LEFT, SCROLL_RIGHT рджреЗрддрд╛ рд╣реИ
рдЦреАрдВрдЪреЗрдВрдорд╛рдЙрд╕ рдЦреАрдВрдЪреЗрдВgetX (), getY () - рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐; getButtonMask () - getButton рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп ()
рдЪрд╛рд▓рдореВрд╖рдХ рдЪрд╛рд▓getX (), getY () - рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐
KEYDOWN / KEYUPрдХреАрдмреЛрд░реНрдб рдкрд░ рдПрдХ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдирд╛ / рдЬрд╛рд░реА рдХрд░рдирд╛getKey () - рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХрд╛ ASCII рдХреЛрдб рдпрд╛ Key_Symbol рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХрд╛ рдореВрд▓реНрдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, KEY_BackSpace)
рдлреНрд░реЗрдордлреНрд░реЗрдо рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИрдХреЛрдИ рдЗрдирдкреБрдЯ рдирд╣реАрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдШрдЯрдирд╛getUserDataPointer () - рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдмрдлрд╝рд░ рдХреЛ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдПрдХ рджрдмрд╛рдП рдЧрдП рд╕рдВрд╢реЛрдзрдХ рдХреБрдВрдЬреА (рдкреНрд░рдкрддреНрд░ MODKEY_CTRL, MODKEY_SHIFT, MODKEY_ALT, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдореВрд▓реНрдпреЛрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ getModKeyMask () рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 if (ea.getModKeyMask() == osgGA::GUIEventAdapter::MODKEY_CTRL) { //    Ctrl } 

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

2. рд╣рдо рдХреАрдмреЛрд░реНрдб рд╕реЗ рд╕реЗрд╕рдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


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

рдХреАрдмреЛрд░реНрдб рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgGA/GUIEventHandler> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class ModelController : public osgGA::GUIEventHandler { public: ModelController( osg::MatrixTransform *node ) : _model(node) {} virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: osg::ref_ptr<osg::MatrixTransform> _model; }; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ bool ModelController::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { (void) aa; if (!_model.valid()) return false; osg::Matrix matrix = _model->getMatrix(); switch (ea.getEventType()) { case osgGA::GUIEventAdapter::KEYDOWN: switch (ea.getKey()) { case 'a': case 'A': matrix *= osg::Matrix::rotate(-0.1, osg::Z_AXIS); break; case 'd': case 'D': matrix *= osg::Matrix::rotate( 0.1, osg::Z_AXIS); break; case 'w': case 'W': matrix *= osg::Matrix::rotate(-0.1, osg::X_AXIS); break; case 's': case 'S': matrix *= osg::Matrix::rotate( 0.1, osg::X_AXIS); break; default: break; } _model->setMatrix(matrix); break; default: break; } return true; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform; mt->addChild(model.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(mt.get()); osg::ref_ptr<ModelController> mcontrol = new ModelController(mt.get()); osgViewer::Viewer viewer; viewer.addEventHandler(mcontrol.get()); viewer.getCamera()->setViewMatrixAsLookAt( osg::Vec3(0.0f, -100.0f, 0.0f), osg::Vec3(), osg::Z_AXIS ); viewer.getCamera()->setAllowEventFocus(false); viewer.setSceneData(root.get()); return viewer.run(); } 


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЗрдирдкреБрдЯ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 class ModelController : public osgGA::GUIEventHandler { public: ModelController( osg::MatrixTransform *node ) : _model(node) {} virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: osg::ref_ptr<osg::MatrixTransform> _model; }; 

рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рд╣реИрдВрдбрд▓ () рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдХреЛ рд╣реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

 bool ModelController::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { (void) aa; if (!_model.valid()) return false; osg::Matrix matrix = _model->getMatrix(); switch (ea.getEventType()) { case osgGA::GUIEventAdapter::KEYDOWN: switch (ea.getKey()) { case 'a': case 'A': matrix *= osg::Matrix::rotate(-0.1, osg::Z_AXIS); break; case 'd': case 'D': matrix *= osg::Matrix::rotate( 0.1, osg::Z_AXIS); break; case 'w': case 'W': matrix *= osg::Matrix::rotate(-0.1, osg::X_AXIS); break; case 's': case 'S': matrix *= osg::Matrix::rotate( 0.1, osg::X_AXIS); break; default: break; } _model->setMatrix(matrix); break; default: break; } return false; } 

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

 osg::Matrix matrix = _model->getMatrix(); 

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

 case 'a': case 'A': matrix *= osg::Matrix::rotate(-0.1, osg::Z_AXIS); break; 

- рдЬрдм рдЖрдк "A" рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡рд┐рдорд╛рди рдХреЛ -0.1 рд░реЗрдбрд┐рдпрди рдХреЗ yaw рдХреЛрдг рдкрд░ рдШреБрдорд╛рдПрдВред

рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд░реВрдкрд╛рдВрддрд░рдг рдиреЛрдб рдореЗрдВ рдПрдХ рдирдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ

 _model->setMatrix(matrix); 

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

 osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform; mt->addChild(model.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(mt.get()); 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ

 osg::ref_ptr<ModelController> mcontrol = new ModelController(mt.get()); 

рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рджрд░реНрд╢рдХ рдмрдирд╛рдПрдВ

 osgViewer::Viewer viewer; viewer.addEventHandler(mcontrol.get()); 

рдХреИрдорд░рд╛ рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ

 viewer.getCamera()->setViewMatrixAsLookAt( osg::Vec3(0.0f, -100.0f, 0.0f), osg::Vec3(), osg::Z_AXIS ); 

рдЗрдирдкреБрдЯ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдорд░реЗ рдХреЛ рдордирд╛ рдХрд░реЗрдВ

 viewer.getCamera()->setAllowEventFocus(false); 

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

 viewer.setSceneData(root.get()); return viewer.run(); 

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



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

3. рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдЖрдЧрдВрддреБрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ


рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рдорд╛рди, OSG рдЙрди рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдиреЛрдбреНрд╕ рдФрд░ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, setEventCallback () рдФрд░ addEventCallback () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдЪреНрдЪреЗ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ osg :: NodeCallbackред рдСрдкрд░реЗрдЯрд░ () рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рд╛рдЗрдЯ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЛ osgGA :: EventVisitor рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣

 #include <osgGA/EventVisitor> ... void operator()( osg::Node *node, osg::NodeVisitor *nv ) { std::list<osg::ref_ptr<osgGA::GUIEventAdapter>> events; osgGA::EventVisitor *ev = dynamic_cast<osgGA::EventVisitor *>(nv); if (ev) { events = ev->getEvents(); //       } } 

4. рдХрд╕реНрдЯрдо рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


OSG рдПрдХ рдЖрдВрддрд░рд┐рдХ рдИрд╡реЗрдВрдЯ рдХрддрд╛рд░ (FIFO) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХрддрд╛рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдФрд░ рдЙрд╕рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд╡ рдирд┐рд░реНрдорд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХрддрд╛рд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╣реИрдВрдбрд▓ () рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрддрд╛рд░ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдШрдЯрдирд╛ рдХреА рдХрддрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди osgGA :: EventQueue рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп addEvent () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рддрд░реНрдХ osgGA :: GUIEventAdapter рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реЗрдЯрдПрд╡реЗрдВрдЯрдЯрд╛рдЗрдк () рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

OsgGA рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ :: EventQueue рд╡рд░реНрдЧ userEvent () рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдИрд╡реЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд┐рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХрд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

 viewer.getEventQueue()->userEvent(data); 

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

рдЬрдм рдХреЛрдИ рдХрд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ getUserData () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрд╕рдореЗрдВ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╡рд╣ рдлрд┐рдЯ рджреЗрдЦрддрд╛ рд╣реИред

5. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд╛рдЗрдорд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рд╣рдо рдХреНрдпрд╛ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡рдзрд┐рдХ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ рд░реЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FRAME рдкрд░, рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдШрдЯрдирд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реЗрд╕рдирд╛ рдХреЗ рдореЙрдбрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЬрд▓рд╛рдиреЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдордп рдХрд╛ рдЙрджрд╛рд╣рд░рдг
main.h

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

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ struct TimerInfo : public osg::Referenced { TimerInfo(unsigned int c) : _count(c) {} unsigned int _count; }; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class TimerHandler : public osgGA::GUIEventHandler { public: TimerHandler(osg::Switch *sw, unsigned int interval = 1000) : _switch(sw) , _count(0) , _startTime(0.0) , _interval(interval) , _time(0) { } virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: osg::ref_ptr<osg::Switch> _switch; unsigned int _count; double _startTime; unsigned int _interval; unsigned int _time; }; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ bool TimerHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { switch (ea.getEventType()) { case osgGA::GUIEventAdapter::FRAME: { osgViewer::Viewer *viewer = dynamic_cast<osgViewer::Viewer *>(&aa); if (!viewer) break; double time = viewer->getFrameStamp()->getReferenceTime(); unsigned int delta = static_cast<unsigned int>( (time - _startTime) * 1000.0); _startTime = time; if ( (_count >= _interval) || (_time == 0) ) { viewer->getEventQueue()->userEvent(new TimerInfo(_time)); _count = 0; } _count += delta; _time += delta; break; } case osgGA::GUIEventAdapter::USER: if (_switch.valid()) { const TimerInfo *ti = dynamic_cast<const TimerInfo *>(ea.getUserData()); std::cout << "Timer event at: " << ti->_count << std::endl; _switch->setValue(0, !_switch->getValue(0)); _switch->setValue(1, !_switch->getValue(1)); } break; default: break; } return false; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ 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.get(), true); root->addChild(model2.get(), false); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); viewer.addEventHandler(new TimerHandler(root.get(), 1000)); return viewer.run(); } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

 struct TimerInfo : public osg::Referenced { TimerInfo(unsigned int c) : _count(c) {} unsigned int _count; }; 

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

 class TimerHandler : public osgGA::GUIEventHandler { public: TimerHandler(osg::Switch *sw, unsigned int interval = 1000) : _switch(sw) , _count(0) , _startTime(0.0) , _interval(interval) , _time(0) { } virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: osg::ref_ptr<osg::Switch> _switch; unsigned int _count; double _startTime; unsigned int _interval; unsigned int _time; }; 

рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдп рд╣реИрдВред _Switch рдЪрд░ рдПрдХ рдиреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдорд╛рди рдХреЗ рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ; _count - рдЯрд╛рдЗрдорд░ рдШрдЯрдирд╛ рдХреА рдЕрдВрддрд┐рдо рдкреАрдврд╝реА рдХреЗ рдмрд╛рдж рд╕реЗ рдЧреБрдЬрд░реЗ рд╕рдордп рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рдЙрд▓рдЯреА рдЧрд┐рдирддреА, рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ; _startTime - рджрд░реНрд╢рдХ рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдкрд┐рдЫрд▓реА рдЙрд▓рдЯреА рдЧрд┐рдирддреА рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░; _time - рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХреБрд▓ рд╕рдВрдЪрд╛рд▓рди рд╕рдордпред рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реНрд╡рд┐рдЪ рдиреЛрдб рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдЯрд╛рдЗрдорд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ред

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рд╣реИрдВрдбрд▓ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ

 bool TimerHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { switch (ea.getEventType()) { case osgGA::GUIEventAdapter::FRAME: { osgViewer::Viewer *viewer = dynamic_cast<osgViewer::Viewer *>(&aa); if (!viewer) break; double time = viewer->getFrameStamp()->getReferenceTime(); unsigned int delta = static_cast<unsigned int>( (time - _startTime) * 1000.0); _startTime = time; if ( (_count >= _interval) || (_time == 0) ) { viewer->getEventQueue()->userEvent(new TimerInfo(_time)); _count = 0; } _count += delta; _time += delta; break; } case osgGA::GUIEventAdapter::USER: if (_switch.valid()) { const TimerInfo *ti = dynamic_cast<const TimerInfo *>(ea.getUserData()); std::cout << "Timer event at: " << ti->_count << std::endl; _switch->setValue(0, !_switch->getValue(0)); _switch->setValue(1, !_switch->getValue(1)); } break; default: break; } return false; } 

рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ FRAME рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ:
  1. рджрд░реНрд╢рдХ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ

 osgViewer::Viewer *viewer = dynamic_cast<osgViewer::Viewer *>(&aa); 

  1. рд╕рд╣реА рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓рдиреЗ рдкрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ

 double time = viewer->getFrameStamp()->getReferenceTime(); 

рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдП рд╕рдордп рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ

 unsigned int delta = static_cast<unsigned int>( (time - _startTime) * 1000.0); 

рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдЧрдгрдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ

 _startTime = time; 

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

 if ( (_count >= _interval) || (_time == 0) ) { viewer->getEventQueue()->userEvent(new TimerInfo(_time)); _count = 0; } 

_Count рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдлреНрд░реЗрдо рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд▓рдВрдм рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ _time

 _count += delta; _time += delta; 

рдпрд╣ рдХреИрд╕реЗ рдЯрд╛рдЗрдорд░ рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ

 case osgGA::GUIEventAdapter::USER: if (_switch.valid()) { const TimerInfo *ti = dynamic_cast<const TimerInfo *>(ea.getUserData()); std::cout << "Timer event at: " << ti->_count << std::endl; _switch->setValue(0, !_switch->getValue(0)); _switch->setValue(1, !_switch->getValue(1)); } break; 

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

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

 viewer.addEventHandler(new TimerHandler(root.get(), 1000)); 

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

 Timer event at: 0 Timer event at: 1000 Timer event at: 2009 Timer event at: 3017 Timer event at: 4025 Timer event at: 5033 

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

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

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


All Articles