<html> <head> <title>OgreMatrix3.h Source File - OGRE Documentation</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <!-- Generated by Doxygen 1.3.6 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div> <h1>OgreMatrix3.h</h1><a href="OgreMatrix3_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*</span> 00002 <span class="comment">-----------------------------------------------------------------------------</span> 00003 <span class="comment">This source file is part of OGRE</span> 00004 <span class="comment"> (Object-oriented Graphics Rendering Engine)</span> 00005 <span class="comment">For the latest info, see http://www.ogre3d.org/</span> 00006 <span class="comment"></span> 00007 <span class="comment">Copyright (c) 2000-2005 The OGRE Team</span> 00008 <span class="comment">Also see acknowledgements in Readme.html</span> 00009 <span class="comment"></span> 00010 <span class="comment">This program is free software; you can redistribute it and/or modify it under</span> 00011 <span class="comment">the terms of the GNU Lesser General Public License as published by the Free Software</span> 00012 <span class="comment">Foundation; either version 2 of the License, or (at your option) any later</span> 00013 <span class="comment">version.</span> 00014 <span class="comment"></span> 00015 <span class="comment">This program is distributed in the hope that it will be useful, but WITHOUT</span> 00016 <span class="comment">ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span> 00017 <span class="comment">FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</span> 00018 <span class="comment"></span> 00019 <span class="comment">You should have received a copy of the GNU Lesser General Public License along with</span> 00020 <span class="comment">this program; if not, write to the Free Software Foundation, Inc., 59 Temple</span> 00021 <span class="comment">Place - Suite 330, Boston, MA 02111-1307, USA, or go to</span> 00022 <span class="comment">http://www.gnu.org/copyleft/lesser.txt.</span> 00023 <span class="comment">-----------------------------------------------------------------------------</span> 00024 <span class="comment">*/</span> 00025 <span class="preprocessor">#ifndef __Matrix3_H__</span> 00026 <span class="preprocessor"></span><span class="preprocessor">#define __Matrix3_H__</span> 00027 <span class="preprocessor"></span> 00028 <span class="preprocessor">#include "<a class="code" href="OgrePrerequisites_8h.html">OgrePrerequisites.h</a>"</span> 00029 00030 <span class="preprocessor">#include "<a class="code" href="OgreVector3_8h.html">OgreVector3.h</a>"</span> 00031 00032 <span class="comment">// NB All code adapted from Wild Magic 0.2 Matrix math (free source code)</span> 00033 <span class="comment">// http://www.magic-software.com</span> 00034 00035 <span class="comment">// NOTE. The (x,y,z) coordinate system is assumed to be right-handed.</span> 00036 <span class="comment">// Coordinate axis rotation matrices are of the form</span> 00037 <span class="comment">// RX = 1 0 0</span> 00038 <span class="comment">// 0 cos(t) -sin(t)</span> 00039 <span class="comment">// 0 sin(t) cos(t)</span> 00040 <span class="comment">// where t > 0 indicates a counterclockwise rotation in the yz-plane</span> 00041 <span class="comment">// RY = cos(t) 0 sin(t)</span> 00042 <span class="comment">// 0 1 0</span> 00043 <span class="comment">// -sin(t) 0 cos(t)</span> 00044 <span class="comment">// where t > 0 indicates a counterclockwise rotation in the zx-plane</span> 00045 <span class="comment">// RZ = cos(t) -sin(t) 0</span> 00046 <span class="comment">// sin(t) cos(t) 0</span> 00047 <span class="comment">// 0 0 1</span> 00048 <span class="comment">// where t > 0 indicates a counterclockwise rotation in the xy-plane.</span> 00049 00050 <span class="keyword">namespace </span>Ogre 00051 { <a name="l00059"></a><a class="code" href="classOgre_1_1Matrix3.html">00059</a> <span class="keyword">class </span><a class="code" href="OgrePlatform_8h.html#a13">_OgreExport</a> Matrix3 00060 { 00061 <span class="keyword">public</span>: <a name="l00066"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a0">00066</a> <span class="keyword">inline</span> Matrix3 () {}; <a name="l00067"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a1">00067</a> <span class="keyword">inline</span> <span class="keyword">explicit</span> Matrix3 (<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a420">Real</a> arr[3][3]) 00068 { 00069 memcpy(m,arr,9*<span class="keyword">sizeof</span>(<a class="code" href="namespaceOgre.html#a420">Real</a>)); 00070 } <a name="l00071"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a2">00071</a> <span class="keyword">inline</span> Matrix3 (<span class="keyword">const</span> Matrix3& rkMatrix) 00072 { 00073 memcpy(m,rkMatrix.<a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3p0">m</a>,9*<span class="keyword">sizeof</span>(<a class="code" href="namespaceOgre.html#a420">Real</a>)); 00074 } <a name="l00075"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a3">00075</a> Matrix3 (<a class="code" href="namespaceOgre.html#a420">Real</a> fEntry00, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry01, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry02, 00076 <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry10, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry11, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry12, 00077 <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry20, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry21, <a class="code" href="namespaceOgre.html#a420">Real</a> fEntry22) 00078 { 00079 m[0][0] = fEntry00; 00080 m[0][1] = fEntry01; 00081 m[0][2] = fEntry02; 00082 m[1][0] = fEntry10; 00083 m[1][1] = fEntry11; 00084 m[1][2] = fEntry12; 00085 m[2][0] = fEntry20; 00086 m[2][1] = fEntry21; 00087 m[2][2] = fEntry22; 00088 } 00089 00090 <span class="comment">// member access, allows use of construct mat[r][c]</span> <a name="l00091"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a4">00091</a> <span class="keyword">inline</span> <a class="code" href="namespaceOgre.html#a420">Real</a>* operator[] (size_t iRow)<span class="keyword"> const</span> 00092 <span class="keyword"> </span>{ 00093 <span class="keywordflow">return</span> (<a class="code" href="namespaceOgre.html#a420">Real</a>*)m[iRow]; 00094 } 00095 <span class="comment">/*inline operator Real* ()</span> 00096 <span class="comment"> {</span> 00097 <span class="comment"> return (Real*)m[0];</span> 00098 <span class="comment"> }*/</span> 00099 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> GetColumn (size_t iCol) <span class="keyword">const</span>; 00100 <span class="keywordtype">void</span> SetColumn(size_t iCol, <span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& vec); 00101 <span class="keywordtype">void</span> FromAxes(<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& xAxis, <span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& yAxis, <span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& zAxis); 00102 00103 <span class="comment">// assignment and comparison</span> <a name="l00104"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a8">00104</a> <span class="keyword">inline</span> Matrix3& operator= (<span class="keyword">const</span> Matrix3& rkMatrix) 00105 { 00106 memcpy(m,rkMatrix.<a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3p0">m</a>,9*<span class="keyword">sizeof</span>(<a class="code" href="namespaceOgre.html#a420">Real</a>)); 00107 <span class="keywordflow">return</span> *<span class="keyword">this</span>; 00108 } 00109 <span class="keywordtype">bool</span> <a class="code" href="namespaceOgre.html#a617">operator== </a>(<span class="keyword">const</span> Matrix3& rkMatrix) <span class="keyword">const</span>; <a name="l00110"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a10">00110</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceOgre.html#a618">operator!= </a>(<span class="keyword">const</span> Matrix3& rkMatrix)<span class="keyword"> const</span> 00111 <span class="keyword"> </span>{ 00112 <span class="keywordflow">return</span> !<a class="code" href="namespaceOgre.html#a617">operator==</a>(rkMatrix); 00113 } 00114 00115 <span class="comment">// arithmetic operations</span> 00116 Matrix3 operator+ (<span class="keyword">const</span> Matrix3& rkMatrix) <span class="keyword">const</span>; 00117 Matrix3 operator- (<span class="keyword">const</span> Matrix3& rkMatrix) <span class="keyword">const</span>; 00118 Matrix3 <a class="code" href="namespaceOgre.html#a611">operator* </a>(<span class="keyword">const</span> Matrix3& rkMatrix) <span class="keyword">const</span>; 00119 Matrix3 operator- () <span class="keyword">const</span>; 00120 00121 <span class="comment">// matrix * vector [3x3 * 3x1 = 3x1]</span> 00122 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> <a class="code" href="namespaceOgre.html#a611">operator* </a>(<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkVector) <span class="keyword">const</span>; 00123 00124 <span class="comment">// vector * matrix [1x3 * 3x3 = 1x3]</span> 00125 <a class="code" href="class__OgreExport.html">_OgreExport</a> <span class="keyword">friend</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> <a class="code" href="namespaceOgre.html#a611">operator* </a>(<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkVector, 00126 <span class="keyword">const</span> Matrix3& rkMatrix); 00127 00128 <span class="comment">// matrix * scalar</span> 00129 Matrix3 <a class="code" href="namespaceOgre.html#a611">operator* </a>(<a class="code" href="namespaceOgre.html#a420">Real</a> fScalar) <span class="keyword">const</span>; 00130 00131 <span class="comment">// scalar * matrix</span> 00132 <a class="code" href="class__OgreExport.html">_OgreExport</a> <span class="keyword">friend</span> Matrix3 <a class="code" href="namespaceOgre.html#a611">operator* </a>(<a class="code" href="namespaceOgre.html#a420">Real</a> fScalar, <span class="keyword">const</span> Matrix3& rkMatrix); 00133 00134 <span class="comment">// utilities</span> 00135 Matrix3 Transpose () <span class="keyword">const</span>; 00136 <span class="keywordtype">bool</span> Inverse (Matrix3& rkInverse, <a class="code" href="namespaceOgre.html#a420">Real</a> fTolerance = 1e-06) <span class="keyword">const</span>; 00137 Matrix3 Inverse (<a class="code" href="namespaceOgre.html#a420">Real</a> fTolerance = 1e-06) <span class="keyword">const</span>; 00138 <a class="code" href="namespaceOgre.html#a420">Real</a> Determinant () <span class="keyword">const</span>; 00139 00140 <span class="comment">// singular value decomposition</span> 00141 <span class="keywordtype">void</span> SingularValueDecomposition (Matrix3& rkL, <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkS, 00142 Matrix3& rkR) <span class="keyword">const</span>; 00143 <span class="keywordtype">void</span> SingularValueComposition (<span class="keyword">const</span> Matrix3& rkL, 00144 <span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkS, <span class="keyword">const</span> Matrix3& rkR); 00145 00146 <span class="comment">// Gram-Schmidt orthonormalization (applied to columns of rotation matrix)</span> 00147 <span class="keywordtype">void</span> Orthonormalize (); 00148 00149 <span class="comment">// orthogonal Q, diagonal D, upper triangular U stored as (u01,u02,u12)</span> 00150 <span class="keywordtype">void</span> QDUDecomposition (Matrix3& rkQ, <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkD, 00151 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkU) <span class="keyword">const</span>; 00152 00153 <a class="code" href="namespaceOgre.html#a420">Real</a> SpectralNorm () <span class="keyword">const</span>; 00154 00155 <span class="comment">// matrix must be orthonormal</span> 00156 <span class="keywordtype">void</span> ToAxisAngle (<a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkAxis, <a class="code" href="classOgre_1_1Radian.html">Radian</a>& rfAngle) <span class="keyword">const</span>; <a name="l00157"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3a27">00157</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> ToAxisAngle (<a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkAxis, <a class="code" href="classOgre_1_1Degree.html">Degree</a>& rfAngle)<span class="keyword"> const </span>{ 00158 <a class="code" href="classOgre_1_1Radian.html">Radian</a> r; 00159 ToAxisAngle ( rkAxis, r ); 00160 rfAngle = r; 00161 } 00162 <span class="keywordtype">void</span> FromAxisAngle (<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkAxis, <span class="keyword">const</span> <a class="code" href="classOgre_1_1Radian.html">Radian</a>& fRadians); 00163 <span class="preprocessor">#ifndef OGRE_FORCE_ANGLE_TYPES</span> 00164 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> ToAxisAngle (<a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkAxis, <a class="code" href="namespaceOgre.html#a420">Real</a>& rfRadians)<span class="keyword"> const </span>{ 00165 <a class="code" href="classOgre_1_1Radian.html">Radian</a> r; 00166 ToAxisAngle ( rkAxis, r ); 00167 rfRadians = r.<a class="code" href="classOgre_1_1Radian.html#Ogre_1_1Radiana6">valueRadians</a>(); 00168 } 00169 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromAxisAngle (<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkAxis, <a class="code" href="namespaceOgre.html#a420">Real</a> fRadians) { 00170 FromAxisAngle ( rkAxis, Radian(fRadians) ); 00171 } 00172 <span class="preprocessor">#endif//OGRE_FORCE_ANGLE_TYPES</span> 00173 <span class="preprocessor"></span> 00174 <span class="comment">// The matrix must be orthonormal. The decomposition is yaw*pitch*roll</span> 00175 <span class="comment">// where yaw is rotation about the Up vector, pitch is rotation about the</span> 00176 <span class="comment">// Right axis, and roll is rotation about the Direction axis.</span> 00177 <span class="keywordtype">bool</span> ToEulerAnglesXYZ (Radian& rfYAngle, Radian& rfPAngle, 00178 Radian& rfRAngle) <span class="keyword">const</span>; 00179 <span class="keywordtype">bool</span> ToEulerAnglesXZY (Radian& rfYAngle, Radian& rfPAngle, 00180 Radian& rfRAngle) <span class="keyword">const</span>; 00181 <span class="keywordtype">bool</span> ToEulerAnglesYXZ (Radian& rfYAngle, Radian& rfPAngle, 00182 Radian& rfRAngle) <span class="keyword">const</span>; 00183 <span class="keywordtype">bool</span> ToEulerAnglesYZX (Radian& rfYAngle, Radian& rfPAngle, 00184 Radian& rfRAngle) <span class="keyword">const</span>; 00185 <span class="keywordtype">bool</span> ToEulerAnglesZXY (Radian& rfYAngle, Radian& rfPAngle, 00186 Radian& rfRAngle) <span class="keyword">const</span>; 00187 <span class="keywordtype">bool</span> ToEulerAnglesZYX (Radian& rfYAngle, Radian& rfPAngle, 00188 Radian& rfRAngle) <span class="keyword">const</span>; 00189 <span class="keywordtype">void</span> FromEulerAnglesXYZ (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00190 <span class="keywordtype">void</span> FromEulerAnglesXZY (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00191 <span class="keywordtype">void</span> FromEulerAnglesYXZ (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00192 <span class="keywordtype">void</span> FromEulerAnglesYZX (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00193 <span class="keywordtype">void</span> FromEulerAnglesZXY (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00194 <span class="keywordtype">void</span> FromEulerAnglesZYX (<span class="keyword">const</span> Radian& fYAngle, <span class="keyword">const</span> Radian& fPAngle, <span class="keyword">const</span> Radian& fRAngle); 00195 <span class="preprocessor">#ifndef OGRE_FORCE_ANGLE_TYPES</span> 00196 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesXYZ (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00197 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00198 Radian y, p, r; 00199 <span class="keywordtype">bool</span> b = ToEulerAnglesXYZ(y,p,r); 00200 rfYAngle = y.valueRadians(); 00201 rfPAngle = p.valueRadians(); 00202 rfRAngle = r.valueRadians(); 00203 <span class="keywordflow">return</span> b; 00204 } 00205 <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesXZY (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00206 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00207 Radian y, p, r; 00208 <span class="keywordtype">bool</span> b = ToEulerAnglesXZY(y,p,r); 00209 rfYAngle = y.valueRadians(); 00210 rfPAngle = p.valueRadians(); 00211 rfRAngle = r.valueRadians(); 00212 <span class="keywordflow">return</span> b; 00213 } 00214 <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesYXZ (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00215 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00216 Radian y, p, r; 00217 <span class="keywordtype">bool</span> b = ToEulerAnglesYXZ(y,p,r); 00218 rfYAngle = y.valueRadians(); 00219 rfPAngle = p.valueRadians(); 00220 rfRAngle = r.valueRadians(); 00221 <span class="keywordflow">return</span> b; 00222 } 00223 <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesYZX (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00224 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00225 Radian y, p, r; 00226 <span class="keywordtype">bool</span> b = ToEulerAnglesYZX(y,p,r); 00227 rfYAngle = y.valueRadians(); 00228 rfPAngle = p.valueRadians(); 00229 rfRAngle = r.valueRadians(); 00230 <span class="keywordflow">return</span> b; 00231 } 00232 <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesZXY (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00233 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00234 Radian y, p, r; 00235 <span class="keywordtype">bool</span> b = ToEulerAnglesZXY(y,p,r); 00236 rfYAngle = y.valueRadians(); 00237 rfPAngle = p.valueRadians(); 00238 rfRAngle = r.valueRadians(); 00239 <span class="keywordflow">return</span> b; 00240 } 00241 <span class="keyword">inline</span> <span class="keywordtype">bool</span> ToEulerAnglesZYX (<span class="keywordtype">float</span>& rfYAngle, <span class="keywordtype">float</span>& rfPAngle, 00242 <span class="keywordtype">float</span>& rfRAngle)<span class="keyword"> const </span>{ 00243 Radian y, p, r; 00244 <span class="keywordtype">bool</span> b = ToEulerAnglesZYX(y,p,r); 00245 rfYAngle = y.valueRadians(); 00246 rfPAngle = p.valueRadians(); 00247 rfRAngle = r.valueRadians(); 00248 <span class="keywordflow">return</span> b; 00249 } 00250 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesXYZ (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00251 FromEulerAnglesXYZ ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00252 } 00253 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesXZY (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00254 FromEulerAnglesXZY ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00255 } 00256 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesYXZ (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00257 FromEulerAnglesYXZ ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00258 } 00259 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesYZX (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00260 FromEulerAnglesYZX ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00261 } 00262 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesZXY (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00263 FromEulerAnglesZXY ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00264 } 00265 <span class="keyword">inline</span> <span class="keywordtype">void</span> FromEulerAnglesZYX (<span class="keywordtype">float</span> fYAngle, <span class="keywordtype">float</span> fPAngle, <span class="keywordtype">float</span> fRAngle) { 00266 FromEulerAnglesZYX ( Radian(fYAngle), Radian(fPAngle), Radian(fRAngle) ); 00267 } 00268 <span class="preprocessor">#endif//OGRE_FORCE_ANGLE_TYPES</span> 00269 <span class="preprocessor"></span> <span class="comment">// eigensolver, matrix must be symmetric</span> 00270 <span class="keywordtype">void</span> EigenSolveSymmetric (<a class="code" href="namespaceOgre.html#a420">Real</a> afEigenvalue[3], 00271 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> akEigenvector[3]) <span class="keyword">const</span>; 00272 00273 <span class="keyword">static</span> <span class="keywordtype">void</span> TensorProduct (<span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkU, <span class="keyword">const</span> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& rkV, 00274 Matrix3& rkProduct); 00275 <a name="l00276"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3s0">00276</a> <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a420">Real</a> EPSILON; <a name="l00277"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3s1">00277</a> <span class="keyword">static</span> <span class="keyword">const</span> Matrix3 ZERO; <a name="l00278"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3s2">00278</a> <span class="keyword">static</span> <span class="keyword">const</span> Matrix3 IDENTITY; 00279 00280 <span class="keyword">protected</span>: 00281 <span class="comment">// support for eigensolver</span> 00282 <span class="keywordtype">void</span> Tridiagonal (<a class="code" href="namespaceOgre.html#a420">Real</a> afDiag[3], <a class="code" href="namespaceOgre.html#a420">Real</a> afSubDiag[3]); 00283 <span class="keywordtype">bool</span> QLAlgorithm (<a class="code" href="namespaceOgre.html#a420">Real</a> afDiag[3], <a class="code" href="namespaceOgre.html#a420">Real</a> afSubDiag[3]); 00284 00285 <span class="comment">// support for singular value decomposition</span> <a name="l00286"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3t0">00286</a> <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a420">Real</a> ms_fSvdEpsilon; <a name="l00287"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3t1">00287</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ms_iSvdMaxIterations; 00288 <span class="keyword">static</span> <span class="keywordtype">void</span> Bidiagonalize (Matrix3& kA, Matrix3& kL, 00289 Matrix3& kR); 00290 <span class="keyword">static</span> <span class="keywordtype">void</span> GolubKahanStep (Matrix3& kA, Matrix3& kL, 00291 Matrix3& kR); 00292 00293 <span class="comment">// support for spectral norm</span> 00294 <span class="keyword">static</span> <a class="code" href="namespaceOgre.html#a420">Real</a> MaxCubicRoot (<a class="code" href="namespaceOgre.html#a420">Real</a> afCoeff[3]); 00295 <a name="l00296"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3p0">00296</a> <a class="code" href="namespaceOgre.html#a420">Real</a> m[3][3]; 00297 00298 <span class="comment">// for faster access</span> <a name="l00299"></a><a class="code" href="classOgre_1_1Matrix3.html#Ogre_1_1Matrix3n0">00299</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classOgre_1_1Matrix4.html">Matrix4</a>; 00300 }; 00301 } 00302 <span class="preprocessor">#endif</span> </pre></div><p> Copyright © 2000-2005 by The OGRE Team<br /> Last modified Wed Feb 23 00:19:08 2005 </p> </body> </html>