m3math.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file m3math.h
  3.  * @brief LLMatrix3 class header file.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_M3MATH_H
  33. #define LL_M3MATH_H
  34. #include "llerror.h"
  35. #include "stdtypes.h"
  36. class LLVector4;
  37. class LLVector3;
  38. class LLVector3d;
  39. class LLQuaternion;
  40. // NOTA BENE: Currently assuming a right-handed, z-up universe
  41. //      ji
  42. // LLMatrix3 = | 00 01 02 |
  43. //    | 10 11 12 |
  44. //    | 20 21 22 |
  45. // LLMatrix3 = | fx fy fz | forward-axis
  46. //    | lx ly lz | left-axis
  47. //    | ux uy uz | up-axis
  48. // NOTE: The world of computer graphics uses column-vectors and matricies that 
  49. // "operate to the left". 
  50. static const U32 NUM_VALUES_IN_MAT3 = 3;
  51. class LLMatrix3
  52. {
  53. public:
  54. F32 mMatrix[NUM_VALUES_IN_MAT3][NUM_VALUES_IN_MAT3];
  55. LLMatrix3(void); // Initializes Matrix to identity matrix
  56. explicit LLMatrix3(const F32 *mat); // Initializes Matrix to values in mat
  57. explicit LLMatrix3(const LLQuaternion &q); // Initializes Matrix with rotation q
  58. LLMatrix3(const F32 angle, const F32 x, const F32 y, const F32 z); // Initializes Matrix with axis angle
  59. LLMatrix3(const F32 angle, const LLVector3 &vec); // Initializes Matrix with axis angle
  60. LLMatrix3(const F32 angle, const LLVector3d &vec); // Initializes Matrix with axis angle
  61. LLMatrix3(const F32 angle, const LLVector4 &vec); // Initializes Matrix with axis angle
  62. LLMatrix3(const F32 roll, const F32 pitch, const F32 yaw); // Initializes Matrix with Euler angles
  63. //////////////////////////////
  64. //
  65. // Matrix initializers - these replace any existing values in the matrix
  66. //
  67. // various useful matrix functions
  68. const LLMatrix3& setIdentity(); // Load identity matrix
  69. const LLMatrix3& clear(); // Clears Matrix to zero
  70. const LLMatrix3& setZero(); // Clears Matrix to zero
  71. ///////////////////////////
  72. //
  73. // Matrix setters - set some properties without modifying others
  74. //
  75. // These functions take Rotation arguments
  76. const LLMatrix3& setRot(const F32 angle, const F32 x, const F32 y, const F32 z); // Calculate rotation matrix for rotating angle radians about (x, y, z)
  77. const LLMatrix3& setRot(const F32 angle, const LLVector3 &vec); // Calculate rotation matrix for rotating angle radians about vec
  78. const LLMatrix3& setRot(const F32 roll, const F32 pitch, const F32 yaw); // Calculate rotation matrix from Euler angles
  79. const LLMatrix3& setRot(const LLQuaternion &q); // Transform matrix by Euler angles and translating by pos
  80. const LLMatrix3& setRows(const LLVector3 &x_axis, const LLVector3 &y_axis, const LLVector3 &z_axis);
  81. const LLMatrix3& setRow( U32 rowIndex, const LLVector3& row );
  82. const LLMatrix3& setCol( U32 colIndex, const LLVector3& col );
  83. ///////////////////////////
  84. //
  85. // Get properties of a matrix
  86. //
  87. LLQuaternion quaternion() const; // Returns quaternion from mat
  88. void getEulerAngles(F32 *roll, F32 *pitch, F32 *yaw) const; // Returns Euler angles, in radians
  89. // Axis extraction routines
  90. LLVector3 getFwdRow() const;
  91. LLVector3 getLeftRow() const;
  92. LLVector3 getUpRow() const;
  93. F32  determinant() const; // Return determinant
  94. ///////////////////////////
  95. //
  96. // Operations on an existing matrix
  97. //
  98. const LLMatrix3& transpose(); // Transpose MAT4
  99. const LLMatrix3& orthogonalize(); // Orthogonalizes X, then Y, then Z
  100. void invert(); // Invert MAT4
  101. const LLMatrix3& adjointTranspose();// returns transpose of matrix adjoint, for multiplying normals
  102. // Rotate existing matrix  
  103. // Note: the two lines below are equivalent:
  104. // foo.rotate(bar) 
  105. // foo = foo * bar
  106. // That is, foo.rotate(bar) multiplies foo by bar FROM THE RIGHT
  107. const LLMatrix3& rotate(const F32 angle, const F32 x, const F32 y, const F32 z);  // Rotate matrix by rotating angle radians about (x, y, z)
  108. const LLMatrix3& rotate(const F32 angle, const LLVector3 &vec); // Rotate matrix by rotating angle radians about vec
  109. const LLMatrix3& rotate(const F32 roll, const F32 pitch, const F32 yaw);  // Rotate matrix by roll (about x), pitch (about y), and yaw (about z)
  110. const LLMatrix3& rotate(const LLQuaternion &q); // Transform matrix by Euler angles and translating by pos
  111. void add(const LLMatrix3& other_matrix); // add other_matrix to this one
  112. // This operator is misleading as to operation direction
  113. // friend LLVector3 operator*(const LLMatrix3 &a, const LLVector3 &b); // Apply rotation a to vector b
  114. friend LLVector3 operator*(const LLVector3 &a, const LLMatrix3 &b); // Apply rotation b to vector a
  115. friend LLVector3d operator*(const LLVector3d &a, const LLMatrix3 &b); // Apply rotation b to vector a
  116. friend LLMatrix3 operator*(const LLMatrix3 &a, const LLMatrix3 &b); // Return a * b
  117. friend bool operator==(const LLMatrix3 &a, const LLMatrix3 &b); // Return a == b
  118. friend bool operator!=(const LLMatrix3 &a, const LLMatrix3 &b); // Return a != b
  119. friend const LLMatrix3& operator*=(LLMatrix3 &a, const LLMatrix3 &b); // Return a * b
  120. friend const LLMatrix3& operator*=(LLMatrix3 &a, F32 scalar ); // Return a * scalar
  121. friend std::ostream&  operator<<(std::ostream& s, const LLMatrix3 &a); // Stream a
  122. };
  123. inline LLMatrix3::LLMatrix3(void)
  124. {
  125. mMatrix[0][0] = 1.f;
  126. mMatrix[0][1] = 0.f;
  127. mMatrix[0][2] = 0.f;
  128. mMatrix[1][0] = 0.f;
  129. mMatrix[1][1] = 1.f;
  130. mMatrix[1][2] = 0.f;
  131. mMatrix[2][0] = 0.f;
  132. mMatrix[2][1] = 0.f;
  133. mMatrix[2][2] = 1.f;
  134. }
  135. inline LLMatrix3::LLMatrix3(const F32 *mat)
  136. {
  137. mMatrix[0][0] = mat[0];
  138. mMatrix[0][1] = mat[1];
  139. mMatrix[0][2] = mat[2];
  140. mMatrix[1][0] = mat[3];
  141. mMatrix[1][1] = mat[4];
  142. mMatrix[1][2] = mat[5];
  143. mMatrix[2][0] = mat[6];
  144. mMatrix[2][1] = mat[7];
  145. mMatrix[2][2] = mat[8];
  146. }
  147. #endif
  148. // Rotation matrix hints...
  149. // Inverse of Rotation Matrices
  150. // ----------------------------
  151. // If R is a rotation matrix that rotate vectors from Frame-A to Frame-B,
  152. // then the transpose of R will rotate vectors from Frame-B to Frame-A.
  153. // Creating Rotation Matricies From Object Axes
  154. // --------------------------------------------
  155. // Suppose you know the three axes of some object in some "absolute-frame".
  156. // If you take those three vectors and throw them into the rows of 
  157. // a rotation matrix what do you get?
  158. //
  159. // R = | X0  X1  X2 |
  160. //     | Y0  Y1  Y2 |
  161. //     | Z0  Z1  Z2 |
  162. //
  163. // Yeah, but what does it mean?
  164. //
  165. // Transpose the matrix and have it operate on a vector...
  166. //
  167. // V * R_transpose = [ V0  V1  V2 ] * | X0  Y0  Z0 | 
  168. //                                    | X1  Y1  Z1 |                       
  169. //                                    | X2  Y2  Z2 |
  170. // 
  171. //                 = [ V*X  V*Y  V*Z ] 
  172. //
  173. //                 = components of V that are parallel to the three object axes
  174. //
  175. //                 = transformation of V into object frame
  176. //
  177. // Since the transformation of a rotation matrix is its inverse, then
  178. // R must rotate vectors from the object-frame into the absolute-frame.