Matrix3x4.pkg 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. $#include "Matrix3x4.h"
  2. /// 3x4 matrix for scene node transform calculations.
  3. class Matrix3x4
  4. {
  5. public:
  6. /// Construct undefined.
  7. Matrix3x4()
  8. {
  9. }
  10. /// Copy-construct from another matrix.
  11. Matrix3x4(const Matrix3x4& matrix) :
  12. m00_(matrix.m00_),
  13. m01_(matrix.m01_),
  14. m02_(matrix.m02_),
  15. m03_(matrix.m03_),
  16. m10_(matrix.m10_),
  17. m11_(matrix.m11_),
  18. m12_(matrix.m12_),
  19. m13_(matrix.m13_),
  20. m20_(matrix.m20_),
  21. m21_(matrix.m21_),
  22. m22_(matrix.m22_),
  23. m23_(matrix.m23_)
  24. {
  25. }
  26. /// Copy-construct from a 3x3 matrix and set the extra elements to identity.
  27. Matrix3x4(const Matrix3& matrix) :
  28. m00_(matrix.m00_),
  29. m01_(matrix.m01_),
  30. m02_(matrix.m02_),
  31. m03_(0.0f),
  32. m10_(matrix.m10_),
  33. m11_(matrix.m11_),
  34. m12_(matrix.m12_),
  35. m13_(0.0f),
  36. m20_(matrix.m20_),
  37. m21_(matrix.m21_),
  38. m22_(matrix.m22_),
  39. m23_(0.0f)
  40. {
  41. }
  42. /// Copy-construct from a 4x4 matrix which is assumed to contain no projection.
  43. Matrix3x4(const Matrix4& matrix) :
  44. m00_(matrix.m00_),
  45. m01_(matrix.m01_),
  46. m02_(matrix.m02_),
  47. m03_(matrix.m03_),
  48. m10_(matrix.m10_),
  49. m11_(matrix.m11_),
  50. m12_(matrix.m12_),
  51. m13_(matrix.m13_),
  52. m20_(matrix.m20_),
  53. m21_(matrix.m21_),
  54. m22_(matrix.m22_),
  55. m23_(matrix.m23_)
  56. {
  57. }
  58. // Construct from values.
  59. Matrix3x4(float v00, float v01, float v02, float v03,
  60. float v10, float v11, float v12, float v13,
  61. float v20, float v21, float v22, float v23) :
  62. m00_(v00),
  63. m01_(v01),
  64. m02_(v02),
  65. m03_(v03),
  66. m10_(v10),
  67. m11_(v11),
  68. m12_(v12),
  69. m13_(v13),
  70. m20_(v20),
  71. m21_(v21),
  72. m22_(v22),
  73. m23_(v23)
  74. {
  75. }
  76. /// Construct from translation, rotation and uniform scale.
  77. Matrix3x4(const Vector3& translation, const Quaternion& rotation, float scale);
  78. /// Construct from translation, rotation and nonuniform scale.
  79. Matrix3x4(const Vector3& translation, const Quaternion& rotation, const Vector3& scale);
  80. /// Test for equality with another matrix without epsilon.
  81. bool operator == (const Matrix3x4& rhs) const
  82. {
  83. const float* leftData = Data();
  84. const float* rightData = rhs.Data();
  85. for (unsigned i = 0; i < 12; ++i)
  86. {
  87. if (leftData[i] != rightData[i])
  88. return false;
  89. }
  90. return true;
  91. }
  92. /// Multiply a Vector3 which is assumed to represent position.
  93. Vector3 operator * (const Vector3& rhs) const
  94. {
  95. return Vector3(
  96. (m00_ * rhs.x_ + m01_ * rhs.y_ + m02_ * rhs.z_ + m03_),
  97. (m10_ * rhs.x_ + m11_ * rhs.y_ + m12_ * rhs.z_ + m13_),
  98. (m20_ * rhs.x_ + m21_ * rhs.y_ + m22_ * rhs.z_ + m23_)
  99. );
  100. }
  101. /// Multiply a Vector4.
  102. Vector3 operator * (const Vector4& rhs) const
  103. {
  104. return Vector3(
  105. (m00_ * rhs.x_ + m01_ * rhs.y_ + m02_ * rhs.z_ + m03_ * rhs.w_),
  106. (m10_ * rhs.x_ + m11_ * rhs.y_ + m12_ * rhs.z_ + m13_ * rhs.w_),
  107. (m20_ * rhs.x_ + m21_ * rhs.y_ + m22_ * rhs.z_ + m23_ * rhs.w_)
  108. );
  109. }
  110. /// Add a matrix.
  111. Matrix3x4 operator + (const Matrix3x4& rhs) const
  112. {
  113. return Matrix3x4(
  114. m00_ + rhs.m00_,
  115. m01_ + rhs.m01_,
  116. m02_ + rhs.m02_,
  117. m03_ + rhs.m03_,
  118. m10_ + rhs.m10_,
  119. m11_ + rhs.m11_,
  120. m12_ + rhs.m12_,
  121. m13_ + rhs.m13_,
  122. m20_ + rhs.m20_,
  123. m21_ + rhs.m21_,
  124. m22_ + rhs.m22_,
  125. m23_ + rhs.m23_
  126. );
  127. }
  128. /// Subtract a matrix.
  129. Matrix3x4 operator - (const Matrix3x4& rhs) const
  130. {
  131. return Matrix3x4(
  132. m00_ - rhs.m00_,
  133. m01_ - rhs.m01_,
  134. m02_ - rhs.m02_,
  135. m03_ - rhs.m03_,
  136. m10_ - rhs.m10_,
  137. m11_ - rhs.m11_,
  138. m12_ - rhs.m12_,
  139. m13_ - rhs.m13_,
  140. m20_ - rhs.m20_,
  141. m21_ - rhs.m21_,
  142. m22_ - rhs.m22_,
  143. m23_ - rhs.m23_
  144. );
  145. }
  146. /// Multiply with a scalar.
  147. Matrix3x4 operator * (float rhs) const
  148. {
  149. return Matrix3x4(
  150. m00_ * rhs,
  151. m01_ * rhs,
  152. m02_ * rhs,
  153. m03_ * rhs,
  154. m10_ * rhs,
  155. m11_ * rhs,
  156. m12_ * rhs,
  157. m13_ * rhs,
  158. m20_ * rhs,
  159. m21_ * rhs,
  160. m22_ * rhs,
  161. m23_ * rhs
  162. );
  163. }
  164. /// Multiply a matrix.
  165. Matrix3x4 operator * (const Matrix3x4& rhs) const
  166. {
  167. return Matrix3x4(
  168. m00_ * rhs.m00_ + m01_ * rhs.m10_ + m02_ * rhs.m20_,
  169. m00_ * rhs.m01_ + m01_ * rhs.m11_ + m02_ * rhs.m21_,
  170. m00_ * rhs.m02_ + m01_ * rhs.m12_ + m02_ * rhs.m22_,
  171. m00_ * rhs.m03_ + m01_ * rhs.m13_ + m02_ * rhs.m23_ + m03_,
  172. m10_ * rhs.m00_ + m11_ * rhs.m10_ + m12_ * rhs.m20_,
  173. m10_ * rhs.m01_ + m11_ * rhs.m11_ + m12_ * rhs.m21_,
  174. m10_ * rhs.m02_ + m11_ * rhs.m12_ + m12_ * rhs.m22_,
  175. m10_ * rhs.m03_ + m11_ * rhs.m13_ + m12_ * rhs.m23_ + m13_,
  176. m20_ * rhs.m00_ + m21_ * rhs.m10_ + m22_ * rhs.m20_,
  177. m20_ * rhs.m01_ + m21_ * rhs.m11_ + m22_ * rhs.m21_,
  178. m20_ * rhs.m02_ + m21_ * rhs.m12_ + m22_ * rhs.m22_,
  179. m20_ * rhs.m03_ + m21_ * rhs.m13_ + m22_ * rhs.m23_ + m23_
  180. );
  181. }
  182. /// Multiply a 4x4 matrix.
  183. Matrix4 operator * (const Matrix4& rhs) const
  184. {
  185. return Matrix4(
  186. m00_ * rhs.m00_ + m01_ * rhs.m10_ + m02_ * rhs.m20_ + m03_ * rhs.m30_,
  187. m00_ * rhs.m01_ + m01_ * rhs.m11_ + m02_ * rhs.m21_ + m03_ * rhs.m31_,
  188. m00_ * rhs.m02_ + m01_ * rhs.m12_ + m02_ * rhs.m22_ + m03_ * rhs.m32_,
  189. m00_ * rhs.m03_ + m01_ * rhs.m13_ + m02_ * rhs.m23_ + m03_ * rhs.m33_,
  190. m10_ * rhs.m00_ + m11_ * rhs.m10_ + m12_ * rhs.m20_ + m13_ * rhs.m30_,
  191. m10_ * rhs.m01_ + m11_ * rhs.m11_ + m12_ * rhs.m21_ + m13_ * rhs.m31_,
  192. m10_ * rhs.m02_ + m11_ * rhs.m12_ + m12_ * rhs.m22_ + m13_ * rhs.m32_,
  193. m10_ * rhs.m03_ + m11_ * rhs.m13_ + m12_ * rhs.m23_ + m13_ * rhs.m33_,
  194. m20_ * rhs.m00_ + m21_ * rhs.m10_ + m22_ * rhs.m20_ + m23_ * rhs.m30_,
  195. m20_ * rhs.m01_ + m21_ * rhs.m11_ + m22_ * rhs.m21_ + m23_ * rhs.m31_,
  196. m20_ * rhs.m02_ + m21_ * rhs.m12_ + m22_ * rhs.m22_ + m23_ * rhs.m32_,
  197. m20_ * rhs.m03_ + m21_ * rhs.m13_ + m22_ * rhs.m23_ + m23_ * rhs.m33_,
  198. rhs.m30_,
  199. rhs.m31_,
  200. rhs.m32_,
  201. rhs.m33_
  202. );
  203. }
  204. /// Set translation elements.
  205. void SetTranslation(const Vector3& translation)
  206. {
  207. m03_ = translation.x_;
  208. m13_ = translation.y_;
  209. m23_ = translation.z_;
  210. }
  211. /// Set rotation elements from a 3x3 matrix.
  212. void SetRotation(const Matrix3& rotation)
  213. {
  214. m00_ = rotation.m00_;
  215. m01_ = rotation.m01_;
  216. m02_ = rotation.m02_;
  217. m10_ = rotation.m10_;
  218. m11_ = rotation.m11_;
  219. m12_ = rotation.m12_;
  220. m20_ = rotation.m20_;
  221. m21_ = rotation.m21_;
  222. m22_ = rotation.m22_;
  223. }
  224. /// Set scaling elements.
  225. void SetScale(const Vector3& scale)
  226. {
  227. m00_ = scale.x_;
  228. m11_ = scale.y_;
  229. m22_ = scale.z_;
  230. }
  231. /// Set uniform scaling elements.
  232. void SetScale(float scale)
  233. {
  234. m00_ = scale;
  235. m11_ = scale;
  236. m22_ = scale;
  237. }
  238. /// Return the combined rotation and scaling matrix.
  239. Matrix3 ToMatrix3() const
  240. {
  241. return Matrix3(
  242. m00_,
  243. m01_,
  244. m02_,
  245. m10_,
  246. m11_,
  247. m12_,
  248. m20_,
  249. m21_,
  250. m22_
  251. );
  252. }
  253. /// Return the rotation matrix with scaling removed.
  254. Matrix3 RotationMatrix() const
  255. {
  256. Vector3 invScale(
  257. 1.0f / sqrtf(m00_ * m00_ + m10_ * m10_ + m20_ * m20_),
  258. 1.0f / sqrtf(m01_ * m01_ + m11_ * m11_ + m21_ * m21_),
  259. 1.0f / sqrtf(m02_ * m02_ + m12_ * m12_ + m22_ * m22_)
  260. );
  261. return ToMatrix3().Scaled(invScale);
  262. }
  263. /// Return the translation part.
  264. Vector3 Translation() const
  265. {
  266. return Vector3(
  267. m03_,
  268. m13_,
  269. m23_
  270. );
  271. }
  272. /// Return the rotation part.
  273. Quaternion Rotation() const { return Quaternion(RotationMatrix()); }
  274. /// Return the scaling part.
  275. Vector3 Scale() const
  276. {
  277. return Vector3(
  278. sqrtf(m00_ * m00_ + m10_ * m10_ + m20_ * m20_),
  279. sqrtf(m01_ * m01_ + m11_ * m11_ + m21_ * m21_),
  280. sqrtf(m02_ * m02_ + m12_ * m12_ + m22_ * m22_)
  281. );
  282. }
  283. /// Test for equality with another matrix with epsilon.
  284. bool Equals(const Matrix3x4& rhs) const
  285. {
  286. const float* leftData = Data();
  287. const float* rightData = rhs.Data();
  288. for (unsigned i = 0; i < 12; ++i)
  289. {
  290. if (!Urho3D::Equals(leftData[i], rightData[i]))
  291. return false;
  292. }
  293. return true;
  294. }
  295. /// Return decomposition to translation, rotation and scale.
  296. void Decompose(Vector3& translation, Quaternion& rotation, Vector3& scale) const;
  297. /// Return inverse.
  298. Matrix3x4 Inverse() const;
  299. float m00_ @ m00;
  300. float m01_ @ m01;
  301. float m02_ @ m02;
  302. float m03_ @ m03;
  303. float m10_ @ m10;
  304. float m11_ @ m11;
  305. float m12_ @ m12;
  306. float m13_ @ m13;
  307. float m20_ @ m20;
  308. float m21_ @ m21;
  309. float m22_ @ m22;
  310. float m23_ @ m23;
  311. /// Zero matrix.
  312. static const Matrix3x4 ZERO;
  313. /// Identity matrix.
  314. static const Matrix3x4 IDENTITY;
  315. };