00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #include "common.h"
00067
00068 #include <stdio.h>
00069 #include <math.h>
00070 #include "machine.h"
00071 #include "bu.h"
00072 #include "vmath.h"
00073 #include "bn.h"
00074 #include "anim.h"
00075
00076 #ifndef M_PI
00077 #define M_PI 3.14159265358979323846
00078 #endif
00079
00080 #define NORMAL 0
00081 #define ERROR1 1
00082 #define ERROR2 2
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 void anim_v_permute(mat_t m)
00107 {
00108 int i;
00109 fastf_t store;
00110
00111 for (i=0; i<9; i+=4){
00112 store = m[i];
00113 m[i] = -m[i+1];
00114 m[i+1] = m[i+2];
00115 m[i+2] = -store;
00116 }
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 void anim_v_unpermute(mat_t m)
00130 {
00131 int i;
00132 fastf_t store;
00133
00134 for (i=0; i<9; i+=4){
00135 store = m[i+2];
00136 m[i+2] = m[i+1];
00137 m[i+1] = -m[i];
00138 m[i] = -store;
00139 }
00140 }
00141
00142
00143 void anim_tran(mat_t m)
00144 {
00145 int i;
00146 fastf_t store;
00147 #if 1
00148
00149
00150
00151 int src[6];
00152 int dst[6];
00153
00154 src[0] = 1;
00155 src[1] = 2;
00156 src[2] = 3;
00157 src[3] = 6;
00158 src[4] = 7;
00159 src[5] = 11;
00160
00161 dst[0] = 4;
00162 dst[1] = 8;
00163 dst[2] = 12;
00164 dst[3] = 9;
00165 dst[4] = 13;
00166 dst[5] = 14;
00167 #else
00168 int src[] = { 1, 2, 3, 6, 7, 11 };
00169 int dst[] = { 4, 8, 12, 9, 13, 14};
00170 #endif
00171
00172 for (i=0; i<6; i++) {
00173 store = m[dst[i]];
00174 m[dst[i]] = m[src[i]];
00175 m[src[i]] = store;
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 int anim_mat2zyx(const mat_t viewrot, vect_t angle)
00192 {
00193 int i, return_value, id_x, id_z;
00194 fastf_t sin_x, sin_z, cos_x, cos_z, big_x, big_z;
00195 static fastf_t previous[3];
00196
00197 if ((viewrot[1]==0.0) && (viewrot[0]==0.0)){
00198 return_value = ERROR1;
00199 angle[0] = 0.0;
00200 angle[2] = atan2(viewrot[4],viewrot[5]);
00201
00202 }
00203 else {
00204 return_value = NORMAL;
00205 angle[2] = atan2(-viewrot[1],viewrot[0]);
00206 angle[0] = atan2(-viewrot[6],viewrot[10]);
00207 }
00208
00209 sin_x = sin(angle[0]);
00210 sin_z = sin(angle[2]);
00211 cos_x = cos(angle[0]);
00212 cos_z = cos(angle[2]);
00213
00214
00215
00216
00217
00218
00219
00220 id_z = (fabs(sin_z) > fabs(cos_z)) ? 1 : 0;
00221 big_z = id_z ? sin_z : cos_z;
00222 id_x = (fabs(sin_x) > fabs(cos_x)) ? 1 : 0;
00223 big_x = id_x ? sin_x : cos_x;
00224
00225 if (fabs(big_x*big_z) < VDIVIDE_TOL){
00226
00227 return(ERROR2);
00228 }
00229 else if ( id_x && (!id_z) )
00230 angle[1]=atan2( (viewrot[4] - cos_x*sin_z)/(sin_x*cos_z), -viewrot[6]/sin_x);
00231 else if ( (!id_x) && (!id_z) )
00232 angle[1]=atan2( (-viewrot[8] + sin_x*sin_z)/(cos_x*cos_z), viewrot[0]/cos_z);
00233 else if ( id_x && id_z )
00234 angle[1]=atan2( (-viewrot[5] + cos_x*cos_z)/(sin_x*sin_z), -viewrot[1]/sin_z);
00235 else if ( (!id_x) && id_z )
00236 angle[1]=atan2( (viewrot[9] - sin_x*cos_z)/(cos_x*sin_z), viewrot[10]/cos_x);
00237
00238
00239
00240 for (i=0; i<3; i++) {
00241 while ((angle[i] - previous[i]) > M_PI)
00242 angle[i] -= (2.0*M_PI);
00243 while ((previous[i] - angle[i]) > M_PI)
00244 angle[i] += (2.0*M_PI);
00245 previous[i] = angle[i];
00246 }
00247
00248 return(return_value);
00249 }
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 int anim_mat2ypr(mat_t viewrot, vect_t angle)
00261 {
00262 int i, return_value, id_y, id_r;
00263 fastf_t sin_y, sin_r, cos_y, cos_r, big_y, big_r;
00264 static fastf_t prev_angle[3];
00265
00266 if ((viewrot[9]==0.0) && (viewrot[10]==0.0)){
00267 return_value = ERROR1;
00268 angle[2] = 0.0;
00269 angle[0] = atan2(-viewrot[1],viewrot[5]);
00270
00271 }
00272 else {
00273 return_value = NORMAL;
00274 angle[0] = atan2(viewrot[4],viewrot[0]);
00275 angle[2] = atan2(viewrot[9],viewrot[10]);
00276 }
00277
00278 sin_y = sin(angle[0]);
00279 sin_r = sin(angle[2]);
00280 cos_y = cos(angle[0]);
00281 cos_r = cos(angle[2]);
00282
00283
00284
00285
00286
00287
00288
00289 id_y = (fabs(sin_y) > fabs(cos_y)) ? 1 : 0;
00290 big_y = id_y ? sin_y : cos_y;
00291 id_r = (fabs(sin_r) > fabs(cos_r)) ? 1 : 0;
00292 big_r = id_r ? sin_r : cos_r;
00293
00294 if (fabs(big_y*big_r) < VDIVIDE_TOL){
00295
00296 return(ERROR2);
00297 }
00298 else if ( (!id_y) && id_r )
00299 angle[1] = atan2( -(viewrot[1]+sin_y*cos_r)/(cos_y*sin_r),viewrot[9]/sin_r);
00300 else if ( id_y && (!id_r) )
00301 angle[1] = atan2( -(viewrot[6]+cos_y*sin_r)/(sin_y*cos_r),viewrot[10]/cos_r);
00302 else if ( id_y && id_r )
00303 angle[1] = atan2( -(viewrot[5]-cos_y*cos_r)/(sin_y*sin_r),viewrot[4]/sin_y);
00304 else if ( (!id_y) && (!id_r) )
00305 angle[1] = atan2( -(viewrot[2]-sin_y*sin_r)/(cos_y*cos_r),viewrot[0]/cos_y);
00306
00307
00308
00309 for (i=0; i<3; i++) {
00310 while ((angle[i] - prev_angle[i]) > M_PI)
00311 angle[i] -= (2.0*M_PI);
00312 while ((prev_angle[i] - angle[i]) > M_PI)
00313 angle[i] += (2.0*M_PI);
00314 prev_angle[i] = angle[i];
00315 }
00316
00317 return(return_value);
00318 }
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 int anim_mat2quat(quat_t quat, const mat_t viewrot)
00329 {
00330 int i;
00331 fastf_t qdiff[4], square, mag1, mag2;
00332 static fastf_t prev_quat[4];
00333
00334 square = 0.25 * (1 + viewrot[0] + viewrot[5] + viewrot[10]);
00335 if ( square != 0.0 ) {
00336 quat[W] = sqrt(square);
00337 quat[X] = 0.25 * (viewrot[9] - viewrot[6])/ quat[W];
00338 quat[Y] = 0.25 * (viewrot[2] - viewrot[8])/ quat[W];
00339 quat[Z] = 0.25 * (viewrot[4] - viewrot[1])/ quat[W];
00340 }
00341 else {
00342 quat[W] = 0.0;
00343 square = -0.5 * (viewrot[5] + viewrot[10]);
00344 if (square != 0.0 ) {
00345 quat[X] = sqrt(square);
00346 quat[Y] = 0.5 * viewrot[4] / quat[X];
00347 quat[Z] = 0.5 * viewrot[8] / quat[X];
00348 }
00349 else {
00350 quat[X] = 0.0;
00351 square = 0.5 * (1 - viewrot[10]);
00352 if (square != 0.0){
00353 quat[Y] = sqrt(square);
00354 quat[Z] = 0.5 * viewrot[9]/ quat[Y];
00355 }
00356 else {
00357 quat[Y] = 0.0;
00358 quat[Z] = 1.0;
00359 }
00360 }
00361 }
00362
00363
00364
00365
00366
00367 for (i=0; i<4; i++)
00368 qdiff[i] = prev_quat[i] - quat[i];
00369 mag1 = QMAGSQ(qdiff);
00370 for (i=0; i<4; i++)
00371 qdiff[i] = prev_quat[i] + quat[i];
00372 mag2 = QMAGSQ(qdiff);
00373
00374 for (i=0; i<4; i++) {
00375 if (mag1 > mag2)
00376 quat[i] = -quat[i];
00377 prev_quat[i] = quat[i];
00378 }
00379
00380 return(1);
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 void anim_ypr2mat(mat_t m, const vect_t a)
00393 {
00394 fastf_t cos_y,cos_p,cos_r,sin_y,sin_p,sin_r;
00395
00396 cos_y = cos(a[0]);
00397 cos_p = cos(a[1]);
00398 cos_r = cos(a[2]);
00399 sin_y = sin(a[0]);
00400 sin_p = sin(a[1]);
00401 sin_r = sin(a[2]);
00402
00403 m[0] = cos_y*cos_p;
00404 m[1] = -cos_y*sin_p*sin_r-sin_y*cos_r;
00405 m[2] = -cos_y*sin_p*cos_r+sin_y*sin_r;
00406 m[3] = 0;
00407 m[4] = sin_y*cos_p;
00408 m[5] = -sin_y*sin_p*sin_r+cos_y*cos_r;
00409 m[6] = -sin_y*sin_p*cos_r-cos_y*sin_r;
00410 m[7] = 0;
00411 m[8]= sin_p;
00412 m[9] = cos_p*sin_r;
00413 m[10] = cos_p*cos_r;
00414 m[11] = 0.0;
00415 m[12] = 0.0;
00416 m[13] = 0.0;
00417 m[14] = 0.0;
00418 m[15] = 1.0;
00419 }
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 void anim_ypr2vmat(mat_t m, const vect_t a)
00433 {
00434 fastf_t cos_y,cos_p,cos_r,sin_y,sin_p,sin_r;
00435
00436 cos_y = cos(a[0]);
00437 cos_p = cos(a[1]);
00438 cos_r = cos(a[2]);
00439 sin_y = sin(a[0]);
00440 sin_p = sin(a[1]);
00441 sin_r = sin(a[2]);
00442
00443 m[0] = -cos_y*sin_p*sin_r-sin_y*cos_r;
00444 m[1] = -sin_y*sin_p*sin_r+cos_y*cos_r;
00445 m[2] = cos_p*sin_r;
00446 m[3] = 0;
00447 m[4] = -cos_y*sin_p*cos_r+sin_y*sin_r;
00448 m[5] = -sin_y*sin_p*cos_r-cos_y*sin_r;
00449 m[6] = cos_p*cos_r;
00450 m[7] = 0;
00451 m[8] = cos_y*cos_p;
00452 m[9] = sin_y*cos_p;
00453 m[10] = sin_p;
00454 m[11] = 0.0;
00455 m[12] = 0.0;
00456 m[13] = 0.0;
00457 m[14] = 0.0;
00458 m[15] = 1.0;
00459 }
00460
00461
00462
00463
00464
00465
00466 void anim_y_p_r2mat(mat_t m, double y, double p, double r)
00467 {
00468 fastf_t cos_y = cos(y);
00469 fastf_t sin_y = sin(y);
00470 fastf_t cos_p = cos(p);
00471 fastf_t sin_p = sin(p);
00472 fastf_t cos_r = cos(r);
00473 fastf_t sin_r = sin(r);
00474
00475 m[0] = cos_y*cos_p;
00476 m[1] = -cos_y*sin_p*sin_r-sin_y*cos_r;
00477 m[2] = -cos_y*sin_p*cos_r+sin_y*sin_r;
00478 m[4] = sin_y*cos_p;
00479 m[5] = -sin_y*sin_p*sin_r+cos_y*cos_r;
00480 m[6] = -sin_y*sin_p*cos_r-cos_y*sin_r;
00481 m[8]= sin_p;
00482 m[9] = cos_p*sin_r;
00483 m[10] = cos_p*cos_r;
00484 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0;
00485 m[15]=1;
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495 void anim_dy_p_r2mat(mat_t m, double y, double p, double r)
00496 {
00497 fastf_t radian_yaw = y*(M_PI*0.0055555555556);
00498 fastf_t radian_pitch = p*(M_PI*0.0055555555556);
00499 fastf_t radian_roll = r*(M_PI*0.0055555555556);
00500
00501 fastf_t cos_y = cos(radian_yaw);
00502 fastf_t sin_y = sin(radian_yaw);
00503 fastf_t cos_p = cos(radian_pitch);
00504 fastf_t sin_p = sin(radian_pitch);
00505 fastf_t cos_r = cos(radian_roll);
00506 fastf_t sin_r = sin(radian_roll);
00507
00508 m[0] = cos_y*cos_p;
00509 m[1] = -cos_y*sin_p*sin_r-sin_y*cos_r;
00510 m[2] = -cos_y*sin_p*cos_r+sin_y*sin_r;
00511 m[4] = sin_y*cos_p;
00512 m[5] = -sin_y*sin_p*sin_r+cos_y*cos_r;
00513 m[6] = -sin_y*sin_p*cos_r-cos_y*sin_r;
00514 m[8]= sin_p;
00515 m[9] = cos_p*sin_r;
00516 m[10] = cos_p*cos_r;
00517 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0;
00518 m[15]=1;
00519 }
00520
00521
00522
00523
00524
00525
00526
00527 void anim_dy_p_r2vmat(mat_t m, double yaw, double pch, double rll)
00528 {
00529
00530 float ryaw = yaw*(M_PI*0.0055555555556);
00531 float rpch = pch*(M_PI*0.0055555555556);
00532 float rrll = rll*(M_PI*0.0055555555556);
00533
00534 float cos_y = cos(ryaw);
00535 float sin_y = sin(ryaw);
00536 float cos_p = cos(rpch);
00537 float sin_p = sin(rpch);
00538 float cos_r = cos(rrll);
00539 float sin_r = sin(rrll);
00540
00541 m[0] = -cos_y*sin_p*sin_r-sin_y*cos_r;
00542 m[1] = -sin_y*sin_p*sin_r+cos_y*cos_r;
00543 m[2] = cos_p*sin_r;
00544 m[4] = -cos_y*sin_p*cos_r+sin_y*sin_r;
00545 m[5] = -sin_y*sin_p*cos_r-cos_y*sin_r;
00546 m[6] = cos_p*cos_r;
00547 m[8] = cos_y*cos_p;
00548 m[9] = sin_y*cos_p;
00549 m[10]= sin_p;
00550 m[3]=m[7]=m[11]=0;
00551 m[12]=m[13]=m[14]=0;
00552 m[15]=1;
00553
00554 }
00555
00556
00557
00558
00559
00560
00561 void anim_x_y_z2mat(mat_t m, double x, double y, double z)
00562 {
00563 fastf_t cosx = cos(x);
00564 fastf_t sinx = sin(x);
00565 fastf_t cosy = cos(y);
00566 fastf_t siny = sin(y);
00567 fastf_t cosz = cos(z);
00568 fastf_t sinz = sin(z);
00569
00570 m[0] = cosz*cosy;
00571 m[1] = cosz*siny*sinx-sinz*cosx;
00572 m[2] = cosz*siny*cosx+sinz*sinx;
00573 m[4] = sinz*cosy;
00574 m[5] = sinz*siny*sinx+cosz*cosx;
00575 m[6] = sinz*siny*cosx-cosz*sinx;
00576 m[8] = -siny;
00577 m[9] = cosy*sinx;
00578 m[10] = cosy*cosx;
00579 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0;
00580 m[15]=1;
00581 }
00582
00583
00584
00585
00586
00587
00588
00589
00590 void anim_dx_y_z2mat(mat_t m, double x, double y, double z)
00591 {
00592 fastf_t cosx,cosy,cosz,sinx,siny,sinz;
00593
00594 x *= (M_PI*0.0055555555556);
00595 y *= (M_PI*0.0055555555556);
00596 z *= (M_PI*0.0055555555556);
00597
00598 cosx = cos(x);
00599 sinx = sin(x);
00600 cosy = cos(y);
00601 siny = sin(y);
00602 cosz = cos(z);
00603 sinz = sin(z);
00604
00605 m[0] = cosz*cosy;
00606 m[1] = cosz*siny*sinx-sinz*cosx;
00607 m[2] = cosz*siny*cosx+sinz*sinx;
00608 m[4] = sinz*cosy;
00609 m[5] = sinz*siny*sinx+cosz*cosx;
00610 m[6] = sinz*siny*cosx-cosz*sinx;
00611 m[8] = -siny;
00612 m[9] = cosy*sinx;
00613 m[10] = cosy*cosx;
00614 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0.0;
00615 m[15]=1.0;
00616 }
00617
00618
00619
00620
00621
00622 void anim_zyx2mat(mat_t m, const vect_t a)
00623 {
00624 fastf_t cosX,cosY,cosZ,sinX,sinY,sinZ;
00625
00626 cosX = cos(a[0]);
00627 cosY = cos(a[1]);
00628 cosZ = cos(a[2]);
00629 sinX = sin(a[0]);
00630 sinY = sin(a[1]);
00631 sinZ = sin(a[2]);
00632
00633 m[0] = cosY*cosZ;
00634 m[1] = -cosY*sinZ;
00635 m[2] = sinY;
00636 m[3] = 0;
00637 m[4] = cosX*sinZ + sinX*sinY*cosZ;
00638 m[5] = cosX*cosZ - sinX*sinY*sinZ;
00639 m[6] = -sinX*cosY;
00640 m[7] = 0;
00641 m[8] = sinX*sinZ - cosX*sinY*cosZ;
00642 m[9] = sinX*cosZ + cosX*sinY*sinZ;
00643 m[10] = cosX*cosY;
00644 m[11] = 0.0;
00645 m[12] = 0.0;
00646 m[13] = 0.0;
00647 m[14] = 0.0;
00648 m[15] = 1.0;
00649
00650 }
00651
00652
00653
00654
00655
00656 void anim_z_y_x2mat(mat_t m, double x, double y, double z)
00657 {
00658 fastf_t cosx = cos(x);
00659 fastf_t sinx = sin(x);
00660 fastf_t cosy = cos(y);
00661 fastf_t siny = sin(y);
00662 fastf_t cosz = cos(z);
00663 fastf_t sinz = sin(z);
00664
00665 m[0] = cosy*cosz;
00666 m[1] = -cosy*sinz;
00667 m[2] = siny;
00668 m[4] = cosx*sinz + sinx*siny*cosz;
00669 m[5] = cosx*cosz - sinx*siny*sinz;
00670 m[6] = -sinx*cosy;
00671 m[8] = sinx*sinz - cosx*siny*cosz;
00672 m[9] = sinx*cosz + cosx*siny*sinz;
00673 m[10]= cosx*cosy;
00674 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0.0;
00675 m[15]=1.0;
00676 }
00677
00678
00679
00680
00681
00682
00683
00684
00685 void anim_dz_y_x2mat(mat_t m, double x, double y, double z)
00686 {
00687 fastf_t cosx,cosy,cosz,sinx,siny,sinz;
00688
00689 x *= (M_PI*0.0055555555556);
00690 y *= (M_PI*0.0055555555556);
00691 z *= (M_PI*0.0055555555556);
00692
00693 cosx = cos(x);
00694 sinx = sin(x);
00695 cosy = cos(y);
00696 siny = sin(y);
00697 cosz = cos(z);
00698 sinz = sin(z);
00699
00700 m[0] = cosy*cosz;
00701 m[1] = -cosy*sinz;
00702 m[2] = siny;
00703 m[4] = cosx*sinz + sinx*siny*cosz;
00704 m[5] = cosx*cosz - sinx*siny*sinz;
00705 m[6] = -sinx*cosy;
00706 m[8] = sinx*sinz - cosx*siny*cosz;
00707 m[9] = sinx*cosz + cosx*siny*sinz;
00708 m[10]= cosx*cosy;
00709 m[3]=m[7]=m[11]=m[12]=m[13]=m[14]=0;
00710 m[15]=1;
00711 }
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 void anim_quat2mat(mat_t m, const quat_t qq)
00722 {
00723 fastf_t two_q[4];
00724 quat_t q;
00725
00726 QMOVE(q, qq);
00727 QUNITIZE(q);
00728
00729 VADD2N(two_q,q,q,4);
00730
00731 m[0] = 1.0 - two_q[Y]*q[Y] - two_q[Z]*q[Z];
00732 m[1] = two_q[X]*q[Y] - two_q[W]*q[Z];
00733 m[2] = two_q[X]*q[Z] + two_q[W]*q[Y];
00734 m[3] = 0.0;
00735 m[4] = two_q[X]*q[Y] + two_q[W]*q[Z];
00736 m[5] = 1.0 - two_q[X]*q[X] - two_q[Z]*q[Z];
00737 m[6] = two_q[Y]*q[Z] - two_q[W]*q[X];
00738 m[7] = 0.0;
00739 m[8] = two_q[X]*q[Z] - two_q[W]*q[Y];
00740 m[9] = two_q[Y]*q[Z] + two_q[W]*q[X];
00741 m[10] = 1.0 - two_q[X]*q[X] - two_q[Y]*q[Y];
00742 m[11] = 0.0;
00743 m[12] = 0.0;
00744 m[13] = 0.0;
00745 m[14] = 0.0;
00746 m[15] = 1.0;
00747 }
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 void anim_dir2mat(mat_t m, const vect_t d, const vect_t d2b)
00760 {
00761 fastf_t hypotenuse, sign;
00762 vect_t d2;
00763
00764 VMOVE( d2, d2b );
00765 sign = 1.0;
00766 hypotenuse = sqrt(d[0]*d[0]+d[1]*d[1]);
00767 if (hypotenuse < VDIVIDE_TOL){
00768
00769 hypotenuse = sqrt(d2[0]*d2[0]+d2[1]*d2[1]);
00770 if (hypotenuse < VDIVIDE_TOL){
00771 VSET(d2,1,0,0);
00772 hypotenuse = 1;
00773 }
00774 if (d[2] < 0)
00775 sign = -1.0;
00776 m[1] = -d2[1]/hypotenuse;
00777 m[5] = d2[0]/hypotenuse;
00778 m[2] = -sign * d2[0]/hypotenuse;
00779 m[6] = -sign * d2[1]/hypotenuse;
00780 m[8] = sign;
00781 m[0]=m[4]=m[9]=m[10]=0.0;
00782 }
00783 else {
00784 m[0] = d[0];
00785 m[1] = -d[1]/hypotenuse;
00786 m[2] = -d[0]*d[2]/hypotenuse;
00787 m[4] = d[1];
00788 m[5] = d[0]/hypotenuse;
00789 m[6] = -d[1]*d[2]/hypotenuse;
00790 m[8] = d[2];
00791 m[9] = 0.0;
00792 m[10] = hypotenuse;
00793 }
00794 m[3]=m[7]=m[11]=0.0;
00795 m[12]=m[13]=m[14]=0.0;
00796 m[15]=1.0;
00797
00798 }
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809 void anim_dirn2mat(mat_t m, const vect_t dx2, const vect_t dn)
00810 {
00811 vect_t temp;
00812 fastf_t hyp, sign,inv,mag;
00813 vect_t dx;
00814
00815 VMOVE( dx, dx2 );
00816 sign = 1.0;
00817 mag = MAGNITUDE(dx);
00818 if (mag < VDIVIDE_TOL) {
00819 bu_log("anim_dirn2mat: Need non-zero vector");
00820 return;
00821 }
00822 inv = 1.0/mag;
00823 dx[0] *= inv;
00824 dx[1] *= inv;
00825 dx[2] *= inv;
00826 hyp = sqrt(dx[0]*dx[0]+dx[1]*dx[1]);
00827 if (hyp < VDIVIDE_TOL) {
00828 sign = (dx[2] < 0) ? -1.0 : 1.0;
00829 VSET(temp, dn[0], dn[1], 0.0);
00830 mag = MAGNITUDE(temp);
00831 if (mag < VDIVIDE_TOL) {
00832
00833 VSET(temp, 0.0, 1.0, 0.0);
00834 mag = 1.0;
00835 } else {
00836 inv = 1.0/mag;
00837 temp[0] *= inv;
00838 temp[1] *= inv;
00839 }
00840 m[0] = 0.0;
00841 m[4] = 0.0;
00842 m[8] = sign;
00843 m[1] = temp[0];
00844 m[5] = temp[1];
00845 m[9] = 0.0;
00846 m[2] = -sign*temp[1];
00847 m[6] = sign*temp[0];
00848 m[10] = 0.0;
00849 m[3]=m[7]=m[11]=0.0;
00850 m[12]=m[13]=m[14]=0.0;
00851 m[15]=1.0;
00852 return;
00853 }
00854
00855
00856 m[0] = dx[0];
00857 m[1] = -dx[1]/hyp;
00858 m[2] = -dx[0]*dx[2]/hyp;
00859 m[4] = dx[1];
00860 m[5] = dx[0]/hyp;
00861 m[6] = -dx[1]*dx[2]/hyp;
00862 m[8] = dx[2];
00863 m[9] = 0.0;
00864 m[10] = hyp;
00865 m[3]=m[7]=m[11]=0.0;
00866 m[12]=m[13]=m[14]=0.0;
00867 m[15]=1.0;
00868
00869 }
00870
00871
00872
00873 #define ASM_EMPTY 0
00874 #define ASM_FIRST 1
00875 #define ASM_FULL 2
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885 int anim_steer_mat(mat_t mat, vect_t point, int end)
00886 {
00887 static vect_t p1, p2, p3;
00888 vect_t dir;
00889 static vect_t norm;
00890 static int state = ASM_EMPTY;
00891
00892 VMOVE(p1,p2);
00893 VMOVE(p2,p3);
00894 VMOVE(p3,point);
00895
00896 switch(state) {
00897 case ASM_EMPTY:
00898 if (end) {
00899 state = ASM_EMPTY;
00900 } else {
00901 state = ASM_FIRST;
00902
00903 }
00904 return 0;
00905 case ASM_FIRST:
00906 if (end) {
00907
00908 VSET(dir,1.0,0.0,0.0);
00909 VSET(norm,0.0,1.0,0.0);
00910 state = ASM_EMPTY;
00911 } else {
00912 VSUBUNIT(dir,p3,p2);
00913 VSET(norm, 0.0, 1.0, 0.0);
00914 state = ASM_FULL;
00915 }
00916 break;
00917 case ASM_FULL:
00918 if (end) {
00919 VSUBUNIT(dir,p2,p1);
00920 state = ASM_EMPTY;
00921 } else {
00922 VSUBUNIT(dir,p3,p1);
00923 state = ASM_FULL;
00924 }
00925 }
00926
00927
00928 anim_dirn2mat(mat,dir,norm);
00929 VSET(norm, mat[1], mat[5], 0.0);
00930 VMOVE(point,p2);
00931 return(1);
00932
00933 }
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947 void anim_add_trans(mat_t m, const vect_t post, const vect_t pre)
00948 {
00949 int i;
00950 for (i=0; i<3; i++)
00951 m[3+i*4] += m[i*4]*pre[0] + m[1+i*4]*pre[1]+m[2+i*4]*pre[2] + post[i];
00952
00953 }
00954
00955
00956
00957
00958
00959 void anim_rotatez(fastf_t a, vect_t d)
00960 {
00961 fastf_t temp[3];
00962 fastf_t cos_y = cos(a);
00963 fastf_t sin_y = sin(a);
00964 temp[0] = d[0]*cos_y - d[1]*sin_y;
00965 temp[1] = d[0]*sin_y + d[1]*cos_y;
00966 d[0]=temp[0];
00967 d[1]=temp[1];
00968 }
00969
00970
00971
00972
00973
00974 void anim_mat_print(FILE *fp, const mat_t m, int s_colon)
00975 {
00976 bu_flog( fp,"%.10g %.10g %.10g %.10g\n", m[0], m[1], m[2], m[3]);
00977 bu_flog( fp,"%.10g %.10g %.10g %.10g\n", m[4], m[5], m[6], m[7]);
00978 bu_flog( fp,"%.10g %.10g %.10g %.10g\n", m[8], m[9], m[10], m[11]);
00979 bu_flog( fp,"%.10g %.10g %.10g %.10g", m[12], m[13], m[14], m[15]);
00980 if (s_colon)
00981 bu_flog( fp,";");
00982 bu_flog( fp,"\n");
00983 }
00984
00985
00986
00987
00988
00989
00990
00991
00992 void anim_mat_printf(
00993 FILE *fp,
00994 const mat_t m,
00995 const char *formstr,
00996 const char *linestr,
00997 const char *endstr)
00998 {
00999 char mystr[80];
01000 sprintf(mystr,"%s%s%s%s%%s",formstr,formstr,formstr,formstr);
01001 bu_flog( fp,mystr, m[0], m[1], m[2], m[3], linestr);
01002 bu_flog( fp,mystr, m[4], m[5], m[6], m[7], linestr);
01003 bu_flog( fp,mystr, m[8], m[9], m[10], m[11], linestr);
01004 bu_flog( fp,mystr, m[12], m[13], m[14], m[15], endstr);
01005 }
01006
01007
01008
01009
01010
01011
01012 void anim_view_rev(mat_t m)
01013 {
01014 m[0] = -m[0];
01015 m[1] = -m[1];
01016 m[4] = -m[4];
01017 m[5] = -m[5];
01018 m[8] = -m[8];
01019 m[9] = -m[9];
01020 }
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030