quat.monkey2 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. Namespace std.geom
  2. #rem monkeydoc @hidden
  3. #end
  4. Const EPSILON:=0
  5. #rem monkeydoc @hidden
  6. #end
  7. Alias Quatf:Quat<Float>
  8. #rem monkeydoc @hidden
  9. #end
  10. Class Quat<T>
  11. Field v:Vec3<T>
  12. Field w:T
  13. Method New()
  14. w=1
  15. End
  16. Method New( v:Vec3<T>,w:Float )
  17. Self.v=v; Self.w=w
  18. End
  19. Method New( vx:T,vy:T,vz:T,w:T )
  20. v.x=vx ; v.y=vy ; v.z=vz ; Self.w=w
  21. End
  22. Operator To<C>:Quat<C>()
  23. Return New Quat<C>( v,w )
  24. End
  25. Method To:String()
  26. Return "Quat("+v+","+w+")"
  27. End
  28. Property Length:Double()
  29. Return Sqrt( v.Dot(v) + w*w )
  30. End
  31. Property I:Vec3<T>()
  32. Local xz:=v.x*v.z , wy:=w*v.y
  33. Local xy:=v.x*v.y , wz:=w*v.z
  34. Local yy:=v.y*v.y , zz:=v.z*v.z
  35. Return New Vec3<T>( 1-2*(yy+zz),2*(xy-wz),2*(xz+wy) )
  36. End
  37. Property J:Vec3<T>()
  38. Local yz:=v.y*v.z , wx:=w*v.x
  39. Local xy:=v.x*v.y , wz:=w*v.z
  40. Local xx:=v.x*v.x , zz:=v.z*v.z
  41. Return New Vec3<T>( 2*(xy+wz),1-2*(xx+zz),2*(yz-wx) )
  42. End
  43. Property K:Vec3<T>()
  44. Local xz:=v.x*v.z , wy:=w*v.y
  45. Local yz:=v.y*v.z , wx:=w*v.x
  46. Local xx:=v.x*v.x , yy:=v.y*v.y
  47. Return New Vec3<T>( 2*(xz-wy),2*(yz+wx),1-2*(xx+yy) )
  48. End
  49. Operator-:Quat()
  50. Return New Quat( -v,w )
  51. End
  52. Operator+:Quat( q:Quat )
  53. Return New Quat( v+q.v,w+q.w )
  54. End
  55. Operator-:Quat( q:Quat )
  56. Return New Quat( v-q.v,w-q.w )
  57. End
  58. Operator*:Quat( q:Quat )
  59. Return New Quat( q.v.Cross( v )+q.v*w+v*q.w, w*q.w-v.Dot( q.v ) )
  60. End
  61. Operator*:Vec3<T>( v:Vec3<T> )
  62. Return (Self * New Quat( v,0 ) * -Self).v
  63. End
  64. Operator*:Quat( t:Double )
  65. Return New Quat( v*t,w*t )
  66. End
  67. Operator/:Quat( t:Double )
  68. Return New Quat( v/t,w/t )
  69. End
  70. Method GetYaw:Double()
  71. Return K.Yaw
  72. End
  73. Method GetPitch:Double()
  74. Return K.Pitch
  75. End
  76. Method GetRoll:Double()
  77. Return ATan2( I.y,J.y )
  78. End
  79. Method Dot:Double( q:Quat )
  80. Return v.x*q.v.x + v.y*q.v.y + v.z*q.v.z + w*q.w
  81. End
  82. Method Normalize:Quat()
  83. Return Self/Length
  84. End
  85. Method Slerp:Quat( q:Quat,a:Double )
  86. Local t:=q
  87. Local b:=1-a
  88. Local d:=Dot( q )
  89. If d<0
  90. t.v=-t.v
  91. t.w=-t.w
  92. d=-d
  93. Endif
  94. If d<1-EPSILON
  95. Local om:=ACos( d )
  96. Local si:=Sin( om )
  97. a=Sin( a*om )/si
  98. b=Sin( b*om )/si
  99. Endif
  100. Return Self*b + t*a
  101. End
  102. Function Pitch:Quat( r:Double )
  103. Return New Quat( Sin( r/2 ),0,0,Cos( r/2 ) )
  104. End
  105. Function Yaw:Quat( r:Double )
  106. Return New Quat( 0,Sin( r/2 ),0,Cos( r/2 ) )
  107. End
  108. Function Roll:Quat( r:Double )
  109. Return New Quat( 0,0,Sin( r/2 ),Cos( r/2 ) )
  110. End
  111. Function Rotation:Quat( rv:Vec3<Double> )
  112. Return Yaw( rv.y ) * Pitch( rv.x ) * Roll( rv.z )
  113. End
  114. Function Rotation:Quat( rx:Double,ry:Double,rz:Double )
  115. Return Yaw( ry ) * Pitch( rx ) * Roll( rz )
  116. End
  117. End