OpenSceneGraph: рд╕рдореВрд╣ рдиреЛрдбреНрд╕, рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдбреНрд╕ рдФрд░ рд╕реНрд╡рд┐рдЪ рдиреЛрдбреНрд╕

рдЫрд╡рд┐

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


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

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдУрдПрд╕рдЬреА рдореЗрдВ рддреАрди рдЖрдпрд╛рдореА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред

1. рдореЙрдбрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕, рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕


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

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

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

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

Ve = V * modelViewMatrix 

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

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

 Vs = V * modelViewMatrix * projectionMatrix * windowMatrix 

рдпрд╛

 Vs = V * MVPW 

рдЬрд╣рд╛рдВ MVPW рддреАрди рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ: рдореЙрдбрд▓-рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рд╕реЗрд╕, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдореИрдЯреНрд░рд┐рд╕реЗрд╕, рдФрд░ рд╡рд┐рдВрдбреЛ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ред

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

 V0 = (Xs, Ys, 0) * invMVPW V1 = (Xs, Ys, 1) * invMVPW 

рдЬрд╣рд╛рдБ invMVPW MVPW рдХрд╛ рд╡рд┐рд▓реЛрдо рд╣реИред

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

2. рд╕рдореВрд╣ рдиреЛрдбреНрд╕


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

Osg :: рд╕рдореВрд╣ рд╡рд░реНрдЧ osg :: Node рд╡рд░реНрдЧ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ osg :: рд╕рдВрджрд░реНрднрд┐рдд рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред osg :: Group рдореЗрдВ рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджреГрд╢реНрдп рд╡реГрдХреНрд╖ рдХреА рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдореЗрдореЛрд░реА рд▓реАрдХ рди рд╣реЛред рдпрд╣ рд╡рд░реНрдЧ рдХрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  1. addChild () - рдиреЛрдб рдХреЛ рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЗрдВрд╕рд░реНрдЯ рдЪрд┐рд▓реНрдб () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рди рдкрд░ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рд░рдЦрддреА рд╣реИ, рдЬреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдпрд╛ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. removeChild () рдФрд░ removeChildren () - рдиреЛрдбреНрд╕ рдХреЗ рдПрдХ рдиреЛрдб рдпрд╛ рд╕рдореВрд╣ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
  3. getChild () - рд╕реВрдЪреА рдореЗрдВ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдиреЛрдб рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
  4. getNumChildren () - рдЗрд╕ рд╕рдореВрд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрд╛рд▓ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рдЬрдирдХ рдиреЛрдб рдкреНрд░рдмрдВрдзрди


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

OSG рджреГрд╢реНрдп рдиреЛрдбреНрд╕ рдХреЛ рдХрдИ рдореВрд▓ рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╣рдо рдХрд┐рд╕реА рджрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)ред рдЗрд╕ рдмреАрдЪ, рд╣рдо osg :: Node рдореЗрдВ рдмрддрд╛рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдореВрд▓ рдиреЛрдбреНрд╕ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
  1. getParent () - рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕реВрдЪрдХ рджреЗрддрд╛ рд╣реИ osg :: рд╕рдореВрд╣ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред
  2. getNumParants () - рдореВрд▓ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  3. getParentalNodePath () - рд╡рд░реНрддрдорд╛рди рдиреЛрдб рд╕реЗ рджреГрд╢реНрдп рдХреЗ рд░реВрдЯ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рдкрде рджреЗрддрд╛ рд╣реИред рдпрд╣ osg :: NodePath рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреА рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред

