mat3.monkey2 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. Namespace std.geom
  2. #rem monkeydoc @hidden
  3. #end
  4. Alias Mat3f:Mat3<Float>
  5. #rem monkeydoc @hidden
  6. #end
  7. Struct Mat3<T>
  8. Field i:Vec3<T>
  9. Field j:Vec3<T>
  10. Field k:Vec3<T>
  11. Method New()
  12. i.x=1;j.y=1;k.z=1
  13. End
  14. Method New( ix:Float,jy:Float,kz:Float )
  15. i.x=ix; j.y=jy; k.z=kz
  16. End
  17. Method New( i:Vec3<T>,j:Vec3<T>,k:Vec3<T> )
  18. Self.i=i; Self.j=j; Self.k=k
  19. End
  20. Method New( ix:T,iy:T,iz:T,jx:T,jy:T,jz:T,kx:T,ky:T,kz:T )
  21. i.x=ix; i.y=iy; i.z=iz
  22. j.x=jx; j.y=jy; j.z=jz
  23. k.x=kx; k.y=ky; k.z=kz
  24. End
  25. Method New( m:Mat4<T> )
  26. i.x=m.i.x ; i.y=m.i.y ; i.z=m.i.z
  27. j.x=m.j.x ; j.y=m.j.y ; j.z=m.j.z
  28. k.x=m.k.x ; k.y=m.k.y ; k.z=m.k.z
  29. End
  30. Operator To<C>:Mat3<C>()
  31. Return New Mat3<C>( i,j,k )
  32. End
  33. Operator To:String()
  34. Return "Mat3("+i+","+j+","+k+")"
  35. End
  36. Property Determinant:T()
  37. Return i.x*(j.y*k.z-j.z*k.y )-i.y*(j.x*k.z-j.z*k.x )+i.z*(j.x*k.y-j.y*k.x )
  38. End
  39. Operator~:Mat3()
  40. Return New Mat3( i.x,j.x,k.x, i.y,j.y,k.y, i.z,j.z,k.z )
  41. End
  42. Operator-:Mat3()
  43. Local t:=1.0/Determinant
  44. Return New Mat3(
  45. t*(j.y*k.z-j.z*k.y),-t*(i.y*k.z-i.z*k.y), t*(i.y*j.z-i.z*j.y),
  46. -t*(j.x*k.z-j.z*k.x), t*(i.x*k.z-i.z*k.x),-t*(i.x*j.z-i.z*j.x),
  47. t*(j.x*k.y-j.y*k.x),-t*(i.x*k.y-i.y*k.x), t*(i.x*j.y-i.y*j.x) )
  48. End
  49. Operator*:Mat3( m:Mat3 )
  50. Return New Mat3(
  51. i.x*m.i.x+j.x*m.i.y+k.x*m.i.z, i.y*m.i.x+j.y*m.i.y+k.y*m.i.z, i.z*m.i.x+j.z*m.i.y+k.z*m.i.z,
  52. i.x*m.j.x+j.x*m.j.y+k.x*m.j.z, i.y*m.j.x+j.y*m.j.y+k.y*m.j.z, i.z*m.j.x+j.z*m.j.y+k.z*m.j.z,
  53. i.x*m.k.x+j.x*m.k.y+k.x*m.k.z, i.y*m.k.x+j.y*m.k.y+k.y*m.k.z, i.z*m.k.x+j.z*m.k.y+k.z*m.k.z )
  54. End
  55. ' Operator*:Mat3( q:Quat<T> )
  56. ' Return Self * New Mat3( q )
  57. ' End
  58. Operator*:Vec3<T>( v:Vec3<T> )
  59. Return New Vec3<T>( i.x*v.x+j.x*v.y+k.x*v.z,i.y*v.x+j.y*v.y+k.y*v.z,i.z*v.x+j.z*v.y+k.z*v.z )
  60. End
  61. Method Cofactor:Mat3()
  62. Return New Mat3(
  63. (j.y*k.z-j.z*k.y),-(j.x*k.z-j.z*k.x), (j.x*k.y-j.y*k.x),
  64. -(i.y*k.z-i.z*k.y), (i.x*k.z-i.z*k.x),-(i.x*k.y-i.y*k.x),
  65. (i.y*j.z-i.z*j.y),-(i.x*j.z-i.z*j.x), (i.x*j.y-i.y*j.x) )
  66. End
  67. Method GetPitch:Double()
  68. Return k.Pitch
  69. End
  70. Method GetYaw:Double()
  71. Return k.Yaw
  72. End
  73. Method GetRoll:Double()
  74. Return ATan2( i.y,j.y )
  75. End
  76. Method GetRotation:Vec3<T>()
  77. Return New Vec3<T>( GetPitch(),GetYaw(),GetRoll() )
  78. End
  79. Method GetQuat:Quat<T>()
  80. Local r:Quat<T>
  81. Local m:=Orthogonalize()
  82. Local t:=m.i.x+m.j.y+m.k.z
  83. If t>EPSILON
  84. t=Sqrt( t+1 )*2
  85. r.v.x=(m.k.y-m.j.z)/t
  86. r.v.y=(m.i.z-m.k.x)/t
  87. r.v.z=(m.j.x-m.i.y)/t
  88. r.w=t/4
  89. Else If m.i.x>m.j.y And m.i.x>m.k.z
  90. t=Sqrt( m.i.x-m.j.y-m.k.z+1 )*2
  91. r.v.x=t/4
  92. r.v.y=(m.j.x+m.i.y)/t
  93. r.v.z=(m.i.z+m.k.x)/t
  94. r.w=(m.k.y-m.j.z)/t
  95. Else If m.j.y>m.k.z
  96. t=Sqrt( m.j.y-m.k.z-m.i.x+1 )*2
  97. r.v.x=(m.j.x+m.i.y)/t
  98. r.v.y=t/4
  99. r.v.z=(m.k.y+m.j.z)/t
  100. r.w=(m.i.z-m.k.x)/t
  101. Else
  102. t=Sqrt( m.k.z-m.j.y-m.i.x+1 )*2
  103. r.v.x=(m.i.z+m.k.x)/t
  104. r.v.y=(m.k.y+m.j.z)/t
  105. r.v.z=t/4
  106. r.w=(m.j.x-m.i.y)/t
  107. Endif
  108. Return r
  109. End
  110. Method GetScaling:Vec3<T>()
  111. Return New Vec3<T>( i.Length,j.Length,k.Length )
  112. End
  113. Method Rotate:Mat3( rv:Vec3<T> )
  114. Return Self * Rotation( rv )
  115. End
  116. Method Rotate:Mat3( rx:Double,ry:Double,rz:Double )
  117. Return Self * Rotation( rx,ry,rz )
  118. End
  119. Method Scale:Mat3( rv:Vec3<T> )
  120. Return Self * Scaling( rv )
  121. End
  122. Method Scale:Mat3( sx:T,sy:T,sz:T )
  123. Return Self * Scaling( sx,sy,sz )
  124. End
  125. Method Scale:Mat3( t:T )
  126. Return Self * Scaling( t )
  127. End
  128. Method Orthogonalize:Mat3()
  129. Local k:=Self.k.Normalize()
  130. Return New Mat3( j.Cross( k ).Normalize(),k.Cross( i ).Normalize(),k )
  131. End
  132. #rem monkeydoc Creates a yaw (y axis) rotation matrix.
  133. #end
  134. Function Yaw:Mat3( an:Double )
  135. Local sin:=Sin(an),cos:=Cos(an)
  136. Return New Mat3( cos,0,sin, 0,1,0, -sin,0,cos )
  137. End
  138. #rem monkeydoc Creates a pitch (x axis) rotation matrix.
  139. #end
  140. Function Pitch:Mat3( an:Double )
  141. Local sin:=Sin(an),cos:=Cos(an)
  142. return New Mat3( 1,0,0, 0,cos,sin, 0,-sin,cos )
  143. End
  144. #rem monkeydoc Creates a roll (z axis) rotation matrix.
  145. #end
  146. Function Roll:Mat3( an:Double )
  147. Local sin:=Sin(an),cos:=Cos(an)
  148. Return New Mat3( cos,sin,0, -sin,cos,0, 0,0,1 )
  149. End
  150. #rem monkeydoc Creates a rotation matrix from a quaternion.
  151. #end
  152. Function Rotation:Mat3( quat:Quat<T> )
  153. Local xx:=quat.v.x*quat.v.x , yy:=quat.v.y*quat.v.y , zz:=quat.v.z*quat.v.z
  154. Local xy:=quat.v.x*quat.v.y , xz:=quat.v.x*quat.v.z , yz:=quat.v.y*quat.v.z
  155. Local wx:=quat.w*quat.v.x , wy:=quat.w*quat.v.y , wz:=quat.w*quat.v.z
  156. Local r:Mat3
  157. r.i.x=1-2*(yy+zz) ; r.i.y= 2*(xy-wz) ; r.i.z= 2*(xz+wy)
  158. r.j.x= 2*(xy+wz) ; r.j.y=1-2*(xx+zz) ; r.j.z= 2*(yz-wx)
  159. r.k.x= 2*(xz-wy) ; r.k.y= 2*(yz+wx) ; r.k.z=1-2*(xx+yy)
  160. Return r
  161. End
  162. #rem monkeydoc Creates a rotation matrix from euler angles.
  163. Order of rotation is Yaw * Pitch * Roll.
  164. #end
  165. Function Rotation:Mat3( rv:Vec3<Double> )
  166. Return Yaw( rv.y ) * Pitch( rv.x ) * Roll( rv.z )
  167. End
  168. Function Rotation:Mat3( rx:Double,ry:Double,rz:Double )
  169. Return Yaw( ry ) * Pitch( rx ) * Roll( rz )
  170. End
  171. #rem monkeydoc Creates a scaling matrix.
  172. #end
  173. Function Scaling:Mat3( sv:Vec3<T> )
  174. Return New Mat3( sv.x,sv.y,sv.z )
  175. End
  176. Function Scaling:Mat3( sx:T,sy:T,sz:T )
  177. Return New Mat3( sx,sy,sz )
  178. End
  179. Function Scaling:Mat3( t:T )
  180. Return New Mat3( t,t,t )
  181. End
  182. End