00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _deMatrix3f_h
00024 #define _deMatrix3f_h
00025
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif
00029
00030 extern void deSetQ4M3(deFloat* resq, const deFloat (*m1)[DE_MATRIX3_COL]);
00031
00032 extern void deSetV3M3xyz(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL]);
00033
00034 extern void deSetV3M3zyx(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL]);
00035 extern void deSetV3M3zyxV3(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL], const deFloat* last);
00036
00037 extern void deLUdecomposeM3M3(deFloat (*lu)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL]);
00038 extern void deBackSubstituteV3M3V3(deFloat* x, const deFloat (*lu)[DE_MATRIX3_COL], const deFloat* y);
00039 extern void deSetM3S2(deFloat (*res)[DE_MATRIX3_COL], const int axis, const deFloat angle);
00040
00041
00042
00043 DE_MATH_API void deSetM3S9(deFloat (*res)[DE_MATRIX3_COL],
00044 const deFloat a0, const deFloat a1, const deFloat a2,
00045 const deFloat a3, const deFloat a4, const deFloat a5,
00046 const deFloat a6, const deFloat a7, const deFloat a8)
00047 {
00048 res[0][0] = a0; res[0][1] = a1; res[0][2] = a2;
00049 res[1][0] = a3; res[1][1] = a4; res[1][2] = a5;
00050 res[2][0] = a6; res[2][1] = a7; res[2][2] = a8;
00051 }
00052
00053 DE_MATH_API void deZeroM3(deFloat (*res)[DE_MATRIX3_COL])
00054 {
00055 res[0][0] = 0; res[0][1] = 0; res[0][2] = 0;
00056 res[1][0] = 0; res[1][1] = 0; res[1][2] = 0;
00057 res[2][0] = 0; res[2][1] = 0; res[2][2] = 0;
00058 }
00059
00060 DE_MATH_API void deIdentityM3(deFloat (*res)[DE_MATRIX3_COL])
00061 {
00062 res[0][0] = 1; res[0][1] = 0; res[0][2] = 0;
00063 res[1][0] = 0; res[1][1] = 1; res[1][2] = 0;
00064 res[2][0] = 0; res[2][1] = 0; res[2][2] = 1;
00065 }
00066
00067 DE_MATH_API void deMulM3S1(deFloat (*res)[DE_MATRIX3_COL], const deFloat s)
00068 {
00069 res[0][0] *= s; res[0][1] *= s; res[0][2] *= s;
00070 res[1][0] *= s; res[1][1] *= s; res[1][2] *= s;
00071 res[2][0] *= s; res[2][1] *= s; res[2][2] *= s;
00072 }
00073
00074 DE_MATH_API void deNegateM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00075 {
00076 res[0][0] = -m1[0][0]; res[0][1] = -m1[0][1]; res[0][2] = -m1[0][2];
00077 res[1][0] = -m1[1][0]; res[1][1] = -m1[1][1]; res[1][2] = -m1[1][2];
00078 res[2][0] = -m1[2][0]; res[2][1] = -m1[2][1]; res[2][2] = -m1[2][2];
00079 }
00080
00081 DE_MATH_API void deSetM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00082 {
00083 res[0][0] = m1[0][0]; res[0][1] = m1[0][1]; res[0][2] = m1[0][2];
00084 res[1][0] = m1[1][0]; res[1][1] = m1[1][1]; res[1][2] = m1[1][2];
00085 res[2][0] = m1[2][0]; res[2][1] = m1[2][1]; res[2][2] = m1[2][2];
00086 }
00087
00088 DE_MATH_API void deAddM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00089 {
00090 res[0][0] += m1[0][0]; res[0][1] += m1[0][1]; res[0][2] += m1[0][2];
00091 res[1][0] += m1[1][0]; res[1][1] += m1[1][1]; res[1][2] += m1[1][2];
00092 res[2][0] += m1[2][0]; res[2][1] += m1[2][1]; res[2][2] += m1[2][2];
00093 }
00094
00095 DE_MATH_API void deSubM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00096 {
00097 res[0][0] -= m1[0][0]; res[0][1] -= m1[0][1]; res[0][2] -= m1[0][2];
00098 res[1][0] -= m1[1][0]; res[1][1] -= m1[1][1]; res[1][2] -= m1[1][2];
00099 res[2][0] -= m1[2][0]; res[2][1] -= m1[2][1]; res[2][2] -= m1[2][2];
00100 }
00101
00102
00103 DE_MATH_API void deAddM3M3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00104 {
00105 res[0][0] = m1[0][0] + m2[0][0]; res[0][1] = m1[0][1] + m2[0][1]; res[0][2] = m1[0][2] + m2[0][2];
00106 res[1][0] = m1[1][0] + m2[1][0]; res[1][1] = m1[1][1] + m2[1][1]; res[1][2] = m1[1][2] + m2[1][2];
00107 res[2][0] = m1[2][0] + m2[2][0]; res[2][1] = m1[2][1] + m2[2][1]; res[2][2] = m1[2][2] + m2[2][2];
00108 }
00109
00110 DE_MATH_API void deSubM3M3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00111 {
00112 res[0][0] = m1[0][0] - m2[0][0]; res[0][1] = m1[0][1] - m2[0][1]; res[0][2] = m1[0][2] - m2[0][2];
00113 res[1][0] = m1[1][0] - m2[1][0]; res[1][1] = m1[1][1] - m2[1][1]; res[1][2] = m1[1][2] - m2[1][2];
00114 res[2][0] = m1[2][0] - m2[2][0]; res[2][1] = m1[2][1] - m2[2][1]; res[2][2] = m1[2][2] - m2[2][2];
00115 }
00116
00117 DE_MATH_API void deMulM3M3S1(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat s)
00118 {
00119 res[0][0] = m1[0][0] * s; res[0][1] = m1[0][1] * s; res[0][2] = m1[0][2] * s;
00120 res[1][0] = m1[1][0] * s; res[1][1] = m1[1][1] * s; res[1][2] = m1[1][2] * s;
00121 res[2][0] = m1[2][0] * s; res[2][1] = m1[2][1] * s; res[2][2] = m1[2][2] * s;
00122 }
00123
00124 DE_MATH_API void deMulM3M3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00125 {
00126 res[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0] + m1[0][2] * m2[2][0];
00127 res[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1];
00128 res[0][2] = m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2];
00129 res[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0];
00130 res[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1];
00131 res[1][2] = m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2];
00132 res[2][0] = m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0];
00133 res[2][1] = m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1];
00134 res[2][2] = m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2];
00135 }
00136
00137
00138 DE_MATH_API void deMulM3M3tM3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00139 {
00140 res[0][0] = m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0];
00141 res[0][1] = m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1];
00142 res[0][2] = m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2];
00143 res[1][0] = m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0];
00144 res[1][1] = m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1];
00145 res[1][2] = m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2];
00146 res[2][0] = m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0];
00147 res[2][1] = m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1];
00148 res[2][2] = m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2];
00149 }
00150
00151
00152 DE_MATH_API void deMulM3M3M3t(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00153 {
00154 res[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[0][1] + m1[0][2] * m2[0][2];
00155 res[0][1] = m1[0][0] * m2[1][0] + m1[0][1] * m2[1][1] + m1[0][2] * m2[1][2];
00156 res[0][2] = m1[0][0] * m2[2][0] + m1[0][1] * m2[2][1] + m1[0][2] * m2[2][2];
00157 res[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[0][1] + m1[1][2] * m2[0][2];
00158 res[1][1] = m1[1][0] * m2[1][0] + m1[1][1] * m2[1][1] + m1[1][2] * m2[1][2];
00159 res[1][2] = m1[1][0] * m2[2][0] + m1[1][1] * m2[2][1] + m1[1][2] * m2[2][2];
00160 res[2][0] = m1[2][0] * m2[0][0] + m1[2][1] * m2[0][1] + m1[2][2] * m2[0][2];
00161 res[2][1] = m1[2][0] * m2[1][0] + m1[2][1] * m2[1][1] + m1[2][2] * m2[1][2];
00162 res[2][2] = m1[2][0] * m2[2][0] + m1[2][1] * m2[2][1] + m1[2][2] * m2[2][2];
00163 }
00164
00165 DE_MATH_API void deMulV3M3V3(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL], const deFloat* v2)
00166 {
00167 resv[0] = m1[0][0] * v2[0] + m1[0][1] * v2[1] + m1[0][2] * v2[2];
00168 resv[1] = m1[1][0] * v2[0] + m1[1][1] * v2[1] + m1[1][2] * v2[2];
00169 resv[2] = m1[2][0] * v2[0] + m1[2][1] * v2[1] + m1[2][2] * v2[2];
00170 }
00171
00172
00173 DE_MATH_API void deMulV3M3tV3(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL], const deFloat* v2)
00174 {
00175 resv[0] = m1[0][0] * v2[0] + m1[1][0] * v2[1] + m1[2][0] * v2[2];
00176 resv[1] = m1[0][1] * v2[0] + m1[1][1] * v2[1] + m1[2][1] * v2[2];
00177 resv[2] = m1[0][2] * v2[0] + m1[1][2] * v2[1] + m1[2][2] * v2[2];
00178 }
00179
00180
00181 DE_MATH_API void deMulM3M3V3x(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL], const deFloat* v2)
00182 {
00183 res[0][0] = m1[0][1] * v2[2] - m1[0][2] * v2[1];
00184 res[0][1] = -m1[0][0] * v2[2] + m1[0][2] * v2[0];
00185 res[0][2] = m1[0][0] * v2[1] - m1[0][1] * v2[0];
00186 res[1][0] = m1[1][1] * v2[2] - m1[1][2] * v2[1];
00187 res[1][1] = -m1[1][0] * v2[2] + m1[1][2] * v2[0];
00188 res[1][2] = m1[1][0] * v2[1] - m1[1][1] * v2[0];
00189 res[2][0] = m1[2][1] * v2[2] - m1[2][2] * v2[1];
00190 res[2][1] = -m1[2][0] * v2[2] + m1[2][2] * v2[0];
00191 res[2][2] = m1[2][0] * v2[1] - m1[2][1] * v2[0];
00192 }
00193
00194
00195 DE_MATH_API void deTransposeM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00196 {
00197 res[0][0] = m1[0][0]; res[0][1] = m1[1][0]; res[0][2] = m1[2][0];
00198 res[1][0] = m1[0][1]; res[1][1] = m1[1][1]; res[1][2] = m1[2][1];
00199 res[2][0] = m1[0][2]; res[2][1] = m1[1][2]; res[2][2] = m1[2][2];
00200 }
00201
00202 DE_MATH_API void deColumnV3M3S1(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL], const int col)
00203 {
00204 resv[0] = m1[0][col];
00205 resv[1] = m1[1][col];
00206 resv[2] = m1[2][col];
00207 }
00208
00209 DE_MATH_API void deDiagonalM3V3(deFloat (*res)[DE_MATRIX3_COL], const deFloat* v1)
00210 {
00211 res[0][0] = v1[0]; res[0][1] = 0; res[0][2] = 0;
00212 res[1][0] = 0; res[1][1] = v1[1]; res[1][2] = 0;
00213 res[2][0] = 0; res[2][1] = 0; res[2][2] = v1[2];
00214 }
00215
00216 DE_MATH_API void deDiagonalM3S3(deFloat (*res)[DE_MATRIX3_COL], const deFloat x, const deFloat y, const deFloat z)
00217 {
00218 res[0][0] = x; res[0][1] = 0; res[0][2] = 0;
00219 res[1][0] = 0; res[1][1] = y; res[1][2] = 0;
00220 res[2][0] = 0; res[2][1] = 0; res[2][2] = z;
00221 }
00222
00223 DE_MATH_API void deDiagonalV3M3(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL])
00224 {
00225 resv[0] = m1[0][0];
00226 resv[1] = m1[1][1];
00227 resv[2] = m1[2][2];
00228 }
00229
00230 DE_MATH_API deFloat dedetM3(const deFloat (*m1)[DE_MATRIX3_COL])
00231 {
00232 return ( m1[0][0] * (m1[1][1] * m1[2][2] - m1[1][2] * m1[2][1])
00233 - m1[0][1] * (m1[1][0] * m1[2][2] - m1[1][2] * m1[2][0])
00234 + m1[0][2] * (m1[1][0] * m1[2][1] - m1[1][1] * m1[2][0]));
00235 }
00236
00237 DE_MATH_API void deInvertDetSPDM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00238 {
00239 deFloat ood = 1 / dedetM3(m1);
00240
00241 res[0][0] = ood * (m1[1][1] * m1[2][2] - m1[1][2] * m1[2][1]);
00242 res[0][1] = -ood * (m1[0][1] * m1[2][2] - m1[0][2] * m1[2][1]);
00243 res[0][2] = ood * (m1[0][1] * m1[1][2] - m1[0][2] * m1[1][1]);
00244 res[1][0] = res[0][1];
00245 res[1][1] = ood * (m1[0][0] * m1[2][2] - m1[0][2] * m1[2][0]);
00246 res[1][2] = -ood * (m1[0][0] * m1[1][2] - m1[0][2] * m1[1][0]);
00247 res[2][0] = res[0][2];
00248 res[2][1] = res[1][2];
00249 res[2][2] = ood * (m1[0][0] * m1[1][1] - m1[0][1] * m1[1][0]);
00250 }
00251
00252 DE_MATH_API void deInvertDetM3M3(deFloat (*res)[DE_MATRIX3_COL], const deFloat (*m1)[DE_MATRIX3_COL])
00253 {
00254 deFloat ood = 1 / dedetM3(m1);
00255
00256 res[0][0] = ood * (m1[1][1] * m1[2][2] - m1[1][2] * m1[2][1]);
00257 res[0][1] = -ood * (m1[0][1] * m1[2][2] - m1[0][2] * m1[2][1]);
00258 res[0][2] = ood * (m1[0][1] * m1[1][2] - m1[0][2] * m1[1][1]);
00259 res[1][0] = -ood * (m1[1][0] * m1[2][2] - m1[1][2] * m1[2][0]);
00260 res[1][1] = ood * (m1[0][0] * m1[2][2] - m1[0][2] * m1[2][0]);
00261 res[1][2] = -ood * (m1[0][0] * m1[1][2] - m1[0][2] * m1[1][0]);
00262 res[2][0] = ood * (m1[1][0] * m1[2][1] - m1[1][1] * m1[2][0]);
00263 res[2][1] = -ood * (m1[0][0] * m1[2][1] - m1[0][1] * m1[2][0]);
00264 res[2][2] = ood * (m1[0][0] * m1[1][1] - m1[0][1] * m1[1][0]);
00265 }
00266
00267
00268 DE_MATH_API void deAngularErrorV3M3M3(deFloat* resv, const deFloat (*m1)[DE_MATRIX3_COL], const deFloat (*m2)[DE_MATRIX3_COL])
00269 {
00270 resv[0] = -(deFloat)0.5*((m1[1][0] * m2[2][0] + m1[1][1] * m2[2][1] + m1[1][2] * m2[2][2])
00271 - (m1[2][0] * m2[1][0] + m1[2][1] * m2[1][1] + m1[2][2] * m2[1][2]));
00272 resv[1] = -(deFloat)0.5*((m1[2][0] * m2[0][0] + m1[2][1] * m2[0][1] + m1[2][2] * m2[0][2])
00273 - (m1[0][0] * m2[2][0] + m1[0][1] * m2[2][1] + m1[0][2] * m2[2][2]));
00274 resv[2] = -(deFloat)0.5*((m1[0][0] * m2[1][0] + m1[0][1] * m2[1][1] + m1[0][2] * m2[1][2])
00275 - (m1[1][0] * m2[0][0] + m1[1][1] * m2[0][1] + m1[1][2] * m2[0][2]));
00276 }
00277
00278
00279
00280
00281
00282 DE_MATH_API void deSetM3Q4(deFloat (*res)[DE_MATRIX3_COL], const deFloat* q1)
00283 {
00284 res[0][0] = 1 - 2 * (q1[1] * q1[1] + q1[2] * q1[2]);
00285 res[0][1] = 2 * (q1[0] * q1[1] - q1[3] * q1[2]);
00286 res[0][2] = 2 * (q1[0] * q1[2] + q1[3] * q1[1]);
00287 res[1][0] = 2 * (q1[0] * q1[1] + q1[3] * q1[2]);
00288 res[1][1] = 1 - 2 * (q1[0] * q1[0] + q1[2] * q1[2]);
00289 res[1][2] = 2 * (q1[1] * q1[2] - q1[3] * q1[0]);
00290 res[2][0] = 2 * (q1[0] * q1[2] - q1[3] * q1[1]);
00291 res[2][1] = 2 * (q1[1] * q1[2] + q1[3] * q1[0]);
00292 res[2][2] = 1 - 2 * (q1[0] * q1[0] + q1[1] * q1[1]);
00293 }
00294
00295
00296 DE_MATH_API void deMulM3V3V3t(deFloat (*res)[DE_MATRIX3_COL], const deFloat* v1, const deFloat* v2)
00297 {
00298 res[0][0] = v1[0] * v2[0];
00299 res[0][1] = v1[0] * v2[1];
00300 res[0][2] = v1[0] * v2[2];
00301 res[1][0] = v1[1] * v2[0];
00302 res[1][1] = v1[1] * v2[1];
00303 res[1][2] = v1[1] * v2[2];
00304 res[2][0] = v1[2] * v2[0];
00305 res[2][1] = v1[2] * v2[1];
00306 res[2][2] = v1[2] * v2[2];
00307 }
00308
00309
00310 DE_MATH_API void deSetM3V3x(deFloat (*res)[DE_MATRIX3_COL], const deFloat* v1)
00311 {
00312 res[0][0]= 0; res[0][1]= -v1[2]; res[0][2]= v1[1];
00313 res[1][0]= v1[2]; res[1][1]= 0; res[1][2]= -v1[0];
00314 res[2][0]= -v1[1]; res[2][1]= v1[0]; res[2][2]= 0;
00315 }
00316
00317
00318 DE_MATH_API void deMulM3V3xM3(deFloat (*res)[DE_MATRIX3_COL], const deFloat* v1, const deFloat (*m2)[DE_MATRIX3_COL])
00319 {
00320 res[0][0]= -v1[2] * m2[1][0] + v1[1] * m2[2][0];
00321 res[0][1]= -v1[2] * m2[1][1] + v1[1] * m2[2][1];
00322 res[0][2]= -v1[2] * m2[1][2] + v1[1] * m2[2][2];
00323 res[1][0]= v1[2] * m2[0][0] - v1[0] * m2[2][0];
00324 res[1][1]= v1[2] * m2[0][1] - v1[0] * m2[2][1];
00325 res[1][2]= v1[2] * m2[0][2] - v1[0] * m2[2][2];
00326 res[2][0]= -v1[1] * m2[0][0] + v1[0] * m2[1][0];
00327 res[2][1]= -v1[1] * m2[0][1] + v1[0] * m2[1][1];
00328 res[2][2]= -v1[1] * m2[0][2] + v1[0] * m2[1][2];
00329 }
00330
00331
00332
00333
00334 DE_MATH_API void deSetM3V3S1(deFloat (*res)[DE_MATRIX3_COL], const deFloat* axis, const deFloat angle)
00335 {
00336
00337
00338 deFloat c = deCos(angle);
00339 deFloat v = 1 - c;
00340 deFloat s = deSin(angle);
00341
00342 res[0][0] = axis[0] * axis[0] * v + c;
00343 res[0][1] = axis[0] * axis[1] * v - axis[2] * s;
00344 res[0][2] = axis[0] * axis[2] * v + axis[1] * s;
00345 res[1][0] = axis[1] * axis[0] * v + axis[2] * s;
00346 res[1][1] = axis[1] * axis[1] * v + c;
00347 res[1][2] = axis[1] * axis[2] * v - axis[0] * s;
00348 res[2][0] = axis[2] * axis[0] * v - axis[1] * s;
00349 res[2][1] = axis[2] * axis[1] * v + axis[0] * s;
00350 res[2][2] = axis[2] * axis[2] * v + c;
00351 }
00352
00353 DE_MATH_API void deSetM3xyzS3(deFloat (*res)[DE_MATRIX3_COL], const deFloat x, const deFloat y, const deFloat z)
00354 {
00355 deFloat cx = deCos(x);
00356 deFloat sx = deSin(x);
00357 deFloat cy = deCos(y);
00358 deFloat sy = deSin(y);
00359 deFloat cz = deCos(z);
00360 deFloat sz = deSin(z);
00361
00362 res[0][0] = cy * cz;
00363 res[0][1] = -cy * sz;
00364 res[0][2] = sy;
00365
00366 res[1][0] = sx * sy * cz + cx * sz;
00367 res[1][1] = -sx * sy * sz + cx * cz;
00368 res[1][2] = -sx * cy;
00369
00370 res[2][0] = -cx * sy * cz + sx * sz;
00371 res[2][1] = cx * sy * sz + sx * cz;
00372 res[2][2] = cx * cy;
00373 }
00374
00375 DE_MATH_API void deSetM3zyxS3(deFloat (*res)[DE_MATRIX3_COL], const deFloat x, const deFloat y, const deFloat z)
00376 {
00377 deFloat cx = deCos(x);
00378 deFloat sx = deSin(x);
00379 deFloat cy = deCos(y);
00380 deFloat sy = deSin(y);
00381 deFloat cz = deCos(z);
00382 deFloat sz = deSin(z);
00383
00384 res[0][0] = cy * cz;
00385 res[1][0] = sx * sy * cz - cx * sz;
00386 res[2][0] = cx * sy * cz + sx * sz;
00387
00388 res[0][1] = cy * sz;
00389 res[1][1] = sx * sy * sz + cx * cz;
00390 res[2][1] = cx * sy * sz - sx * cz;
00391
00392 res[2][0] = -sy;
00393 res[2][1] = sx * cy;
00394 res[2][2] = cx * cy;
00395 }
00396
00397 #ifdef __cplusplus
00398 }
00399 #endif
00400
00401 #endif