osg :: NodePath рдПрдХ std рд╣реИ: рд╕рджрд┐рд╢ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдиреЛрдбреНрд╕ рдХрд╛ рд╡реЗрдХреНрдЯрд░ред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб

 osg::NodePath &nodePath = child3->getParentalNodePaths()[0]; for (unsigned int i = 0; i < nodePath.size(); ++i) { osg::Node *node = nodePath[i]; // -    } 

рдиреЛрдбреНрд╕ рд░реВрдЯ, рдЪрд╛рдЗрд▓реНрдб 1, рдЪрд╛рдЗрд▓реНрдб 2 рд▓реМрдЯрд╛рдПрдЧрд╛ред

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

3. рд╕реАрди рдЯреНрд░реА рдореЗрдВ рдХрдИ рдореЙрдбрд▓ рдЬреЛрдбрд╝рдирд╛


рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред

рдкреВрд░реНрдг рд╕рдореВрд╣ рдЙрджрд╛рд╣рд░рдг
main.h
 #ifndef MAIN_H #define MAIN_H #include <osg/Group> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" 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/cow.osg"); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model1.get()); root->addChild(model2.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


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

 osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model1.get()); root->addChild(model2.get()); 



рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рджреГрд╢реНрдп рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдФрд░ рдПрдХ рдЕрдЬреАрдм рджрд░реНрдкрдг рдЧрд╛рдпред рд╡реИрд╕реЗ, рдПрдХ рджрд░реНрдкрдг рдЧрд╛рдп рддрдм рддрдХ рджрд░реНрдкрдг рдирд╣реАрдВ рд╣реЛрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ OpenSceneGraph-Data / Images / reflect.rgb рд╕реЗ рдбреЗрдЯрд╛ / рдЫрд╡рд┐рдпрд╛рдБ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЗрд╕рдХреА рдмрдирд╛рд╡рдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

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

 osg::ref_ptr<osg::Group> model = dynamic_cast<osg::Group *>(osgDB::readNodeFile("../data/cessna.osg")); 

OsgDB :: readNodeFile () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ osg :: Node *, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕рдХреЗ osg :: Group * descendant рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реЗрд╕рдирд╛ рдореЙрдбрд▓ рдиреЛрдб рдПрдХ рд╕рдореВрд╣ рдиреЛрдб рд╣реИ, рддреЛ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдлрд▓ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛, рд░реВрдкрд╛рдВрддрд░рдг NULL рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдЖрдк рд╕рдорд╛рди рдЪрд╛рд▓ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдХрд▓рдХ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ

 //      osg::ref_ptr<osg::Group> group = ...; //     osg::Node* node1 = dynamic_cast<osg::Node*>( group.get() ); //      osg::Node* node2 = group.get(); 

рдкреНрд░рджрд░реНрд╢рди-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ

 osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cessna.osg"); osg::Group* convModel1 = model->asGroup(); //   osg::Geode* convModel2 = model->asGeode(); //  NULL. 

4. рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдиреЛрдбреНрд╕


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



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдУрдкрди рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 glPushMatrix(); glMultMatrix( matrixOfTransform1 ); renderGeode1(); glPushMatrix(); glMultMatrix( matrixOfTransform2 ); renderGeode2(); glPopMatrix(); glPopMatrix(); 

рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Geode1 рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓реА Transform1 рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИ, рдФрд░ Geode2 рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА Transform2 рдореЗрдВ рд╕реЗрдЯ рд╣реИ, Transform1 рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯред рдЙрд╕реА рд╕рдордп, рдУрдПрд╕рдЬреА рдореЗрдВ рдкреВрд░реНрдг рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧреНрд▓реЛрдЧреНрд▓реЛрдореИрдЯрдореИрдЯреНрд░рд┐рдХреНрд╕ () рдУрдкрдирдЬреАрдПрд▓ рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд░рд╛рдмрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛

 transformNode->setReferenceFrame( osg::Transform::ABSOLUTE_RF ); 

рдЖрдк рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рдореЛрдб рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

 transformNode->setReferenceFrame( osg::Transform::RELATIVE_RF ); 

5. рдПрдХ рд╕рдордиреНрд╡рдп рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛


Osg :: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдореВрд▓ OSG рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 4x4 рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рд┐рд▓рдирд╛, рдШреВрдордирд╛, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдЧрдгрдирд╛ред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 //   44 osg::Matrix mat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); 

