package Ġgl matrix Ċ Ċ import Ġkotlin . js . Math Ċ Ċ class ĠQu at () Ġ: ĠGl Matrix () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġquaternion : ĠArray < Double > Ġ= ĠarrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠ Ġconstructor ( x : ĠDouble , Ġy : ĠDouble , Ġz : ĠDouble , Ġw : ĠDouble ) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġquaternion [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġquaternion [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġquaternion [ 2 ] Ġ= Ġz ĊĠĠĠĠĠĠĠ Ġquaternion [ 3 ] Ġ= Ġw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquaternion [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( index : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquaternion [ index ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew ĠQu at Ġinitialized Ġwith Ġvalues Ġfrom Ġan Ġexisting Ġquaternion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġquaternion Ġto Ġclone ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġa Ġnew Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclone (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠQu at ( this . qu aternion [ 0 ], Ġthis . qu aternion [ 1 ], Ġthis . qu aternion [ 2 ], Ġthis . qu aternion [ 3 ]) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCopy Ġthe Ġvalues Ġfrom Ġone ĠQu at Ġto Ġanother ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġthe Ġsource Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy ( source : ĠQu at ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 0 ] Ġ= Ġsource [ 0 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 1 ] Ġ= Ġsource [ 1 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 2 ] Ġ= Ġsource [ 2 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 3 ] Ġ= Ġsource [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġtwo ĠQu at 's ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġb Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd ( sum mand : ĠQu at ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 0 ] Ġ+= Ġsum mand [ 0 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 1 ] Ġ+= Ġsum mand [ 1 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 2 ] Ġ+= Ġsum mand [ 2 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 3 ] Ġ+= Ġsum mand [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( sum mand : ĠQu at ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclone (). add ( sum mand ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMultip lies Ġtwo ĠQu at 's ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġmultiplier Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġmultip lic and Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmultiply ( multiplier : ĠQu at ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġbx Ġ= Ġmultiplier [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġby Ġ= Ġmultiplier [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġb z Ġ= Ġmultiplier [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġbw Ġ= Ġmultiplier [ 3 ] ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 0 ] Ġ= Ġax Ġ* Ġbw Ġ+ Ġaw Ġ* Ġbx Ġ+ Ġay Ġ* Ġb z Ġ- Ġaz Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 1 ] Ġ= Ġay Ġ* Ġbw Ġ+ Ġaw Ġ* Ġby Ġ+ Ġaz Ġ* Ġbx Ġ- Ġax Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 2 ] Ġ= Ġaz Ġ* Ġbw Ġ+ Ġaw Ġ* Ġb z Ġ+ Ġax Ġ* Ġby Ġ- Ġay Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġthis . qu aternion [ 3 ] Ġ= Ġaw Ġ* Ġbw Ġ- Ġax Ġ* Ġbx Ġ- Ġay Ġ* Ġby Ġ- Ġaz Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( multiplier : ĠQu at ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmultiplier . clone (). multiply ( this ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġa ĠQu at Ġto Ġthe Ġidentity Double Array Ġquaternion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġidentity (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠQu at ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa ĠQu at Ġfrom Ġthe Ġgiven Ġangle Ġand Ġrotation Ġaxis To Rotate Around , ĊĠĠĠĠ Ġ* Ġthen Ġreturns Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġaxis To Rotate Around Ġthe Ġaxis To Rotate Around Ġaround Ġwhich Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Number } Ġangle In Rad Ġthe Ġangle Ġin Ġradians ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġnew Ġrotated ĠQuad ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġfun Ġset Axis Angle ( axis To Rotate Around : ĠVec 3 , Ġangle In Rad : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= Ġangle In Rad Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠMath . sin ( rad ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġs Ġ* Ġaxis To Rotate Around [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġs Ġ* Ġaxis To Rotate Around [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġs Ġ* Ġaxis To Rotate Around [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= ĠMath . cos ( rad ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġrotation Ġaxis Ġand Ġangle Ġfor Ġa Ġgiven ĊĠĠĠĠ Ġ* Ġ Ġquaternion . ĠIf Ġa Ġquaternion Ġis Ġcreated Ġwith ĊĠĠĠĠ Ġ* Ġ Ġset Axis Angle , Ġthis . qu aternion Ġmethod Ġwill Ġreturn Ġthe Ġsame ĊĠĠĠĠ Ġ* Ġ Ġvalues Ġas Ġpro vid ied Ġin Ġthe Ġoriginal Ġparameter Ġlist ĊĠĠĠĠ Ġ* Ġ ĠOR Ġfunction ally Ġequivalent Ġvalues . ĊĠĠĠĠ Ġ* ĠExample : ĠThe Ġquaternion Ġformed Ġby Ġaxis Ġ[ 0 , Ġ 0 , Ġ 1 ] Ġand ĊĠĠĠĠ Ġ* Ġ Ġangle Ġ- 9 0 Ġis Ġthe Ġsame Ġas Ġthe Ġquaternion Ġformed Ġby ĊĠĠĠĠ Ġ* Ġ Ġ[ 0 , Ġ 0 , Ġ 1 ] Ġand Ġ 2 7 0 . Ġthis . qu aternion Ġmethod Ġfav ors Ġthe Ġlatter . ĊĠĠĠĠ Ġ* Ġ@ param Ġ Ġ{ Vec 3 } Ġin Out Axis Ġ ĠVector Ġreceiving Ġthe Ġaxis Ġof Ġrotation ĊĠĠĠĠ Ġ* Ġ@ param Ġ Ġ{ Qu at } Ġquad ToBe De composed ĠĠĠĠ ĠQuaternion Ġto Ġbe Ġde composed ĊĠĠĠĠ Ġ* Ġ@ return Ġ{ Number } ĠĠĠĠ ĠAngle , Ġin Ġradians , Ġof Ġthe Ġrotation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Axis Angle ( in Out : ĠQu at Ġ= ĠQu at ()): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= ĠMath . acos ( this . qu aternion [ 3 ]) Ġ* Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠMath . sin ( rad Ġ/ Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( s Ġ!= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 0 ] Ġ= Ġthis . qu aternion [ 0 ] Ġ/ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 1 ] Ġ= Ġthis . qu aternion [ 1 ] Ġ/ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 2 ] Ġ= Ġthis . qu aternion [ 2 ] Ġ/ Ġs ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġs Ġis Ġzero , Ġreturn Ġany Ġaxis Ġ( no Ġrotation Ġ- Ġaxis Ġdoes Ġnot Ġmatter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 0 ] Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 1 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Out [ 2 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrad ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRot ates Ġquat To Rotate Ġquaternion Ġby Ġthe Ġgiven Ġangle Ġabout Ġthe ĠX Ġaxis ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out ĠQu at Ġreceiving Ġoperation Ġresult ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquat To Rotate ĠQu at Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ number } Ġangle In Rad Ġangle Ġ( in Ġradians ) Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠrotateX ( angle In Rad : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= Ġangle In Rad Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġbx Ġ= ĠMath . sin ( rad ) ĊĠĠĠĠĠĠĠ Ġval Ġbw Ġ= ĠMath . cos ( rad ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġax Ġ* Ġbw Ġ+ Ġaw Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġay Ġ* Ġbw Ġ+ Ġaz Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġaz Ġ* Ġbw Ġ- Ġay Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġaw Ġ* Ġbw Ġ- Ġax Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRot ates Ġquat To Rotate Ġquaternion Ġby Ġthe Ġgiven Ġangle Ġabout Ġthe ĠY Ġaxis ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out ĠQu at Ġreceiving Ġoperation Ġresult ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquat To Rotate ĠQu at Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ number } Ġangle In Rad Ġangle Ġ( in Ġradians ) Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠrotateY ( angle In Rad : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= Ġangle In Rad Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġby Ġ= ĠMath . sin ( rad ) ĊĠĠĠĠĠĠĠ Ġval Ġbw Ġ= ĠMath . cos ( rad ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġax Ġ* Ġbw Ġ- Ġaz Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġay Ġ* Ġbw Ġ+ Ġaw Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġaz Ġ* Ġbw Ġ+ Ġax Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġaw Ġ* Ġbw Ġ- Ġay Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRot ates Ġquat To Rotate Ġquaternion Ġby Ġthe Ġgiven Ġangle Ġabout Ġthe ĠZ Ġaxis ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out ĠQu at Ġreceiving Ġoperation Ġresult ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquat To Rotate ĠQu at Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ number } Ġangle In Rad Ġangle Ġ( in Ġradians ) Ġto Ġrotate ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠrotateZ ( angle In Rad : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= Ġangle In Rad Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġb z Ġ= ĠMath . sin ( rad ) ĊĠĠĠĠĠĠĠ Ġval Ġbw Ġ= ĠMath . cos ( rad ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġax Ġ* Ġbw Ġ+ Ġay Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġay Ġ* Ġbw Ġ- Ġax Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġaz Ġ* Ġbw Ġ+ Ġaw Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġaw Ġ* Ġbw Ġ- Ġaz Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe ĠW Ġcomponent Ġof Ġquad To Calculate W ĠQu at Ġfrom Ġthe ĠX , ĠY , Ġand ĠZ Ġcomponents . ĊĠĠĠĠ Ġ* ĠAss umes Ġthat Ġquaternion Ġis Ġ 1 Ġunit Ġin Ġlength . ĊĠĠĠĠ Ġ* ĠAny Ġexisting ĠW Ġcomponent Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquad To Calculate W ĠQu at Ġto Ġcalculate ĠW Ġcomponent Ġof ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalculate W (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġz ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= ĠMath . sqrt ( Math . abs ( 1 . 0 Ġ- Ġx Ġ* Ġx Ġ- Ġy Ġ* Ġy Ġ- Ġz Ġ* Ġz )) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġfirst Operand Ġs pherical Ġlinear Ġinterpolation Ġbetween Ġtwo ĠQu at ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġfirst Operand Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġsecond Operand Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Number } Ġinterpolation Amount Ġinterpolation Ġamount Ġbetween Ġthe Ġtwo Ġinputs ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġs lerp ( operand : ĠQu at , Ġinterpolation Amount : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbenchmarks : ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġhttp :// jsp er f . com / qu aternion - s lerp - implement ations ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġvar Ġbx Ġ= Ġoperand [ 0 ] ĊĠĠĠĠĠĠĠ Ġvar Ġby Ġ= Ġoperand [ 1 ] ĊĠĠĠĠĠĠĠ Ġvar Ġb z Ġ= Ġoperand [ 2 ] ĊĠĠĠĠĠĠĠ Ġvar Ġbw Ġ= Ġoperand [ 3 ] ĊĠĠĠĠĠĠĠ Ġvar Ġcos om : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġscale 0 : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġscale 1 : ĠDouble ĊĠĠĠĠĠĠĠ Ġ// Ġcalc Ġcos ine ĊĠĠĠĠĠĠĠ Ġcos om Ġ= Ġax Ġ* Ġbx Ġ+ Ġay Ġ* Ġby Ġ+ Ġaz Ġ* Ġb z Ġ+ Ġaw Ġ* Ġbw ĊĠĠĠĠĠĠĠ Ġ// Ġadjust Ġsigns Ġ( if Ġnecessary ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cos om Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcos om Ġ= Ġ- cos om ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbx Ġ= Ġ- bx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Ġ= Ġ- by ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb z Ġ= Ġ- bz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbw Ġ= Ġ- bw ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġcoefficients ĊĠĠĠĠĠĠĠ Ġif Ġ(( 1 . 0 Ġ- Ġcos om ) Ġ> Ġ 0 . 0 0 0 0 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstandard Ġcase Ġ( s lerp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġomega Ġ= ĠMath . acos ( cos om ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin om Ġ= ĠMath . sin ( omega ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale 0 Ġ= ĠMath . sin (( 1 . 0 Ġ- Ġinterpolation Amount ) Ġ* Ġomega ) Ġ/ Ġsin om ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale 1 Ġ= ĠMath . sin ( interpolation Amount Ġ* Ġomega ) Ġ/ Ġsin om ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" from " Ġand Ġ" to " Ġqu atern ions Ġare Ġvery Ġclose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ... Ġso Ġwe Ġcan Ġdo Ġfirst Operand Ġlinear Ġinterpolation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale 0 Ġ= Ġ 1 . 0 Ġ- Ġinterpolation Amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale 1 Ġ= Ġinterpolation Amount ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġfinal Ġvalues ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġscale 0 Ġ* Ġax Ġ+ Ġscale 1 Ġ* Ġbx ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġscale 0 Ġ* Ġay Ġ+ Ġscale 1 Ġ* Ġby ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġscale 0 Ġ* Ġaz Ġ+ Ġscale 1 Ġ* Ġb z ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġscale 0 Ġ* Ġaw Ġ+ Ġscale 1 Ġ* Ġbw ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġinverse Ġof Ġquat To Calculate Inverse Of ĠQu at ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquat To Calculate Inverse Of ĠQu at Ġto Ġcalculate Ġinverse Ġof ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinvert (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġa 0 Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 1 Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 2 Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 3 Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġdot Ġ= Ġa 0 Ġ* Ġa 0 Ġ+ Ġa 1 Ġ* Ġa 1 Ġ+ Ġa 2 Ġ* Ġa 2 Ġ+ Ġa 3 Ġ* Ġa 3 ĊĠĠĠĠĠĠĠ Ġif Ġ( dot Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinv Dot Ġ= Ġ 1 . 0 Ġ/ Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġ- a 0 Ġ* Ġinv Dot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġ- a 1 Ġ* Ġinv Dot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ- a 2 Ġ* Ġinv Dot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġa 3 Ġ* Ġinv Dot ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġconj ug ate Ġof Ġquat To Calculate Con j ug ate Of ĠQu at ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġquaternion Ġis Ġnormalized , Ġthis . qu aternion Ġfunction Ġis Ġfaster Ġthan ĠQu at . inverse Ġand Ġproduces Ġthe Ġsame Ġresult . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġquat To Calculate Con j ug ate Of ĠQu at Ġto Ġcalculate Ġconj ug ate Ġof ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconj ug ate (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġ- this . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġ- this . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ- this . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġquaternion Ġfrom Ġthe Ġgiven Ġ 3 x 3 Ġrotation Ġmatrix . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThe Ġresult ant Ġquaternion Ġis Ġnot Ġnormalized , Ġso Ġyou Ġshould Ġbe Ġsure ĊĠĠĠĠ Ġ* Ġto Ġre normalize Ġthe Ġquaternion Ġyourself Ġwhere Ġnecessary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Mat 3 } Ġrotation Matrix Ġrotation Ġmatrix ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfrom Mat 3 ( rotation Matrix : ĠDouble Array ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAlgorithm Ġin ĠKen ĠSh oem ake 's Ġarticle Ġin Ġ 1 9 8 7 ĠSIG GRAPH Ġcourse Ġnotes ĊĠĠĠĠĠĠĠ Ġ// Ġarticle Ġ" Quaternion ĠCalcul us Ġand ĠFast ĠAnimation ". ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġvar Ġf Root : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġf Trace Ġ= Ġrotation Matrix [ 0 ] Ġ+ Ġrotation Matrix [ 4 ] Ġ+ Ġrotation Matrix [ 8 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( f Trace Ġ> Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ| w | Ġ> Ġ 1 / 2 , Ġmay Ġas Ġwell Ġchoose Ġw Ġ> Ġ 1 / 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Root Ġ= ĠMath . sqrt ( f Trace Ġ+ Ġ 1 . 0 ) Ġ Ġ// Ġ 2 w ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġ 0 . 5 Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Root Ġ= Ġ 0 . 5 Ġ/ Ġf Root Ġ Ġ// Ġ 1 /( 4 w ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġ( rotation Matrix [ 5 ] Ġ- Ġrotation Matrix [ 7 ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġ( rotation Matrix [ 6 ] Ġ- Ġrotation Matrix [ 2 ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ( rotation Matrix [ 1 ] Ġ- Ġrotation Matrix [ 3 ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ| w | Ġ<= Ġ 1 / 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Matrix [ 4 ] Ġ> Ġrotation Matrix [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Matrix [ 8 ] Ġ> Ġrotation Matrix [ i Ġ* Ġ 3 Ġ+ Ġi ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġ( i Ġ+ Ġ 1 ) Ġ% Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ( i Ġ+ Ġ 2 ) Ġ% Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Root Ġ= ĠMath . sqrt ( rotation Matrix [ i Ġ* Ġ 3 Ġ+ Ġi ] Ġ- Ġrotation Matrix [ j Ġ* Ġ 3 Ġ+ Ġj ] Ġ- Ġrotation Matrix [ k Ġ* Ġ 3 Ġ+ Ġk ] Ġ+ Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ i ] Ġ= Ġ 0 . 5 Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Root Ġ= Ġ 0 . 5 Ġ/ Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġ( rotation Matrix [ j Ġ* Ġ 3 Ġ+ Ġk ] Ġ- Ġrotation Matrix [ k Ġ* Ġ 3 Ġ+ Ġj ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ j ] Ġ= Ġ( rotation Matrix [ j Ġ* Ġ 3 Ġ+ Ġi ] Ġ+ Ġrotation Matrix [ i Ġ* Ġ 3 Ġ+ Ġj ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ k ] Ġ= Ġ( rotation Matrix [ k Ġ* Ġ 3 Ġ+ Ġi ] Ġ+ Ġrotation Matrix [ i Ġ* Ġ 3 Ġ+ Ġk ]) Ġ* Ġf Root ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġquaternion Ġfrom Ġthe Ġgiven Ġe uler Ġangle Ġangle To Rotate Around X , Ġangle To Rotate Around Y , Ġangle To Rotate Around Z . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ angle To Rotate Around X } ĠAngle Ġto Ġrotate Ġaround ĠX Ġaxis Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ angle To Rotate Around Y } ĠAngle Ġto Ġrotate Ġaround ĠY Ġaxis Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ angle To Rotate Around Z } ĠAngle Ġto Ġrotate Ġaround ĠZ Ġaxis Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfrom Euler ( angle To Rotate Around X : ĠDouble , Ġangle To Rotate Around Y : ĠDouble , Ġangle To Rotate Around Z : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġhalf To Rad Ġ= Ġ 0 . 5 Ġ* ĠMath . PI Ġ/ Ġ 1 8 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġangle X Ġ= Ġangle To Rotate Around X Ġ* Ġhalf To Rad ĊĠĠĠĠĠĠĠ Ġval Ġangle Y Ġ= Ġangle To Rotate Around Y Ġ* Ġhalf To Rad ĊĠĠĠĠĠĠĠ Ġval Ġangle Z Ġ= Ġangle To Rotate Around Z Ġ* Ġhalf To Rad ĊĠĠĠĠĠĠĠ Ġval Ġsx Ġ= ĠMath . sin ( angle X ) ĊĠĠĠĠĠĠĠ Ġval Ġcx Ġ= ĠMath . cos ( angle X ) ĊĠĠĠĠĠĠĠ Ġval Ġsy Ġ= ĠMath . sin ( angle Y ) ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= ĠMath . cos ( angle Y ) ĊĠĠĠĠĠĠĠ Ġval Ġsz Ġ= ĠMath . sin ( angle Z ) ĊĠĠĠĠĠĠĠ Ġval Ġcz Ġ= ĠMath . cos ( angle Z ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġsx Ġ* Ġcy Ġ* Ġcz Ġ- Ġcx Ġ* Ġsy Ġ* Ġsz ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġcx Ġ* Ġsy Ġ* Ġcz Ġ+ Ġsx Ġ* Ġcy Ġ* Ġsz ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġcx Ġ* Ġcy Ġ* Ġsz Ġ- Ġsx Ġ* Ġsy Ġ* Ġcz ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġcx Ġ* Ġcy Ġ* Ġcz Ġ+ Ġsx Ġ* Ġsy Ġ* Ġsz ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġstring Ġrepresentation Ġof Ġa Ġqu aten ion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġvector Ġto Ġrepresent Ġas Ġa Ġstring ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ String } Ġstring Ġrepresentation Ġof Ġthe Ġvector ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Qu at (${ this . qu aternion [ 0 ]}, Ġ${ this . qu aternion [ 1 ]}, Ġ${ this . qu aternion [ 2 ]}, Ġ${ this . qu aternion [ 3 ]}) " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSca les Ġa ĠQu at Ġby Ġa Ġscalar Ġnumber ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġvector ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġthe Ġvector Ġto Ġscale ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Number } Ġb Ġamount Ġto Ġscale Ġthe Ġvector Ġby ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġscale ( amount To Scale By : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġthis . qu aternion [ 0 ] Ġ* Ġamount To Scale By ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġthis . qu aternion [ 1 ] Ġ* Ġamount To Scale By ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġthis . qu aternion [ 2 ] Ġ* Ġamount To Scale By ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġthis . qu aternion [ 3 ] Ġ* Ġamount To Scale By ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġdot Ġproduct Ġof Ġtwo ĠQu at 's ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġb Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Number } Ġdot Ġproduct Ġof Ġa Ġand Ġb ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdot ( operand : ĠQu at ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . qu aternion [ 0 ] Ġ* Ġoperand [ 0 ] Ġ+ Ġthis . qu aternion [ 1 ] Ġ* Ġoperand [ 1 ] Ġ+ Ġthis . qu aternion [ 2 ] Ġ* Ġoperand [ 2 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġlinear Ġinterpolation Ġbetween Ġtwo ĠQu at 's ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġb Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Number } Ġt Ġinterpolation Ġamount Ġbetween Ġthe Ġtwo Ġinputs ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġl erp ( operand : ĠQu at , Ġinterpolation Amount : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġaz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġaw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġax Ġ+ Ġinterpolation Amount Ġ* Ġ( operand [ 0 ] Ġ- Ġax ) ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġay Ġ+ Ġinterpolation Amount Ġ* Ġ( operand [ 1 ] Ġ- Ġay ) ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġaz Ġ+ Ġinterpolation Amount Ġ* Ġ( operand [ 2 ] Ġ- Ġaz ) ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġaw Ġ+ Ġinterpolation Amount Ġ* Ġ( operand [ 3 ] Ġ- Ġaw ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġlength Ġof Ġa ĠQu at ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġvector Ġto Ġcalculate Ġlength Ġof ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Number } Ġlength Ġof Ġa ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlength (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . sqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz Ġ+ Ġw Ġ* Ġw ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġsquared Ġlength Ġof Ġa ĠQu at ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġvector Ġto Ġcalculate Ġsquared Ġlength Ġof ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Number } Ġsquared Ġlength Ġof Ġa ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsquared Length (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz Ġ+ Ġw Ġ* Ġw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNormalize Ġa ĠQu at ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa Ġquaternion Ġto Ġnormalize ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ* Ġ@ function ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize (): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz Ġ+ Ġw Ġ* Ġw ĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= Ġ 1 Ġ/ ĠMath . sqrt ( len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġx Ġ* Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġy Ġ* Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġz Ġ* Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġw Ġ* Ġlen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġqu atern ions Ġhave Ġexactly Ġthe Ġsame Ġelements Ġin Ġthe Ġsame Ġposition Ġ( when Ġcompared Ġwith Ġ=== ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa ĠThe Ġfirst Ġquaternion . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġb ĠThe Ġsecond Ġquaternion . ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Boolean } ĠTrue Ġif Ġthe Ġvectors Ġare Ġequal , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexact Equals ( qu aternion : ĠQu at ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . qu aternion [ 0 ] Ġ== Ġquaternion [ 0 ] Ġ&& Ġthis . qu aternion [ 1 ] Ġ== Ġquaternion [ 1 ] Ġ&& Ġthis . qu aternion [ 2 ] Ġ== Ġquaternion [ 2 ] Ġ&& Ġthis . qu aternion [ 3 ] Ġ== Ġquaternion [ 3 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġqu atern ions Ġhave Ġapproximately Ġthe Ġsame Ġelements Ġin Ġthe Ġsame Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġa ĠThe Ġfirst Ġvector . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġb ĠThe Ġsecond Ġvector . ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Boolean } ĠTrue Ġif Ġthe Ġvectors Ġare Ġequal , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġequals ( qu aternion : ĠQu at ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa 0 Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 1 Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 2 Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġa 3 Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġb 0 Ġ= Ġquaternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= Ġquaternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= Ġquaternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġb 3 Ġ= Ġquaternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Math . abs ( a 0 Ġ- Ġb 0 ) Ġ<= ĠEPS ILON Ġ* ĠMath . max ( 1 . 0 , ĠMath . abs ( a 0 ), ĠMath . abs ( b 0 )) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( a 1 Ġ- Ġb 1 ) Ġ<= ĠEPS ILON Ġ* ĠMath . max ( 1 . 0 , ĠMath . abs ( a 1 ), ĠMath . abs ( b 1 )) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( a 2 Ġ- Ġb 2 ) Ġ<= ĠEPS ILON Ġ* ĠMath . max ( 1 . 0 , ĠMath . abs ( a 2 ), ĠMath . abs ( b 2 )) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( a 3 Ġ- Ġb 3 ) Ġ<= ĠEPS ILON Ġ* ĠMath . max ( 1 . 0 , ĠMath . abs ( a 3 ), ĠMath . abs ( b 3 ))) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġquaternion Ġto Ġrepresent Ġthe Ġshortest Ġrotation Ġfrom Ġone ĊĠĠĠĠ Ġ* Ġvector Ġto Ġanother . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBoth Ġvectors Ġare Ġassumed Ġto Ġbe Ġunit Ġlength . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġout Ġthe Ġreceiving Ġquaternion . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġa Ġthe Ġinitial Ġvector ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġb Ġthe Ġdestination Ġvector ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrotation To ( initial Vec 3 : ĠVec 3 , Ġdestination Vec 3 : ĠVec 3 ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġvar Ġtmp vec 3 : ĠVec 3 ĊĠĠĠĠĠĠĠ Ġval Ġx Unit Vec 3 Ġ= ĠVec 3 ( 1 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġy Unit Vec 3 Ġ= ĠVec 3 ( 0 . 0 , Ġ 1 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdot Ġ= Ġinitial Vec 3 . dot ( destination Vec 3 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dot Ġ< Ġ- 0 . 9 9 9 9 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp vec 3 Ġ= Ġx Unit Vec 3 . cross ( initial Vec 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp vec 3 . length () Ġ< Ġ 0 . 0 0 0 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp vec 3 Ġ= Ġy Unit Vec 3 . cross ( initial Vec 3 ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . set Axis Angle ( tmp vec 3 , ĠMath . PI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dot Ġ> Ġ 0 . 9 9 9 9 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp vec 3 Ġ= Ġinitial Vec 3 . cross ( destination Vec 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġtmp vec 3 [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġtmp vec 3 [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġtmp vec 3 [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġ 1 Ġ+ Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput . normalize () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġfirst Operand Ġs pherical Ġlinear Ġinterpolation Ġwith Ġtwo Ġcontrol Ġpoints ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġin Out Ġthe Ġreceiving Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġfirst Operand Ġthe Ġfirst Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġfirst Operand Ġthe Ġsecond Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġsecond Operand Ġthe Ġthird Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Qu at } Ġthird Operand Ġthe Ġfourth Ġoperand ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Number } Ġinterpolation Amount Ġinterpolation Ġamount ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĊĊĠĠĠ Ġfun Ġsq lerp ( first Operand : ĠQu at , Ġsecond Operand : ĠQu at , Ġthird Operand : ĠQu at , Ġinterpolation Amount : ĠDouble ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp 1 Ġ= Ġfirst Operand . s lerp ( third Operand , Ġinterpolation Amount ) ĊĠĠĠĠĠĠĠ Ġval Ġtemp 2 Ġ= Ġfirst Operand . s lerp ( second Operand , Ġinterpolation Amount ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp 1 . s lerp ( temp 2 , Ġ 2 Ġ* Ġinterpolation Amount Ġ* Ġ( 1 Ġ- Ġinterpolation Amount )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġspecified Ġquaternion Ġwith Ġvalues Ġcorresponding Ġto Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġaxes . ĠEach Ġaxis Ġis Ġa ĠVec 3 Ġand Ġis Ġexpected Ġto Ġbe Ġunit Ġlength Ġand ĊĠĠĠĠ Ġ* Ġper pend icular Ġto Ġall Ġother Ġspecified Ġaxes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġview Direction Ġ Ġthe Ġvector Ġrepresenting Ġthe Ġviewing Ġdirection ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġright Direction Ġthe Ġvector Ġrepresenting Ġthe Ġlocal Ġ" right Direction " Ġdirection ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Vec 3 } Ġup Direction ĠĠĠ Ġthe Ġvector Ġrepresenting Ġthe Ġlocal Ġ" up Direction " Ġdirection ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Qu at } Ġin Out ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Axes ( view Direction : ĠVec 3 , Ġright Direction : ĠVec 3 , Ġup Direction : ĠVec 3 ): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠQu at () ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġright Direction [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġright Direction [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 6 ] Ġ= Ġright Direction [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġup Direction [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 4 ] Ġ= Ġup Direction [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 7 ] Ġ= Ġup Direction [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġ- view Direction [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 5 ] Ġ= Ġ- view Direction [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 8 ] Ġ= Ġ- view Direction [ 2 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . from Mat 3 ( output . toDouble Array ()). normalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Double Array (): ĠDouble Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠDouble Array ( 4 ) ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġthis . qu aternion [ 0 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 1 ] Ġ= Ġthis . qu aternion [ 1 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 2 ] Ġ= Ġthis . qu aternion [ 2 ] ĊĠĠĠĠĠĠĠ Ġoutput [ 3 ] Ġ= Ġthis . qu aternion [ 3 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} Ċ }