Matrix44.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "Matrix44.h"
00013 using namespace OpenCAL::Utils;
00014
00015 #include <math.h>
00016
00017 using namespace std;
00018
00019
00020
00021 const Matrix44 Matrix44::zero(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
00022 const Matrix44 Matrix44::unity;
00023
00024
00025
00026
00027
00028
00029 Matrix44::Matrix44()
00030 {
00031 identity();
00032 }
00033
00034 Matrix44::Matrix44(const Matrix44 &source)
00035 {
00036 memcpy(m_values, source.m_values, 16 * sizeof(float));
00037 }
00038
00039 Matrix44::Matrix44(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)
00040 {
00041 m_values[0] = m11; m_values[1] = m12; m_values[2] = m13; m_values[3] = m14;
00042 m_values[4] = m21; m_values[5] = m22; m_values[6] = m23; m_values[7] = m24;
00043 m_values[8] = m31; m_values[9] = m32; m_values[10] = m33; m_values[11] = m34;
00044 m_values[12] = m41; m_values[13] = m42; m_values[14] = m43; m_values[15] = m44;
00045 }
00046
00047 Matrix44::~Matrix44()
00048 {
00049 }
00050
00051
00052
00053
00054
00055
00056 void Matrix44::set(float *values)
00057 {
00058 memcpy(m_values, values, 16 * sizeof(float));
00059 }
00060
00061
00062
00063
00064
00065 void Matrix44::operator=(const Matrix44 &m)
00066 {
00067 memcpy(m_values, m.m_values, 16 * sizeof(float));
00068 }
00069
00070 Matrix44 Matrix44::operator*(const Matrix44 &m) const
00071 {
00072 Matrix44 result;
00073
00074 for(int i = 0; i < 4; i++)
00075 for(int j = 0; j < 4; j++)
00076 result.m_values[i * 4 + j] = m_values[i * 4] * m.m_values[j] +
00077 m_values[i * 4 + 1] * m.m_values[4 + j] +
00078 m_values[i * 4 + 2] * m.m_values[8 + j] +
00079 m_values[i * 4 + 3] * m.m_values[12 + j];
00080
00081 return result;
00082 }
00083
00084 Matrix44 Matrix44::operator*(float factor) const
00085 {
00086 Matrix44 result;
00087
00088 for(int i = 0; i < 16; i++)
00089 result.m_values[i] = m_values[i] * factor;
00090
00091 return result;
00092 }
00093
00094 Vector3 Matrix44::operator*(const Vector3 &v) const
00095 {
00096 Vector3 result;
00097
00098 result.setX(m_values[0] * v.getX() + m_values[1] * v.getY() + m_values[2] * v.getZ() + m_values[3]);
00099 result.setY(m_values[4] * v.getX() + m_values[5] * v.getY() + m_values[6] * v.getZ() + m_values[7]);
00100 result.setZ(m_values[8] * v.getX() + m_values[9] * v.getY() + m_values[10] * v.getZ() + m_values[11]);
00101
00102 return result;
00103 }
00104
00105 Matrix44 Matrix44::operator+(const Matrix44 &m) const
00106 {
00107 Matrix44 result;
00108
00109 for(int i = 0; i < 16; i++)
00110 result.m_values[i] = m_values[i] + m.m_values[i];
00111
00112 return result;
00113 }
00114
00115 Matrix44 Matrix44::operator-() const
00116 {
00117 Matrix44 result;
00118
00119 for(int i = 0; i < 16; i++)
00120 result.m_values[i] = -m_values[i];
00121
00122 return result;
00123 }
00124
00125 bool Matrix44::operator==(const Matrix44 &m) const
00126 {
00127 for(int i = 0; i < 16; i++)
00128 if(m_values[i] != m.m_values[i])
00129 return false;
00130
00131 return true;
00132 }
00133
00134
00135
00136 Matrix44 OpenCAL::Utils::operator*(float factor, const Matrix44 &m)
00137 {
00138 Matrix44 result;
00139
00140 for(int i = 0; i < 16; i++)
00141 result.m_values[i] = m.m_values[i] * factor;
00142
00143 return result;
00144 }
00145
00146
00147
00148
00149
00150
00151 void Matrix44::translate(const Vector3 &translation)
00152 {
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 m_values[12] += translation.getX();
00164 m_values[13] += translation.getY();
00165 m_values[14] += translation.getZ();
00166 }
00167
00168 void Matrix44::rotateX(float angle)
00169 {
00170 float rad = Math::degToRad(angle);
00171 float cosinus = cosf(rad);
00172 float sinus = sinf(rad);
00173
00174 float m4 = m_values[4];
00175 float m5 = m_values[5];
00176 float m6 = m_values[6];
00177 float m7 = m_values[7];
00178
00179 m_values[4] = cosinus * m4 + sinus * m_values[8];
00180 m_values[5] = cosinus * m5 + sinus * m_values[9];
00181 m_values[6] = cosinus * m6 + sinus * m_values[10];
00182 m_values[7] = cosinus * m7 + sinus * m_values[11];
00183
00184 m_values[8] = cosinus * m_values[8] - sinus * m4;
00185 m_values[9] = cosinus * m_values[9] - sinus * m5;
00186 m_values[10] = cosinus * m_values[10] - sinus * m6;
00187 m_values[11] = cosinus * m_values[11] - sinus * m7;
00188 }
00189
00190 void Matrix44::rotateY(float angle)
00191 {
00192 float rad = Math::degToRad(angle);
00193 float cosinus = cosf(rad);
00194 float sinus = sinf(rad);
00195
00196 float m0 = m_values[0];
00197 float m1 = m_values[1];
00198 float m2 = m_values[2];
00199 float m3 = m_values[3];
00200
00201 m_values[0] = cosinus * m0 - sinus * m_values[8];
00202 m_values[1] = cosinus * m1 - sinus * m_values[9];
00203 m_values[2] = cosinus * m2 - sinus * m_values[10];
00204 m_values[3] = cosinus * m3 - sinus * m_values[11];
00205
00206 m_values[8] = cosinus * m_values[8] + sinus * m0;
00207 m_values[9] = cosinus * m_values[9] + sinus * m1;
00208 m_values[10] = cosinus * m_values[10] + sinus * m2;
00209 m_values[11] = cosinus * m_values[11] + sinus * m3;
00210 }
00211
00212 void Matrix44::rotateZ(float angle)
00213 {
00214 float rad = Math::degToRad(angle);
00215 float cosinus = cosf(rad);
00216 float sinus = sinf(rad);
00217
00218 float m0 = m_values[0];
00219 float m1 = m_values[1];
00220 float m2 = m_values[2];
00221 float m3 = m_values[3];
00222
00223 m_values[0] = cosinus * m0 + sinus * m_values[4];
00224 m_values[1] = cosinus * m1 + sinus * m_values[5];
00225 m_values[2] = cosinus * m2 + sinus * m_values[6];
00226 m_values[3] = cosinus * m3 + sinus * m_values[7];
00227
00228 m_values[4] = cosinus * m_values[4] - sinus * m0;
00229 m_values[5] = cosinus * m_values[5] - sinus * m1;
00230 m_values[6] = cosinus * m_values[6] - sinus * m2;
00231 m_values[7] = cosinus * m_values[7] - sinus * m3;
00232 }
00233
00234
00235
00236
00237
00238
00239 void Matrix44::identity()
00240 {
00241
00242 memset(m_values, 0, 15 * sizeof(float));
00243
00244
00245 m_values[0] = m_values[5] = m_values[10] = m_values[15] = 1.0f;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255 void Matrix44::transpose()
00256 {
00257 *this = transposed();
00258 }
00259
00260 Matrix44 Matrix44::transposed()
00261 {
00262 Matrix44 result;
00263
00264 for(int i = 0; i < 4; i++)
00265 for(int j = 0; j < 4; j++)
00266 result.m_values[i * 4 + j] = m_values[j * 4 + i];
00267
00268 return result;
00269 }
00270
00271 void Matrix44::fill(float value)
00272 {
00273 for(int i = 0; i < 16; ++i)
00274 m_values[i] = value;
00275 }
00276
00277 void Matrix44::print()
00278 {
00279 for(int i = 0; i < 16; i++)
00280 {
00281 cout << m_values[i] << " ";
00282 if((i + 1) % 4 == 0)
00283 cout << endl;
00284 }
00285 cout << endl;
00286 }
Generated on Sun Aug 15 19:19:22 2004 for OpenCAL: Open Computer Animation Library by
1.3.8