Osg :: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреНрд▓рд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  1. PostMult () рдФрд░ рдСрдкрд░реЗрдЯрд░ * () - рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рд╣реА рдЧреБрдгрди рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред PreMult () рд╡рд┐рдзрд┐ рдмрд╛рдИрдВ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИред
  2. makeTranslate (), makeRotate () рдФрд░ makeScale () - рд╡рд░реНрддрдорд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ 4x4 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдПрдВ рдЬреЛ рдЖрдВрджреЛрд▓рди, рд░реЛрдЯреЗрд╢рди рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд╡рд╛рдж (), рд░реЛрдЯреЗрдЯ () рдФрд░ рд╕реНрдХреЗрд▓ () рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдореИрдЯреНрд░рд┐рдХреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  3. рдкрд▓рдЯрдирд╛ () - рд╡рд░реНрддрдорд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдЗрд╕рдХрд╛ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг () рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджрд┐рдП рдЧрдП рдПрдХ рдирдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЙрд▓рдЯрд╛ рджреЗрддрд╛ рд╣реИред

OSG рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реИ, рдФрд░ рд╡реИрдХреНрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рд▓рд┐рдП, рд╡реЗрдХреНрдЯрд░ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░реЗрдВ

 osg::Matrix mat = тАж; osg::Vec3 vec = тАж; osg::Vec3 resultVec = vec * mat; 

рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдпрд╣ рджреЗрдЦрдХрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рди рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рд╕ рдХреЛ рдХреИрд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 osg::Matrix mat1 = osg::Matrix::scale(sx, sy, sz); osg::Matrix mat2 = osg::Matrix::translate(x, y, z); osg::Matrix resultMat = mat1 * mat2; 

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

osg :: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рдлреНрд▓реЛрдЯ рдХреЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред

6. рдУрд╕реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: рдореИрдЯреНрд░рд┐рдХреНрд╕рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕


рд╣рдо рджреГрд╢реНрдп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рджреЛ рд╡рд┐рдорд╛рди рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда
main.h
 #ifndef MAIN_H #define MAIN_H #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" 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> transform1 = new osg::MatrixTransform; transform1->setMatrix(osg::Matrix::translate(-25.0, 0.0, 0.0)); transform1->addChild(model.get()); osg::ref_ptr<osg::MatrixTransform> transform2 = new osg::MatrixTransform; transform2->setMatrix(osg::Matrix::translate(25.0, 0.0, 0.0)); transform2->addChild(model.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(transform1.get()); root->addChild(transform2.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдореЙрдбрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

 osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); 

рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдб рдмрдирд╛рдПрдБ

 osg::ref_ptr<osg::MatrixTransform> transform1 = new osg::MatrixTransform; 

рд╣рдордиреЗ рдПрдХреНрд╕ рдЕрдХреНрд╖ 25 рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ

 transform1->setMatrix(osg::Matrix::translate(-25.0, 0.0, 0.0)); 

рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ

 transform1->addChild(model.get()); 

рд╣рдо рджреВрд╕рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдордиреЗ рдЖрдВрджреЛрд▓рди рдХреЛ 25 рдЗрдХрд╛рдЗрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд╛рдИрдВ рдУрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ

 osg::ref_ptr<osg::MatrixTransform> transform2 = new osg::MatrixTransform; transform2->setMatrix(osg::Matrix::translate(25.0, 0.0, 0.0)); transform2->addChild(model.get()); 

рд╣рдо рдПрдХ рд░реВрдЯ рдиреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдиреЛрдбреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдиреЛрдбреНрд╕ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо 1 рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо 2 рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ

 osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(transform1.get()); root->addChild(transform2.get()); 

рдПрдХ рджрд░реНрд╢рдХ рдмрдирд╛рдПрдВ рдФрд░ рд░реВрдЯ рдиреЛрдб рдХреЛ рджреГрд╢реНрдп рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ

 osgViewer::Viewer viewer; viewer.setSceneData(root.get()); 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рд╕реЗ рдРрд╕реА рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред



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

рдЕрдкрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ, osg :: MatrixTransform рд╡рд░реНрдЧ OpenGL рдХрдорд╛рдВрдб glMultMatrix () рдФрд░ glLoadMatrix () рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рдирд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

