00001
00002
00003
00004
00005
00006
00007
00049
00050
00051
00052
00053 #include <math.h>
00054 #include "t3d.h"
00055
00056
00057
00058
00059
00062 double T3d::mt[4][4] =
00063 {
00064 { 1.0, 0.0, 0.0, 0.0 } ,
00065 { 0.0, 1.0, 0.0, 0.0 } ,
00066 { 0.0, 0.0, 1.0, 0.0 } ,
00067 { 0.0, 0.0, 0.0, 1.0 }
00068 };
00069
00070
00071
00072
00073
00074
00075
00080 void T3d::Accumulate( double new_mt[4][4] )
00081 {
00082 double t0, t1, t2;
00083
00084 t0 = mt[0][0]*new_mt[0][0] + mt[1][0]*new_mt[0][1]
00085 + mt[2][0]*new_mt[0][2] + mt[3][0]*new_mt[0][3];
00086 t1 = mt[0][0]*new_mt[1][0] + mt[1][0]*new_mt[1][1]
00087 + mt[2][0]*new_mt[1][2] + mt[3][0]*new_mt[1][3];
00088 t2 = mt[0][0]*new_mt[2][0] + mt[1][0]*new_mt[2][1]
00089 + mt[2][0]*new_mt[2][2] + mt[3][0]*new_mt[2][3];
00090 mt[3][0] = mt[0][0]*new_mt[3][0] + mt[1][0]*new_mt[3][1]
00091 + mt[2][0]*new_mt[3][2] + mt[3][0]*new_mt[3][3];
00092 mt[2][0] = t2;
00093 mt[1][0] = t1;
00094 mt[0][0] = t0;
00095
00096 t0 = mt[0][1]*new_mt[0][0] + mt[1][1]*new_mt[0][1]
00097 + mt[2][1]*new_mt[0][2] + mt[3][1]*new_mt[0][3];
00098 t1 = mt[0][1]*new_mt[1][0] + mt[1][1]*new_mt[1][1]
00099 + mt[2][1]*new_mt[1][2] + mt[3][1]*new_mt[1][3];
00100 t2 = mt[0][1]*new_mt[2][0] + mt[1][1]*new_mt[2][1]
00101 + mt[2][1]*new_mt[2][2] + mt[3][1]*new_mt[2][3];
00102 mt[3][1] = mt[0][1]*new_mt[3][0] + mt[1][1]*new_mt[3][1]
00103 + mt[2][1]*new_mt[3][2] + mt[3][1]*new_mt[3][3];
00104 mt[2][1] = t2;
00105 mt[1][1] = t1;
00106 mt[0][1] = t0;
00107
00108 t0 = mt[0][2]*new_mt[0][0] + mt[1][2]*new_mt[0][1]
00109 + mt[2][2]*new_mt[0][2] + mt[3][2]*new_mt[0][3];
00110 t1 = mt[0][2]*new_mt[1][0] + mt[1][2]*new_mt[1][1]
00111 + mt[2][2]*new_mt[1][2] + mt[3][2]*new_mt[1][3];
00112 t2 = mt[0][2]*new_mt[2][0] + mt[1][2]*new_mt[2][1]
00113 + mt[2][2]*new_mt[2][2] + mt[3][2]*new_mt[2][3];
00114 mt[3][2] = mt[0][2]*new_mt[3][0] + mt[1][2]*new_mt[3][1]
00115 + mt[2][2]*new_mt[3][2] + mt[3][2]*new_mt[3][3];
00116 mt[2][2] = t2;
00117 mt[1][2] = t1;
00118 mt[0][2] = t0;
00119
00120 t0 = mt[0][3]*new_mt[0][0] + mt[1][3]*new_mt[0][1]
00121 + mt[2][3]*new_mt[0][2] + mt[3][3]*new_mt[0][3];
00122 t1 = mt[0][3]*new_mt[1][0] + mt[1][3]*new_mt[1][1]
00123 + mt[2][3]*new_mt[1][2] + mt[3][3]*new_mt[1][3];
00124 t2 = mt[0][3]*new_mt[2][0] + mt[1][3]*new_mt[2][1]
00125 + mt[2][3]*new_mt[2][2] + mt[3][3]*new_mt[2][3];
00126 mt[3][3] = mt[0][3]*new_mt[3][0] + mt[1][3]*new_mt[3][1]
00127 + mt[2][3]*new_mt[3][2] + mt[3][3]*new_mt[3][3];
00128 mt[2][3] = t2;
00129 mt[1][3] = t1;
00130 mt[0][3] = t0;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139 void T3d::Transform( double* x, double* y, double* z )
00140 {
00141 double r, s, t, h;
00142
00143 r = mt[0][0]*(*x)+mt[0][1]*(*y)+mt[0][2]*(*z)+mt[0][3];
00144 s = mt[1][0]*(*x)+mt[1][1]*(*y)+mt[1][2]*(*z)+mt[1][3];
00145 t = mt[2][0]*(*x)+mt[2][1]*(*y)+mt[2][2]*(*z)+mt[2][3];
00146 h = mt[3][0]*(*x)+mt[3][1]*(*y)+mt[3][2]*(*z)+mt[3][3];
00147 *x = r/h;
00148 *y = s/h;
00149 *z = t/h;
00150 }
00151
00152
00153
00154 void T3d::Identity( void )
00155 {
00156 mt[0][0] = 1.0; mt[0][1] = 0.0; mt[0][2] = 0.0; mt[0][3] = 0.0;
00157 mt[1][0] = 0.0; mt[1][1] = 1.0; mt[1][2] = 0.0; mt[1][3] = 0.0;
00158 mt[2][0] = 0.0; mt[2][1] = 0.0; mt[2][2] = 1.0; mt[2][3] = 0.0;
00159 mt[3][0] = 0.0; mt[3][1] = 0.0; mt[3][2] = 0.0; mt[3][3] = 1.0;
00160 }
00161
00162
00163
00164 void T3d::Scale( double sx, double sy, double sz )
00165 {
00166 double scale[4][4];
00167
00168
00169
00170
00171
00172
00173
00174
00175 Accumulate( scale );
00176 }
00177
00178
00179
00180 void T3d::Translate( double tx, double ty, double tz )
00181 {
00182 double trans[4][4];
00183
00184
00185
00186
00187
00188
00189
00190
00191 Accumulate( trans );
00192 }
00193
00194
00195
00196 void T3d::RotateBasis( double ux, double uy, double uz,
00197 double vx, double vy, double vz,
00198 double wx, double wy, double wz )
00199 {
00200 double rot[4][4];
00201
00202
00203
00204
00205
00206
00207
00208
00209 Accumulate( rot );
00210 }
00211
00212
00213
00214 void T3d::Camera( double eyex, double eyey, double eyez,
00215 double refx, double refy, double refz,
00216 double vupx, double vupy, double vupz )
00217 {
00218 Vec view, upvec;
00219 Vec u, v, w;
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 }
00256
00257
00258
00259 void T3d::Perspective( double d, double front, double back )
00260 {
00261 double alpha, beta;
00262 double pers[4][4];
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 Accumulate( pers );
00277 }
00278
00279
00280
00281 void T3d::NormalizeView( double left, double right,
00282 double bottom, double top,
00283 double front, double back )
00284 {
00285 double tx, ty, tz;
00286 double sx, sy, sz;
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 }
00318