Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

Matrix44.cpp

00001 /*************************************************************************** 00002 * This file is part of OpenCAL: Open Computer Animation Library * 00003 * I created OpenCAL as my master's thesis Computer Science (multimedia) * 00004 * at the tUL university in Diepenbeek, Belgium * 00005 * * 00006 * Copyright (C) 2003-2004 by Jeroen Dierckx * 00007 * jeroen.dierckx@student.luc.ac.be * 00008 * * 00009 ***************************************************************************/ 00010 00011 // Includes 00012 #include "Matrix44.h" 00013 using namespace OpenCAL::Utils; 00014 00015 #include <math.h> 00016 00017 using namespace std; 00018 00019 00020 // Static members 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 * Constructors and destructor * 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 * Get and set functions * 00054 ************************/ 00055 00056 void Matrix44::set(float *values) 00057 { 00058 memcpy(m_values, values, 16 * sizeof(float)); 00059 } 00060 00061 /********************* 00062 * Operator functions * 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 // Friend functions 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 * Transform functions * 00149 **********************/ 00150 00151 void Matrix44::translate(const Vector3 &translation) 00152 { 00153 /* 00154 float x = translation.getX(); 00155 float y = translation.getY(); 00156 float z = translation.getZ(); 00157 00158 m_values[12] += x * m_values[0] + y * m_values[4] + z * m_values[8]; 00159 m_values[13] += x * m_values[1] + y * m_values[5] + z * m_values[9]; 00160 m_values[14] += x * m_values[2] + y * m_values[6] + z * m_values[10]; 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 * Other functions * 00237 ******************/ 00238 00239 void Matrix44::identity() 00240 { 00241 // We don't need to zero out the last value, because it will be 1 later (one tiny bit faster :-D) 00242 memset(m_values, 0, 15 * sizeof(float)); 00243 00244 // Set the diagonal values to 1 00245 m_values[0] = m_values[5] = m_values[10] = m_values[15] = 1.0f; 00246 } 00247 00248 /* 00249 void Matrix44::zero() 00250 { 00251 memset(m_values, 0, 16 * sizeof(float)); 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 doxygen 1.3.8