Osg :: PositionAttitudeTransform рд╡рд░реНрдЧ OpenGL рдлрд╝рдВрдХреНрд╢рдВрд╕ glTranslate (), glScale (), glRotate () рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд╛рд▓ рдиреЛрдбреНрд╕ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  1. setPosition () - рдиреЛрдб рдХреЛ рджрд┐рдП рдЧрдП рд╕реНрдерд╛рди рдореЗрдВ osg :: Vec3 рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ
  2. setScale () - рд╕рдордиреНрд╡рдп рдЕрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░реЗрдВред рд╕рдВрдмрдВрдзрд┐рдд рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░рдХ рдУрдПрд╕рдЬреА :: рд╡реАрдИрд╕реА 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
  3. setAttitude () - рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрдерд╛рдирд┐рдХ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗрдЯ рдХрд░реЗрдВред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ osg :: Quat рд░реЛрдЯреЗрд╢рди рд░реВрдкрд╛рдВрддрд░рдг quaternion рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдХрдИ рдУрд╡рд░рд▓реЛрдб рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ quaternion рдХреЛ рд╕реАрдзреЗ (рдШрдЯрдХ) рджреЛрдиреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреВрд▓рд░ рдПрдВрдЧрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ osg :: Quat (xAngle, osg :: X_AXIS, yAngle, osgle) :: Y_AXIS, zAngle, osg :: Z_AXIS) (рдХреЛрдг рд░рд╛рдбрд╛рд░ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ)!


7. рд╕реНрд╡рд┐рдЪ рдиреЛрдбреНрд╕


рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - osg :: рд╕реНрд╡рд┐рдЪ, рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдиреЛрдб рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдпрд╣ osg рдХрд╛ рдПрдХ рд╡рдВрд╢рдЬ рд╣реИ :: рд╕рдореВрд╣ рд╡рд░реНрдЧ рдФрд░ рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЛ рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреА рдХрдИ рдЙрдкрдпреЛрдЧреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ:
  1. рдПрдХ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдУрд╡рд░рд▓реЛрдбреЗрдб рдРрдб рдЪрд┐рд▓реНрдб (), рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдХреБрдВрдЬреА рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
  2. setValue () - рджреГрд╢реНрдпрддрд╛ / рдЕрджрд░реНрд╢рди рдХреБрдВрдЬреА рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рдмрд╛рд▓ рдиреЛрдб рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдХреБрдВрдЬреА рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, getValue () рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдиреЛрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдХреБрдВрдЬреА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  3. setNewChildDefaultValue () - рдмрдЪреНрдЪреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд╕рднреА рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рд┐рдЪ
main.h
 #ifndef MAIN_H #define MAIN_H #include <osg/Switch> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 


main.cpp
 #include "main.h" 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(), false); root->addChild(model2.get(), true); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЙрджрд╛рд╣рд░рдг рддреБрдЪреНрдЫ рд╣реИ - рд╣рдо рджреЛ рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реЗрд╕рдирд╛ рдФрд░ рдПрдХ рд╕реЗрд╕рдирд╛ рдПрдХ рдЬрд▓рддреЗ рд╣реБрдП рдЗрдВрдЬрди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде

 osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("../data/cessnafire.osg"); 

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

 osg::ref_ptr<osg::Switch> root = new osg::Switch; root->addChild(model1.get(), false); root->addChild(model2.get(), true); 

рдпрд╣реА рд╣реИ, рдореЙрдбрд▓ 1 рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдореЙрдбрд▓ 2 рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдХрд░ рджреЗрдЦреЗрдВрдЧреЗ



рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдХрд░ рд╣рдо рд╡рд┐рдкрд░реАрдд рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВрдЧреЗ

 root->addChild(model1.get(), true); root->addChild(model2.get(), false); 



рджреЛрдиреЛрдВ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдореЙрдбрд▓ рджреЗрдЦреЗрдВрдЧреЗ

 root->addChild(model1.get(), true); root->addChild(model2.get(), true); 



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

 switchNode->setValue(0, false); switchNode->setValue(0, true); switchNode->setValue(1, true); switchNode->setValue(1, false); 

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


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

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

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


All Articles