рдЧрд╛рдореЗрджреЗрд╡ рдореЗрдВ рдорда рд╕рд░рд▓ рд╣реИред рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдФрд░ рдЕрдлрд╛рдЗрди рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди

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



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

рдЯреАрдЖрд░рдПрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕


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



рдЬрд╣рд╛рдВ:
рдЪрд╛рд▓ рдЯреА = рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ 3 (рдбреА, рдПрдЪ, рдПрд▓) рд╣реИред
рд╕реНрдХреЗрд▓рд┐рдВрдЧ - s = рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ 3 (рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ 3 (рдП, рдИ, рдЖрдИ)ред рдореИрдЧреНрдирд┐рдЯреНрдпреВрдб, рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ 3 (рдмреА, рдПрдл, рдЬреЗ)ред рдореИрдЧреНрдирд┐рдЯреНрдпреВрдб, рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ 3 (рд╕реА, рдЬреА, рдХреЗ)ред рдореИрдЧреНрдирдорд┐рдЯреНрдпреВрдб)ред

рдПрдХ рдШреБрдорд╛рд╡ рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ:



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

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

рдЯреАрдЖрд░рдПрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЯреАрдЖрд░рдПрд╕ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ, рд░реЛрдЯреЗрд╢рди рдФрд░ рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдкрдШрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореИрдЯреНрд░рд┐рдХреНрд╕ 4x4 рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

рд╕реНрдерд┐рддрд┐, рд░реЛрдЯреЗрд╢рди рдФрд░ рд╕реНрдХреЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
public static Vector3 ExtractPosition(this Matrix4x4 matrix) { Vector3 position; position.x = matrix.m03; position.y = matrix.m13; position.z = matrix.m23; return position; } public static Quaternion ExtractRotation(this Matrix4x4 matrix) { Vector3 forward; forward.x = matrix.m02; forward.y = matrix.m12; forward.z = matrix.m22; Vector3 upwards; upwards.x = matrix.m01; upwards.y = matrix.m11; upwards.z = matrix.m21; return Quaternion.LookRotation(forward, upwards); } public static Vector3 ExtractScale(this Matrix4x4 matrix) { Vector3 scale; scale.x = new Vector4(matrix.m00, matrix.m10, matrix.m20, matrix.m30).magnitude; scale.y = new Vector4(matrix.m01, matrix.m11, matrix.m21, matrix.m31).magnitude; scale.z = new Vector4(matrix.m02, matrix.m12, matrix.m22, matrix.m32).magnitude; return scale; } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕рдореЗрдВ TRS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреНрд▓рд╛рд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди
 public static void ApplyLocalTRS(this Transform tr, Matrix4x4 trs) { tr.localPosition = trs.ExtractPosition(); tr.localRotation = trs.ExtractRotation(); tr.localScale = trs.ExtractScale(); } public static Matrix4x4 ExtractLocalTRS(this Transform tr) { return Matrix4x4.TRS(tr.localPosition, tr.localRotation, tr.localScale); } 


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

рд╕реНрдХреЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рдирд╛ / рдШрдЯрд╛рдирд╛ рдФрд░ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИред рдпрд╣ рдмрд▓реНрдХрд┐ рднрд╛рд░реА рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрдХрдЧрдгрд┐рдд рд╕рд░рд▓ рд╣реИред

