рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдХрдо рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреБрдорд╛рдиреЛрдВ, рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╕рдордЭ (рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдХреЗрд▓рд░ (рдбреЙрдЯ) рдХрд╛ рд╕рд╣реА рдЕрд░реНрде рд╣реИ) рдФрд░ рд╡реЗрдХреНрдЯрд░ (рдХреНрд░реЙрд╕) рд╡реИрдХреНрдЯрд░ рдХреЗ рдЙрддреНрдкрд╛рдж рдЖрдорддреМрд░ рдкрд░ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЪрд┐рдВрддрд╛ рдХреА рдмрдврд╝рддреА рднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдЕрдЪреНрдЫрд╛ рд╣реИ (рдХреЛрдгреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдПрдХ рд╕рд╣рдЬ рддрд░реАрдХрд╛ рд╣реИ), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реИ рдЬрдм рдореИрдВ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХреЛ рдХреБрдЫ 3 рдбреА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рд╕реНрдерд┐рдд рджреЗрдЦрддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣рд╛рдБ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рд░реЗрдВрдЧрддрд╛ рд╣реИред рдФрд░ рдореИрдВ рдЧрддрд┐ рдпрд╛ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡реИрдЪрд╛рд░рд┐рдХ рд▓рд╛рд▓рд┐рддреНрдп рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ ... рдЕрдм рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рдХрд┐ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдШреБрдорд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЙрди рджреЛ "рдЖрдпрддрд╛рдХрд╛рд░" рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП - рдХреЛрдгреЛрдВ рдХреА рдЦрд╛рди рдФрд░ рдХреЛрд╕рд╛рдЗрдиред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЗрддрдиреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдЗрди рдФрд░ рдХреЙрдЬрд╝рдиреЗрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд╕ рд╡реИрдХреНрдЯрд░ рдХреЗ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдФрд░ рдХреЛрдгреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдк рд╕рд╛рдзрд╛рд░рдг рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рд╡реИрдХреНрдЯрд░ рдореЗрдВ рд░рд╣рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХреЗред рдпрд╣ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ: "рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?" рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрднрд╡реА рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЛ рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓, рдмреЛрдЭрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдмрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИред рдФрд░ рд╕рдВрднрд╡рддрдГ "рдЧрд▓рдд" рднреАред
рдЖрдЗрдП рд▓реЗрдЦ рдХреЛ рдФрд░ рднреА рдЕрдореВрд░реНрдд рдмрдирд╛рдирд╛ рдмрдВрдж рдХрд░реЗрдВред рдЖрдЗрдП рд╣рдо рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рд╕реВрддреНрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рдХреНрдпрд╛ рдмрд╛рдд рдХреА рд╣реИред
рдХрд┐рд╕реА рд╕реНрдерд╛рди рдпрд╛ рд╡рд╕реНрддреБ рдХреЛ рдШреБрдорд╛рдиреЗ рдХрд╛ рдЧрд▓рдд рд╡рд┐рдХрд▓реНрдк
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ
рдХреЛрдиреЗ рдкрд░
ред рдХрд┐рд╕реА рднреА 3 рдбреА рдЗрдВрдЬрди рдпрд╛ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдЧрдгрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЬрди рд╕реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдпрд╛ рдУрдкрдирдЧреИрд▓ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... (рд╣рд╛рдВ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдореВрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг)ред
рд╕рдорд╛рд░реЛрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
mat3x3 rotationAxisAngle( const vec3 & v, float a ) { const float si = sinf( a ); const float co = cosf( a ); const float ic = 1.0f - co; return mat3x3( vx*vx*ic + co, vy*vx*ic - si*vz, vz*vx*ic + si*vy, vx*vy*ic + si*vz, vy*vy*ic + co, vz*vy*ic - si*vx, vx*vz*ic - si*vy, vy*vz*ic + si*vx, vz*vz*ic + co ); }
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдбреЗрдореЛ рдпрд╛ рдЧреЗрдо рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреАрдореЗрд╢рди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рджрд┐рд╢рд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдШреБрдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕рдХреА рдПрдХ рдХреБрд▓реНрд╣рд╛рдбрд╝реА, рдХрд╣реЗрдВ, рдПрдХ рдзреБрд░реА
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
, рдПрдиреАрдореЗрд╢рди рдкрде рдХреЗ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ
rotationAxisAngle()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рддреЛ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЕрдХреНрд╖ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЛ рдорд╛рдкрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдЕрдкрдиреА рд╡рд╕реНрддреБ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рд╡реЗрдХреНрдЯрд░ред рдЪреВрдВрдХрд┐ рдЖрдк рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░
acos()
рд╕рд╛рде рдХреЛрдг рдХреЛ
acos()
ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрднреА-рдХрднреА
acosf()
рдЕрдЬреАрдм рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рд╕реАрдорд╛ [-1] рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ; 1], рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддрд╛ рд╣реИ (
рд▓рдЧрднрдЧ рдкреНрд░рддрд┐ред рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП) (рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рджреЛрд╖ рджреЗрдиреЗ рдХреА рд╣рд┐рдореНрдордд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рдмрд┐рд▓реНрдХреБрд▓ 1 рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдПрдХ рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ рдорд░ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ, рддрдм рддрдХ рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдЕрдЧрд▓рд╛, рдЖрдк рд░реЛрдЯреЗрд╢рди рдЕрдХреНрд╖ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рд╣реИ
рдЕрдкрдиреА рд╡рд╕реНрддреБ рдФрд░ рдЪреБрдиреА рд╣реБрдИ рджрд┐рд╢рд╛
, рдЖрдкрдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕рднреА рдмрд┐рдВрджреБ рдЗрди рджреЛрдиреЛрдВ рд╡реИрдХреНрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдорд╛рдиреЛрдВ рдХреЗ рд╕рдорд╛рди рдШреВрдореЗрдВрдЧреЗ, рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ... (рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рд╕реЗ рдорд╛рд░рд╛ рдЧрдпрд╛)ред рдирддреАрдЬрддрди, рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
const vec3 axi = normalize( cross( z, d ) ); const float ang = acosf( clamp( dot( z, d ), -1.0f, 1.0f ) ); const mat3x3 rot = rotationAxisAngle( axi, ang );
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рд╣рдо рд╕рднреА
rotationAxisAngle()
рдХреЛ рдЦреЛрд▓ рджреЗрдВрдЧреЗ
rotationAxisAngle()
рдХреЛрдб рджреЗрдЦреЗрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦреЗрдВ:
const vec3 axi = normalize( cross( z, d ) ); const float ang = acosf( clamp( dot( z, d ), -1.0f, 1.0f ) ); const float co = cosf( ang ); const float si = sinf( ang ); const float ic = 1.0f - co; const mat3x3 rot = mat3x3( axi.x*axi.x*ic + co, axi.y*axi.x*ic - si*axi.z, axi.z*axi.x*ic + si*axi.y, axi.x*axi.y*ic + si*axi.z, axi.y*axi.y*ic + co, axi.z*axi.y*ic - si*axi.x, axi.x*axi.z*ic - si*axi.y, axi.y*axi.z*ic + si*axi.x, axi.z*axi.z*ic + co);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рд╣рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдХреЛрд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдЗрд╕реЗ рддреБрд░рдВрдд рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд▓рдд рдФрд░ рдорд╣рдВрдЧреЗ рдПрдХреЛрд╕ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдкрд╣рд▓рд╛ рдкреНрд░рд╢реНрди рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ: "рдХреНрдпреЛрдВ рдирд╣реАрдВ
acos()
--->
cos()
рдХреЙрд▓ рдЪреЗрди рдЫреЛрдбрд╝реЗрдВ рдФрд░ CPU рд╕рдордп рдмрдЪрд╛рдПрдВ?" рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ рдЧрд▓рдд рдФрд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рдХреБрдЫ рд╕рд░рд▓ рдЧрдгрд┐рддреАрдп рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрдж рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ?
рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░рд▓реАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╡реИрдХреНрдЯрд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬреИрд╕реЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдХреЛрд╕рд╛рдЗрди рд╣реЛрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рд╛рдЗрди рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡реИрдХреНрдЯрд░ рдХреЗ рдПрдХ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ (рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдорд╛рдирджрдВрдбреЛрдВ рдФрд░ рд░реЛрдЯреЗрд╢рди рдЕрдХреНрд╖реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдЧрдгрд┐рддреАрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдЬреЛ рд╣рдореЗрдВ рдХреЙрд╕ / рдПрдХреЛрд╕ рдЬреЛрдбрд╝реА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рдПрдХ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рд╣реИ, рд╡рд╣рд╛рдВ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рд╣реИ рдЬреЛ рдЧреБрдо рдЬрд╛рдирдХрд╛рд░реА (рд▓рдВрдмрд╡рдд рднрд╛рдЧ, рд╕рд╛рдЗрди) рдХреА рд╕реВрдЪрдирд╛ рджреЗрддрд╛ рд╣реИред
рдХрд┐рд╕реА рд╕реНрдерд╛рди рдпрд╛ рд╡рд╕реНрддреБ рдХреЛ рдШреБрдорд╛рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛
рдЕрдм рд╣рдо рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреА рд╕рд╛рдЗрди рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ
рдФрд░
рдмрд╕ рдЙрдирдХреЗ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рджреЗрдЦрдХрд░ ... - рдпрд╛рдж рд░рдЦреЗрдВ
рдФрд░
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд! рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо (рд╣рдо рдЪрд╛рд╣рд┐рдП !!) рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
const vec3 axi = cross( z, d ); const float si = length( axi ); const float co = dot( z, d ); const mat3x3 rot = rotationAxisCosSin( axi/si, co, si );
рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдирдпрд╛ рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп,
rotationAxisCosSin()
, рдХрд╣реАрдВ рднреА рд╕рд╛рдЗрди рдФрд░ рдХреЙрд╢рди рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ:
mat3x3 rotationAxisCosSin( const vec3 & v, const float co, const float si ) { const float ic = 1.0f - co; return mat3x3( vx*vx*ic + co, vy*vx*ic - si*vz, vz*vx*ic + si*vy, vx*vy*ic + si*vz, vy*vy*ic + co, vz*vy*ic - si*vx, vx*vz*ic - si*vy, vy*vz*ic + si*vx, vz*vz*ic + co ); }
рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдФрд░ рд╡рд░реНрдЧрдореВрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреВрд░реЗ рддрд░реНрдХ рдХреЛ
1/si
рдХрд░рдирд╛ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ
1/si
рдкрд╛рд╕ рдХрд░рдирд╛:
mat3x3 rotationAlign( const vec3 & d, const vec3 & z ) { const vec3 v = cross( z, d ); const float c = dot( z, d ); const float k = (1.0fc)/(1.0fc*c); return mat3x3( vx*vx*k + c, vy*vx*k - vz, vz*vx*k + vy, vx*vy*k + vz, vy*vy*k + c, vz*vy*k - vx, vx*vz*K - vy, vy*vz*k + vx, vz*vz*k + c ); }
рдмрд╛рдж рдореЗрдВ, рдЬрд╝реЛрд▓реНрдЯрди рд╡реНрд░рд╛рдгрд╛ рдиреЗ рджреЗрдЦрд╛ рдХрд┐
k
рдХреЛ
k = 1/(1+c)
рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рджрд┐рдЦрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ k рдФрд░, рдХреЗ рд▓рд┐рдП рджреЛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЪрд▓рддреА рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди (
рдФрд░
рд╕рдорд╛рдВрддрд░) рдПрдХ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм
рдФрд░
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдпреЛрдЧ рд╕реЗ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░реЛрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИ)ред рдЕрдВрддрд┐рдо рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
mat3x3 rotationAlign( const vec3 & d, const vec3 & z ) { const vec3 v = cross( z, d ); const float c = dot( z, d ); const float k = 1.0f/(1.0f+c); return mat3x3( vx*vx*k + c, vy*vx*k - vz, vz*vx*k + vy, vx*vy*k + vz, vy*vy*k + c, vz*vy*k - vx, vx*vz*K - vy, vy*vz*k + vx, vz*vz*k + c ); }
рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рддреАрди рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ рдФрд░ рдмрджрд╕реВрд░рдд рдХреНрд▓реИрдВрдк (рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг!) рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛, рдмрд▓реНрдХрд┐ рдЕрдкрдиреЗ 3 рдбреА рдЧрдгрд┐рдд рдХреЛ рднреА рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдХреЛрдИ рдЯреНрд░рд╛рдиреНрд╕реЗрдВрдбреИрдВрдЯрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд╣реАрдВред рд╡реИрдХреНрдЯрд░ рдЕрдиреНрдп рд╡реИрдХреНрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореИрдЯреНрд░реАрдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ 3 рдбреА рдЗрдВрдЬрди рдореЗрдВ рдХрдо рддреНрд░рд┐рдХреЛрдгрдорд┐рддрд┐, рди рдХреЗрд╡рд▓ рддреЗрдЬ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдмрд▓реНрдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг (рдЕрдзрд┐рдХ рд╕рд╣реА!)ред