package Ġglm _. ext Ċ Ċ import Ġglm _. glm Ċ import Ġglm _. quat . Qu at Ċ import Ġglm _. quat . Qu at D Ċ Ċ interface Ġext _ Quaternion Ge ometric Ġ{ ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġlength Ġof Ġthe Ġquaternion . ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlength ( q : ĠQu at ): ĠFloat Ġ= Ġglm . sqrt ( dot ( q , Ġq )) ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġlength Ġof Ġthe Ġquaternion . ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlength ( q : ĠQu at D ): ĠDouble Ġ= Ġglm . sqrt ( dot ( q , Ġq )) ĊĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġnormalized Ġquaternion . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize ( q : ĠQu at , Ġres : ĠQu at Ġ= ĠQu at ()): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġlength ( q ) ĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ<= Ġ 0 f ) ĠĠ Ġ// ĠProblem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres . put ( 1 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġone Over Len Ġ= Ġ 1 f Ġ/ Ġlen ĊĠĠĠĠĠĠĠ Ġreturn Ġres . put ( q . w Ġ* Ġone Over Len , Ġq . x Ġ* Ġone Over Len , Ġq . y Ġ* Ġone Over Len , Ġq . z Ġ* Ġone Over Len ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġnormalized Ġquaternion . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize ( q : ĠQu at D , Ġres : ĠQu at D Ġ= ĠQu at D ()): ĠQu at D Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġlength ( q ) ĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ<= Ġ 0 . 0 ) ĠĠ Ġ// ĠProblem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres . put ( 1 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġone Over Len Ġ= Ġ 1 . 0 Ġ/ Ġlen ĊĠĠĠĠĠĠĠ Ġreturn Ġres . put ( q . w Ġ* Ġone Over Len , Ġq . x Ġ* Ġone Over Len , Ġq . y Ġ* Ġone Over Len , Ġq . z Ġ* Ġone Over Len ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĠReturns Ġdot Ġproduct Ġof Ġq 1 Ġmain . and Ġq 2 , Ġmain . get I . e ., Ġq 1 [ 0 ] Ġ* Ġq 2 [ 0 ] Ġ+ Ġq 1 [ 1 ] Ġ* Ġq 2 [ 1 ] Ġ+ Ġ... Ġ*/ ĊĠĠĠ Ġfun Ġdot ( a : ĠQu at , Ġb : ĠQu at ): ĠFloat Ġ= Ġa . x Ġ* Ġb . x Ġ+ Ġa . y Ġ* Ġb . y Ġ+ Ġa . z Ġ* Ġb . z Ġ+ Ġa . w Ġ* Ġb . w ĊĊĠĠĠ Ġ/** ĠReturns Ġdot Ġproduct Ġof Ġq 1 Ġmain . and Ġq 2 , Ġmain . get I . e ., Ġq 1 [ 0 ] Ġ* Ġq 2 [ 0 ] Ġ+ Ġq 1 [ 1 ] Ġ* Ġq 2 [ 1 ] Ġ+ Ġ... Ġ*/ ĊĠĠĠ Ġfun Ġdot ( a : ĠQu at D , Ġb : ĠQu at D ): ĠDouble Ġ= Ġa . x Ġ* Ġb . x Ġ+ Ġa . y Ġ* Ġb . y Ġ+ Ġa . z Ġ* Ġb . z Ġ+ Ġa . w Ġ* Ġb . w ĊĊĠĠĠ Ġfun Ġcross ( q 1 : ĠQu at , Ġq 2 : ĠQu at , Ġres : ĠQu at Ġ= ĠQu at ()): ĠQu at Ġ{ ĊĠĠĠĠĠĠĠ Ġres . w Ġ= Ġq 1 . w Ġ* Ġq 2 . w Ġ- Ġq 1 . x Ġ* Ġq 2 . x Ġ- Ġq 1 . y Ġ* Ġq 2 . y Ġ- Ġq 1 . z Ġ* Ġq 2 . z ĊĠĠĠĠĠĠĠ Ġres . x Ġ= Ġq 1 . w Ġ* Ġq 2 . x Ġ+ Ġq 1 . x Ġ* Ġq 2 . w Ġ+ Ġq 1 . y Ġ* Ġq 2 . z Ġ- Ġq 1 . z Ġ* Ġq 2 . y ĊĠĠĠĠĠĠĠ Ġres . y Ġ= Ġq 1 . w Ġ* Ġq 2 . y Ġ+ Ġq 1 . y Ġ* Ġq 2 . w Ġ+ Ġq 1 . z Ġ* Ġq 2 . x Ġ- Ġq 1 . x Ġ* Ġq 2 . z ĊĠĠĠĠĠĠĠ Ġres . z Ġ= Ġq 1 . w Ġ* Ġq 2 . z Ġ+ Ġq 1 . z Ġ* Ġq 2 . w Ġ+ Ġq 1 . x Ġ* Ġq 2 . y Ġ- Ġq 1 . y Ġ* Ġq 2 . x ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcross ( q 1 : ĠQu at D , Ġq 2 : ĠQu at D , Ġres : ĠQu at D Ġ= ĠQu at D ()): ĠQu at D Ġ{ ĊĠĠĠĠĠĠĠ Ġres . w Ġ= Ġq 1 . w Ġ* Ġq 2 . w Ġ- Ġq 1 . x Ġ* Ġq 2 . x Ġ- Ġq 1 . y Ġ* Ġq 2 . y Ġ- Ġq 1 . z Ġ* Ġq 2 . z ĊĠĠĠĠĠĠĠ Ġres . x Ġ= Ġq 1 . w Ġ* Ġq 2 . x Ġ+ Ġq 1 . x Ġ* Ġq 2 . w Ġ+ Ġq 1 . y Ġ* Ġq 2 . z Ġ- Ġq 1 . z Ġ* Ġq 2 . y ĊĠĠĠĠĠĠĠ Ġres . y Ġ= Ġq 1 . w Ġ* Ġq 2 . y Ġ+ Ġq 1 . y Ġ* Ġq 2 . w Ġ+ Ġq 1 . z Ġ* Ġq 2 . x Ġ- Ġq 1 . x Ġ* Ġq 2 . z ĊĠĠĠĠĠĠĠ Ġres . z Ġ= Ġq 1 . w Ġ* Ġq 2 . z Ġ+ Ġq 1 . z Ġ* Ġq 2 . w Ġ+ Ġq 1 . x Ġ* Ġq 2 . y Ġ- Ġq 1 . y Ġ* Ġq 2 . x ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} Ċ }