рдмреБрдирд┐рдпрд╛рджреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдСрдкрд░реЗрд╢рди
 public static Matrix4x4 MutiplyByNumber(this Matrix4x4 matrix, float number) { return new Matrix4x4( new Vector4(matrix.m00 * number, matrix.m10 * number, matrix.m20 * number, matrix.m30 * number), new Vector4(matrix.m01 * number, matrix.m11 * number, matrix.m21 * number, matrix.m31 * number), new Vector4(matrix.m02 * number, matrix.m12 * number, matrix.m22 * number, matrix.m32 * number), new Vector4(matrix.m03 * number, matrix.m13 * number, matrix.m23 * number, matrix.m33 * number) ); } public static Matrix4x4 DivideByNumber(this Matrix4x4 matrix, float number) { return new Matrix4x4( new Vector4(matrix.m00 / number, matrix.m10 / number, matrix.m20 / number, matrix.m30 / number), new Vector4(matrix.m01 / number, matrix.m11 / number, matrix.m21 / number, matrix.m31 / number), new Vector4(matrix.m02 / number, matrix.m12 / number, matrix.m22 / number, matrix.m32 / number), new Vector4(matrix.m03 / number, matrix.m13 / number, matrix.m23 / number, matrix.m33 / number) ); } public static Matrix4x4 Plus(this Matrix4x4 matrix, Matrix4x4 matrixToAdding) { return new Matrix4x4( new Vector4(matrix.m00 + matrixToAdding.m00, matrix.m10 + matrixToAdding.m10, matrix.m20 + matrixToAdding.m20, matrix.m30 + matrixToAdding.m30), new Vector4(matrix.m01 + matrixToAdding.m01, matrix.m11 + matrixToAdding.m11, matrix.m21 + matrixToAdding.m21, matrix.m31 + matrixToAdding.m31), new Vector4(matrix.m02 + matrixToAdding.m02, matrix.m12 + matrixToAdding.m12, matrix.m22 + matrixToAdding.m22, matrix.m32 + matrixToAdding.m32), new Vector4(matrix.m03 + matrixToAdding.m03, matrix.m13 + matrixToAdding.m13, matrix.m23 + matrixToAdding.m23, matrix.m33 + matrixToAdding.m33) ); } public static Matrix4x4 Minus(this Matrix4x4 matrix, Matrix4x4 matrixToMinus) { return new Matrix4x4( new Vector4(matrix.m00 - matrixToMinus.m00, matrix.m10 - matrixToMinus.m10, matrix.m20 - matrixToMinus.m20, matrix.m30 - matrixToMinus.m30), new Vector4(matrix.m01 - matrixToMinus.m01, matrix.m11 - matrixToMinus.m11, matrix.m21 - matrixToMinus.m21, matrix.m31 - matrixToMinus.m31), new Vector4(matrix.m02 - matrixToMinus.m02, matrix.m12 - matrixToMinus.m12, matrix.m22 - matrixToMinus.m22, matrix.m32 - matrixToMinus.m32), new Vector4(matrix.m03 - matrixToMinus.m03, matrix.m13 - matrixToMinus.m13, matrix.m23 - matrixToMinus.m23, matrix.m33 - matrixToMinus.m33) ); } 


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

рдПрдХ рд╕рджрд┐рд╢ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рджрд┐рд╢ рдЧреБрдгрд╛ рдХрд░реЗрдВ
 public static Matrix4x4 MultiplyVectorsTransposed(Vector4 vector, Vector4 transposeVector) { float[] vectorPoints = new[] {vector.x, vector.y, vector.z, vector.w}, transposedVectorPoints = new[] {transposeVector.x, transposeVector.y, transposeVector.z, transposeVector.w}; int matrixDimension = vectorPoints.Length; float[] values = new float[matrixDimension * matrixDimension]; for (int i = 0; i < matrixDimension; i++) { for (int j = 0; j < matrixDimension; j++) { values[i + j * matrixDimension] = vectorPoints[i] * transposedVectorPoints[j]; } } return new Matrix4x4( new Vector4(values[0], values[1], values[2], values[3]), new Vector4(values[4], values[5], values[6], values[7]), new Vector4(values[8], values[9], values[10], values[11]), new Vector4(values[12], values[13], values[14], values[15]) ); } 


рдЧреГрд╣рд╕реНрде рдкрд░рд┐рд╡рд░реНрддрди


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

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

H = I-2 * n * (n ^ T)

рдЬрд╣рд╛рдВ H рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, I рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ Matrix4x4.identity рд╣реИ, рдФрд░ n = new Vector4 (planeNormal.x, planeNormal.y, planeNormal.z, 0)ред рдкреНрд░рддреАрдХ T рдХрд╛ рдЕрд░реНрде рд╣реИ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝рд┐рд╢рди, рдЕрд░реНрдерд╛рдд n * (n ^ T) рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ 4x4 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдорд┐рд▓рддрд╛ рд╣реИред

рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдХрд╛рдо рдЖрдПрдВрдЧреЗ рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдмрд╣реБрдд рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛрдЧреАред

рдЧреГрд╣рд╕реНрде рдкрд░рд┐рд╡рд░реНрддрди
 public static Matrix4x4 HouseholderReflection(this Matrix4x4 matrix4X4, Vector3 planeNormal) { planeNormal.Normalize(); Vector4 planeNormal4 = new Vector4(planeNormal.x, planeNormal.y, planeNormal.z, 0); Matrix4x4 householderMatrix = Matrix4x4.identity.Minus( MultiplyVectorsTransposed(planeNormal4, planeNormal4).MutiplyByNumber(2)); return householderMatrix * matrix4X4; } 


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

рдЕрдм рдПрдХрддрд╛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ

рд╕реНрдерд╛рдиреАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкрд░рд╛рд╡рд░реНрддрди рдкрд░рд┐рд╡рд░реНрддрди
 public static void LocalReflect(this Transform tr, Vector3 planeNormal) { var trs = tr.ExtractLocalTRS(); var reflected = trs.HouseholderReflection(planeNormal); tr.ApplyLocalTRS(reflected); } 


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



рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles