
рдкрд░рд┐рдЪрдп
рдПрдХ рдУрд░, OpenSceneGraph рдЗрдВрдЬрди рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдкреНрд░рдмрдВрдзрди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдиреНрдирдд рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╣реИред рд╣рдордиреЗ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, C ++ / STL рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
QtDesigner рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ OSG рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдиреАрдЪреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАредрджреВрд╕рд░реА рдУрд░, C ++ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ (рдЬреИрд╕реЗ рдмрдврд╝рд╛рд╡рд╛) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╣реА рдПрдХ рдврд╛рдВрдЪрд╛ рдЕрд▓реНрдЯреНрд░рд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрдпреВрдЯреА рд╣реИред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдореЗрдЯрд╛-рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЕрдиреНрдп рдХрдорд┐рдпреЛрдВ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдЯреА рдХреЛ рдХреИрд╕реЗ рдбрд╛рдВрдЯрд╛, рдХреНрдпреВрдЯреА рдХреА рд╢рдХреНрддрд┐ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╢реНрд░реЗрдгреА рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИ рдЬреЛ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рднреА рдХрд▓реНрдкрдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ, рд╕рд╛рде рд╣реА "рд╕рд┐рдЧреНрдирд▓ - рд╕реНрд▓реЙрдЯ" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдЖрд╡реЗрджрди рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░ рднреАред
рдФрд░ рдирд░рдХ, рджреЛ рддрдХрдиреАрдХреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛: рдХреНрдпреВрдЯреА рдФрд░ рдУрдПрд╕рдЬреАред рдореЗрд░реА рдЯреАрдо рдХреЛ рдПрдХ рдРрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА
рдЕрдкрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рдереЛрдбрд╝рд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╣реЛрдЧрд╛ред
OSG рдФрд░ Qt рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- OSG рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Qt рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
- OSG рджрд░реНрд╢рдХ рдХрд╛ рдПрдХреАрдХрд░рдг C ++ / Qt рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдЪрд┐рддреНрд░рдордп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ QtDesigner рдлреЙрд░реНрдо рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХреНрдпреВрдЯреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЬреАрдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡реЗрджрди рдШрдЯрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯреНрд╕ рдкрд░ рдПрдХ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдУрдПрд╕рдЬреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред
рдУрдПрд╕рдЬреА рдЗрдВрдЬрди рдПрдХреАрдХрд░рдг рдФрд░ рдХреНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреВрдЯреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдорд╛рдирдХреАрдХреГрдд рдЬреАрдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ред
1. QG рд╕рд┐рдЧреНрдирд▓ рдПрдХ OSG рд╡рд┐рдВрдбреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ
рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рд╣рдж рддрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╣реЛрдЧрд╛: рд╣рдо рдПрдХ рдЖрджрд┐рдо рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдУрдПрд╕рдЬреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ; рджреЛ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧреА, рдФрд░ рджреВрд╕рд░рд╛ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣реИрдВрдбрд▓рд░ рдПрдХ рдХреНрдпреВрдЯреА рд╕рд┐рдЧреНрдирд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рдеред
рдХреНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
- QObject рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕реЗрд╕
- рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реНрдореГрддрд┐ рдореЗрдВ рдореМрдЬреВрдж QApplication (рдпрд╛ QCoreApplication) рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб
рдпрд╣рд╛рдВ рдореЗрд░реЗ OSG- рдкрд╛рда рднрдВрдбрд╛рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдЪрдХреНрд░ рдХреЗ рд╕рднреА рдкрд╛рда рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрддрд╛рд░ рдХреЛ "рдЯреНрд╡рд┐рд╕реНрдЯ" рдХрд░реЗрдЧрд╛ред
рдХреНрдпреВрдЯреА-events.h#ifndef QT_EVENTS_H #define QT_EVENTS_H #include <osgGA/GUIEventHandler> #include <QCoreApplication> //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class QtEventsHandler : public osgGA::GUIEventHandler { public: QtEventsHandler(); virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: }; #endif // QT_EVENTS_H
рдХреНрдпреВрдЯреА-events.cpp #include "qt-events.h"
рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рдорд╛рдирдХ OSG рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЬреЛ рдПрдХ рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп, рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде Qt рд╕рд┐рдЧреНрдирд▓ рдХреНрдпреВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ
QCoreApplication::processEvents(QEventLoop::AllEvents);
рдЕрдм рдЖрдЗрдП рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рдХреАрдмреЛрд░реНрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ, рдУрдПрд╕рдЬреА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреНрдпреВрдЯреА рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдоред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдирдореИрдЯрдорд╛рдЗрдЬрд╝реНрдб рдорд▓реНрдЯреАрдкрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
keyhandler.h #ifndef KEY_HANDLER_H #define KEY_HANDLER_H #include <osgGA/GUIEventHandler> #include <QObject> //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class KeyboardHandler : public QObject, public osgGA::GUIEventHandler { Q_OBJECT public: KeyboardHandler(QObject *parent = Q_NULLPTR) : QObject(parent) , osgGA::GUIEventHandler () { } bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { switch (ea.getEventType()) { case osgGA::GUIEventAdapter::KEYDOWN: emit sendMessage("Pressed key " + QString(ea.getKey())); break; default: break; } return false; } signals: void sendMessage(QString msg); private: }; #endif // KEY_HANDLER_H
рдХреНрд▓рд╛рд╕ рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдЧрд╛ред рдпрд╣ рд╕рдВрдХреЗрдд рдПрдХ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ OSG рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ QObject рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╕реНрд▓реЙрдЯ рд╣реИ рдЬреЛ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ
receiver.h #ifndef RECEIVER_H #define RECEIVER_H #include <QObject> #include <iostream> //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class Receiver : public QObject { Q_OBJECT public: Receiver(QObject *parent = Q_NULLPTR) : QObject(parent) {} public slots: void printMessage(QString msg) { std::cout << msg.toStdString() << std::endl; } }; #endif // RECEIVER_H
рдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдПрдХ OSG рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдХрд░ рд░рдЦреЗрдВ
main.h #ifndef MAIN_H #define MAIN_H #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <QCoreApplication> #include "qt-events.h" #include "keyhandler.h" #include "receiver.h" #endif
main.cpp #include "main.h"
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо QCoreApplication рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред
QCoreApplication app(argc, argv);
рдпрд╣ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо
QCoreApplication :: exec () рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗ ! рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рд╣рдорд╛рд░реЗ osgViewer рдХреЗ рдЕрдВрджрд░ рд╕реНрдкрд┐рди рдХрд░реЗрдЧрд╛ :: рд╡реНрдпреВрдЕрд░ :: рд░рди () рд▓реВрдк, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред
viewer.addEventHandler(new QtEventsHandler);
рд╣рдо рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХреНрдпреВрдЯреА рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕реНрд▓реЙрдЯ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
KeyboardHandler *keyboardHandler = new KeyboardHandler; Receiver *receiver = new Receiver; QObject::connect(keyboardHandler, &KeyboardHandler::sendMessage, receiver, &Receiver::printMessage);
рдХреАрдмреЛрд░реНрдб рд╣реИрдВрдбрд▓рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ
viewer.addEventHandler(keyboardHandler);
рд╕рднреА рджрд░реНрд╢рдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВ
return viewer.run();
рдФрд░ рдРрд╕реА рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВ
рд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рд╣рдж рддрдХ рд╡рдВрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ QG рддрдВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ OSG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
OpenSceneGraph 3. Cookbook рд╕реЗ
рдЪрдордХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдиреЗ, рдореЗрд░реЗ рдФрд░ рдореЗрд░реА рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдФрд░ рдирд╕реЛрдВ рдХреА рдмрдЪрдд рдХреА, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдПрдХ рдХреНрдпреВрдЯреА-рдЖрдзрд╛рд░рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реА рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рдХреЗ рднреАрддрд░ рдбреАрдмрдЧ рдФрд░ рдорд╛рдирдХреАрдХреГрдд рдерд╛ред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрднреА рднреА Qt GUI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ OSG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
2. osgQt рдкреБрд╕реНрддрдХрд╛рд▓рдп
osgQt рдПрдХ рдПрдХреАрдХрд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдХреНрдпреВрдЯреА рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдУрдПрд╕рдЬреА рдкрд░ рд▓рд╛рдЧреВ 3 рдбреА рджреГрд╢реНрдп рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛
- рдПрдХ OSG рджреГрд╢реНрдп рдХреЗ рдЕрдВрджрд░ рдПрдХ 3 рдбреА рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕рддрд╣ рдкрд░ рдХреНрдпреВрдЯреА рд╡рд┐рдЧреЗрдЯреНрд╕ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ред рдЬреА рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛ - рдХреНрдпреВрдЯреА рд╡рд┐рдЬреЗрдЯреНрд╕ рдЖрднрд╛рд╕реА рджреБрдирд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдЪреБрдкрдЪрд╛рдк рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рджрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛
рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд
рдУрдкрдирд╕реЗрдХреЗрдЧреНрд░рд╛рдл рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ
ред 3. рдХреБрдХрдмреБрдХрдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рдЗрдВрдЬрди рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕реЗ
рдЪрдХреНрд░ рдХреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ ред рдПрдХрдорд╛рддреНрд░ рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрд╣реИ рдХрд┐ -DCMAKE_INSTALL_PREFIX рдХреЛ рдЙрд╕реА рдХреЗ рд╕рд╛рде рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрдВрдЬрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕рд▓рд┐рдП рдЗрдВрдЬрди рдХреЗ рдмрдЧрд▓ рдореЗрдВ osgQt рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред
3. рдСрд╕рдЧрд╡реЙрдпрд░ рдХрд╛ рдПрдХреАрдХрд░рдг :: рдХреНрдпреВрдЯреА рдЬреАрдпреВрдЖрдИ рдореЗрдВ рджрд░реНрд╢рдХ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рджрд░реНрд╢рдХ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдорд╛рдирдХ Qt рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ * .osg рдкреНрд░рд╛рд░реВрдк рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо QtDeisgner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
"Qt рд╡рд┐рдЬреЗрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ" рдЬреИрд╕реА рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдореЗрдиреВ рдмрд╛рд░, рдЯреВрд▓рдмрд╛рд░ рдФрд░ рд╕реНрдЯреЗрдЯрд╕ рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред QtDesigner рдореЗрдВ, рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ QFrame рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВред

рд╣рдо рдЗрд╕ рдлреНрд░реЗрдо рдореЗрдВ OSG рд╡реНрдпреВрдЕрд░ рдХреЛ рдЬрдЧрд╣ рджреЗрдВрдЧреЗред OSG рджрд░реНрд╢рдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ Qt рд╡рд┐рдЬреЗрдЯ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдо QViewerWidget рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреЗрдВрдЧреЗред рдореИрдВрдиреЗ рд╕реНрдкреЙрдЗрд▓рд░ рдкрд░ рдкреВрд░реЗ рд╕реНрд░реЛрдд рдбрд╛рд▓ рджрд┐рдП рд╣реИрдВ, рддрд╛рдХрд┐ рдХреЛрдб рдХреА рд╢реАрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдзреБрдВрдзрд▓рд╛ рди рдХрд░реЗрдВ
qviewerwidget.h #ifndef QVIEWER_WIDGET_H #define QVIEWER_WIDGET_H #include <QWidget> #include <osgViewer/Viewer> #include <osgQt/GraphicsWindowQt> //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ class QViewerWidget : public QWidget { public: QViewerWidget(const QRect &geometry); virtual ~QViewerWidget(); osg::Group *getScene(); osgViewer::Viewer *getViewer(); protected: osg::ref_ptr<osg::Group> scene; osgViewer::Viewer viewer; private: osgQt::GraphicsWindowQt *createGraphicsWindow(const QRect &geometry); void initCamera(const QRect &geometry); void paintEvent(QPaintEvent *); }; #endif // QVIEWER_WIDGET_H
qviewerwidget.cpp include "qviewerwidget.h" #include <osgViewer/ViewerEventHandlers> #include <osgGA/TrackballManipulator> #include <QGridLayout> //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ QViewerWidget::QViewerWidget(const QRect &geometry) : QWidget() , scene(new osg::Group) { initCamera(geometry); viewer.setSceneData(scene); viewer.addEventHandler(new osgViewer::StatsHandler); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); osgQt::GraphicsWindowQt *gw = static_cast<osgQt::GraphicsWindowQt *>(viewer.getCamera()->getGraphicsContext()); QGridLayout *layout = new QGridLayout; if (layout != Q_NULLPTR) { layout->addWidget(gw->getGLWidget()); this->setLayout(layout); } } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ QViewerWidget::~QViewerWidget() { } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osg::Group *QViewerWidget::getScene() { return scene.get(); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osgViewer::Viewer *QViewerWidget::getViewer() { return &viewer; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osgQt::GraphicsWindowQt *QViewerWidget::createGraphicsWindow(const QRect &geometry) { osg::DisplaySettings *ds = osg::DisplaySettings::instance().get(); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->windowName = ""; traits->windowDecoration = false; traits->x = geometry.x(); traits->y = geometry.y(); traits->width = geometry.width(); traits->height = geometry.height(); if (traits->height == 0) traits->height = 1; traits->doubleBuffer = true; traits->alpha = ds->getMinimumNumAlphaBits(); traits->stencil = ds->getMinimumNumStencilBits(); traits->sampleBuffers = ds->getMultiSamples(); traits->samples = ds->getNumMultiSamples(); return new osgQt::GraphicsWindowQt(traits.get()); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void QViewerWidget::initCamera(const QRect &geometry) { osg::Camera *camera = viewer.getCamera(); osg::ref_ptr<osgQt::GraphicsWindowQt> gw = createGraphicsWindow(geometry); gw->setTouchEventsEnabled(true); camera->setGraphicsContext(gw.get()); const osg::GraphicsContext::Traits *traits = gw->getTraits(); camera->setClearColor(osg::Vec4(0.7f, 0.7f, 0.7f, 1.0f)); camera->setViewport(0, 0, traits->width, traits->height); double aspect = static_cast<double>(traits->width) / static_cast<double>(traits->height); camera->setProjectionMatrixAsPerspective(30.0, aspect, 1.0, 1000.0); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void QViewerWidget::paintEvent(QPaintEvent *) { viewer.frame(); }
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдСрд╕реН рдХреНрдпреВрдЯ :: рдЧреНрд░рд╛рдлрд┐рдХреНрд╕рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреНрдпреВрдЧреНрд▓реАрдбрдЧреЗрдЯ рд╡рд░реНрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡рд┐рдВрдбреЛ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
osgQt::GraphicsWindowQt *QViewerWidget::createGraphicsWindow(const QRect &geometry) { osg::DisplaySettings *ds = osg::DisplaySettings::instance().get(); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->windowName = ""; traits->windowDecoration = false; traits->x = geometry.x(); traits->y = geometry.y(); traits->width = geometry.width(); traits->height = geometry.height(); if (traits->height == 0) traits->height = 1; traits->doubleBuffer = true; traits->alpha = ds->getMinimumNumAlphaBits(); traits->stencil = ds->getMinimumNumStencilBits(); traits->sampleBuffers = ds->getMultiSamples(); traits->samples = ds->getNumMultiSamples(); return new osgQt::GraphicsWindowQt(traits.get()); }
рд╡рд┐рдВрдбреЛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рд┐рдд рдЬреНрдпрд╛рдорд┐рддрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдУрдПрд╕рдЬреА 3 рдбреА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реМрдЯрд╛ рд╣реБрдЖ рдкреЙрдЗрдВрдЯрд░ OSG рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕реЗ рдХреИрдорд░реЗ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд▓рд╛ рдХрджрдо рдХреИрдорд░рд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ
void QViewerWidget::initCamera(const QRect &geometry) { osg::Camera *camera = viewer.getCamera(); osg::ref_ptr<osgQt::GraphicsWindowQt> gw = createGraphicsWindow(geometry); gw->setTouchEventsEnabled(true); camera->setGraphicsContext(gw.get()); const osg::GraphicsContext::Traits *traits = gw->getTraits(); camera->setClearColor(osg::Vec4(0.7f, 0.7f, 0.7f, 1.0f)); camera->setViewport(0, 0, traits->width, traits->height); double aspect = static_cast<double>(traits->width) / static_cast<double>(traits->height); camera->setProjectionMatrixAsPerspective(30.0, aspect, 1.0, 1000.0); }
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓
camera->setGraphicsContext(gw.get());
рдФрд░ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП QGLWidget рд╡рд┐рдЬреЗрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдкреВрд░реЗ рд╡рд┐рдЬреЗрдЯ рд░реВрдЯреАрди рдХреЛ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛
QViewerWidget::QViewerWidget(const QRect &geometry) : QWidget() , scene(new osg::Group) { initCamera(geometry); viewer.setSceneData(scene); viewer.addEventHandler(new osgViewer::StatsHandler); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); osgQt::GraphicsWindowQt *gw = static_cast<osgQt::GraphicsWindowQt *>(viewer.getCamera()->getGraphicsContext()); QGridLayout *layout = new QGridLayout; if (layout != Q_NULLPTR) { layout->addWidget(gw->getGLWidget()); this->setLayout(layout); } }
рдпрд╣рд╛рдВ рд╣рдо рджрд░реНрд╢рдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪреБрдиреМрддреА рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
рджрд░реНрд╢рдХ рдХреЛ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ред рдУрдПрд╕рдЬреА рдХреЛ рдХреНрдпреВрдЯреА рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдкрд░ рдУрдПрд╕ рджреНрд╡рд╛рд░рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдбреАрдмреНрд░реАрдлрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рдЗрд╕ рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ
osgQt::GraphicsWindowQt *gw = static_cast<osgQt::GraphicsWindowQt *>(viewer.getCamera()->getGraphicsContext()); QGridLayout *layout = new QGridLayout; if (layout != Q_NULLPTR) { layout->addWidget(gw->getGLWidget()); this->setLayout(layout); }
рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдкрд░рдд рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреИрдорд░реЗ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рд▓реМрдЯреЗ QGLWidget рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реБрдП, рдПрдХ osgQt :: GraphicsWindows рд╕реВрдЪрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХреЙрд▓ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ QViewerWidget рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдкрд░рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
this->setLayout(layout);
рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде, рд╡рд┐рдВрдбреЛ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдкрд░ рджреГрд╢реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ QPaintEvent рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
void QViewerWidget::paintEvent(QPaintEvent *) { viewer.frame(); }
рдЬрд┐рд╕рдореЗрдВ рд╣рдо osgViewer :: Viewer :: рдлреНрд░реЗрдо () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдлреНрд░реЗрдо рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред
рдареАрдХ рд╣реИ, рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдХреЛрдб рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рд╣рдо рдЗрд╕реЗ рдлреЙрд░реНрдо рдореЗрдВ рд╕реНрдерд┐рдд рдлреНрд░реЗрдо рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдирд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣рдо рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , qviewer(Q_NULLPTR) { ui->setupUi(this); QGridLayout *layout = new QGridLayout; qviewer = new QViewerWidget(QRect(0, 0, ui->frame->width(), ui->frame->height())); layout->addWidget(qviewer); ui->frame->setLayout(layout); this->setCentralWidget(ui->frame); connect(&timer, &QTimer::timeout, this, &MainWindow::update); timer.start(40); connect(ui->actionQuit, &QAction::triggered, this, &MainWindow::quit); connect(ui->actionClean, &QAction::triggered, this, &MainWindow::clean); connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::open); this->setWindowTitle("QViewerWidget example"); }
рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрднреА рднреА рдЗрд╕рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ
QGridLayout *layout = new QGridLayout; qviewer = new QViewerWidget(QRect(0, 0, ui->frame->width(), ui->frame->height())); layout->addWidget(qviewer); ui->frame->setLayout(layout); this->setCentralWidget(ui->frame);
рдЬрд╣рд╛рдБ рд╣рдо рдПрдХ рдкрд░рдд рдмрдирд╛рддреЗ рд╣реИрдВ, рдлреНрд░реЗрдо рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, рдЕрдкрдирд╛ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдЬреЗрдЯ рдХреЛ рдкрд░рдд рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рдд рдХреЛ рдлреНрд░реЗрдо рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдФрд░, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рдо рдлреНрд░реЗрдо рдХреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдкреВрд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреНрд╖реЗрддреНрд░ рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХреЗрдВрджреНрд░реАрдп рд╡рд┐рдЬреЗрдЯ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЖрд╡рдзрд┐рдХ рд╡рд┐рдВрдбреЛ рдЕрдкрдбреЗрдЯ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 40 рдорд┐рд▓реАрд╕реЗрдХрдВрдб (25 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдПрдВ рдФрд░ рд╡рд┐рдВрдбреЛ рдЕрдкрдбреЗрдЯ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВред рдореИрдВ рдЗрд╕реЗ Qt5 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░рддрд╛ рд╣реВрдВ
connect(&timer, &QTimer::timeout, this, &MainWindow::update); timer.start(40);
рдкрд╣рд▓реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рд╕реНрд▓реЙрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
void MainWindow::update() { QMainWindow::update(this->geometry()); }
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реАрдзреЗ QMainWindow рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдорд░ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ :: рдЕрджреНрдпрддрди рд╕реНрд▓реЙрдЯ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреИрд╕реЗ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ osgQb рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ
connect(&timer, SIGNAL(timeout), this, SLOT(update));
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ SIGNAL () рдФрд░ SLOT () рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрджрд╛рд╡рдирдд рд╣реИ, рдФрд░ Qt6 рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реА рд╕рдордп, QMainWindow рд╡рд░реНрдЧ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдбреЗрдЯ () рд╕реНрд▓реЙрдЯ рдХрд╛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдмрд╛рдЗрдВрдб рдХреЙрд▓ рдкрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрдкрдиреЗ рдЕрдкрдбреЗрдЯ () рд╕реНрд▓реЙрдЯ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рдореЗрдВ рдЖрдзрд╛рд░ QMainWindow :: update () рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╡рд╣рд╛рдВ рд╡рд┐рдВрдбреЛ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ред
рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ

"S" рджрдмрд╛рдХрд░ рд╣рдо OSG рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдореЙрдирд┐рдЯрд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╡рд┐рдЬреЗрдЯ рдПрдХ рдЦрд╛рд▓реА рджреГрд╢реНрдп рдЖрд░реЗрдЦрдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА?рд▓реЗрдЦ рдХреЛ рдУрд╡рд░рд▓реЛрдб рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдУрдПрд╕рдЬреА рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдирд┐рдЯрд░ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЗрдВрдЬрди рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╡реНрдпреВрдЕрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ
#include <osgViewer/ViewerEventHandlers>
рдФрд░ рджрд░реНрд╢рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ
viewer.addEventHandler(new osgViewer::StatsHandler);
рдлрд┐рд░ рдХрд┐рд╕реА рднреА рд╕рдордп "рдПрд╕" рджрдмрд╛рдХрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
4. рд╣рдорд╛рд░реЗ рджрд░реНрд╢рдХ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ: рдПрдХ рдореЗрдиреВ рдЬреЛрдбрд╝реЗрдВ
рдлрд╝реЙрд░реНрдо рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдореЗрдВ, рд╣рдо "рдорд╛рдЙрд╕-рдУрд░рд┐рдПрдВрдЯреЗрдб" рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЙрджрд╛рд╕реАрди рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдиреВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдорд┐рд▓реЗрдЧрд╛

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

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