muscle.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* ==========================================================================
  2.                                MUSCLE_C
  3. =============================================================================
  4.     FUNCTION NAMES
  5.     float VecLen  -- calculates a vector length.
  6.     float CosAng  -- compute the cosine angle between two vectors.
  7.     activate_muscle     -- activate a muscle.
  8.     act_muscles  -- activate muscles.
  9.     reset_muscles  -- reset all the muscles.
  10.     C SPECIFICATIONS
  11.     float VecLen  ( float *v )
  12.     float CosAng  ( float *v1, float *v2 )
  13.     activate_muscle  ( HEAD *face, float *vt, float *vh, 
  14.                           float fstart, float fin, float ang, float val )
  15.     act_muscles  ( HEAD *face ) 
  16.     reset_muscles  ( HEAD *face ) 
  17.     DESCRIPTION
  18. This module is where all the muscle action takes place.  This module 
  19. comes as is with no warranties.  
  20.     SIDE EFFECTS
  21. Unknown.
  22.    
  23.     HISTORY
  24. Created 16-Dec-94  Keith Waters at DEC's Cambridge Research Lab.
  25. ============================================================================ */
  26. #include <math.h>
  27. #include <stdio.h>
  28. #include "head.h"
  29. #ifdef _WIN32
  30. #pragma warning (disable:4244) /* Disable bogus conversion warnings. */
  31. #pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
  32. #endif
  33. /* Some <math.h> files do not define M_PI... */
  34. #ifndef M_PI
  35. #define M_PI 3.14159265358979323846
  36. #endif
  37. #define DTOR(deg) ((deg)*0.017453292) /* degrees to radians   */
  38. #define RTOD(rad) ((rad)*57.29577951)   /* radians to degrees   */
  39. #define RADF 180.0 / M_PI 
  40. /* ======================================================================== */
  41. /* float VecLen ( vec )     */
  42. /* ======================================================================== */
  43. /*
  44. ** Caculates the length of the vector.
  45. */
  46. float VecLen ( float *v )
  47. {
  48.   return (float) sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
  49. }
  50. /* ======================================================================== */
  51. /* float CosAng ( v1, v2 )     */
  52. /* ======================================================================== */
  53. /*
  54. ** Rotates the facial muscles 90.0 degrees.
  55. */
  56. float CosAng ( float *v1, float *v2 )
  57. {
  58.   float ang, a,b ;
  59.   
  60.   a = VecLen ( v1 ) ;
  61.   b = VecLen ( v2 ) ;
  62.   ang = ((v1[0]*v2[0]) + (v1[1]*v2[1] ) + (v1[2]*v2[2])) / (a*b) ;
  63.   return ( ang ) ;
  64. }
  65. /* ======================================================================== */
  66. /* activate_muscle ( face, vt, vh, fstart, fin, ang, val )     */
  67. /* ======================================================================== */
  68. /*
  69. ** activate the muscle.
  70. */
  71. void
  72. activate_muscle (HEAD *face, float *vt, float *vh, float fstart,  float fin,  float ang,  float val)
  73. {
  74.   float newp[3], va[3], vb[3] ;
  75.   int i,j,k,l ;
  76.   float valen, vblen ;
  77.   float cosa, cosv, dif, tot, percent, thet, newv, the, radf ;
  78.   
  79.   radf  = 180.0/ M_PI ;
  80.   the   = ang / radf ; ;
  81.   thet  = cos ( the ) ;
  82.   cosa = 0.0 ;
  83.   /* find the length of the muscle */
  84.   for (i=0; i<3; i++)
  85.     va[i] = vt[i] - vh[i] ;
  86.   valen = VecLen ( va ) ;
  87.   /* loop for all polygons */
  88.   for (i=0; i<face->npolygons; i++) {
  89.     /* loop for all vertices */
  90.     for (j=0; j<3; j++) {
  91.       /* find the length of the muscle head to the mesh node */
  92.       for (k=0; k<3; k++)
  93. vb[k] = face->polygon[i]->vertex[j]->xyz[k] - vh[k] ;
  94.       vblen = VecLen ( vb ) ;
  95.       if ( valen > 0.0 && vblen > 0.0) {
  96. cosa = CosAng ( va, vb ) ;
  97. if ( cosa >= thet ) {
  98.   if ( vblen <= fin ) {
  99.     cosv = val * ( 1.0 - (cosa/thet) ) ;
  100.     if ( vblen >= fstart && vblen <= fin) {
  101.       dif       = vblen - fstart ;
  102.       tot       = fin - fstart ;
  103.       percent   = dif/tot ;
  104.       newv      = cos ( DTOR(percent*90.0) ) ;
  105.       for ( l=0; l<3; l++)
  106. newp[l] = (vb[l] * cosv) * newv ;
  107.     }
  108.     else {
  109.       for ( l=0; l<3; l++)
  110. newp[l] = vb[l] * cosv ;
  111.     }   /* endif vblen>fin */
  112.     for (l=0; l<3; l++)
  113.       face->polygon[i]->vertex[j]->xyz[l] += newp[l] ;
  114.   
  115.   }  /* endif vblen>fin    */
  116. }   /* endif cosa>thet    */
  117.       }    /* endif mlen&&tlen   */
  118.     }     /* end for j vertices */
  119.   }      /* end for i polygon  */
  120. }
  121. /* ======================================================================== */
  122. /* act_muscles ( face )      */
  123. /* ======================================================================== */
  124. /*
  125. ** activate the muscles
  126. */
  127. void
  128. act_muscles ( HEAD *face ) 
  129. {
  130.   int i ;
  131.   /* 
  132.    * Loop all the muscles.             
  133.    */ 
  134.   for (i=0; i<face->nmuscles; i++) {
  135.     /*
  136.      * Check to see if the muscle is active.                        
  137.     */
  138.     if (face->muscle[i]->active) {
  139.       activate_muscle ( face, face->muscle[i]->head,
  140.               face->muscle[i]->tail,
  141.               face->muscle[i]->fs,
  142.               face->muscle[i]->fe,
  143.               face->muscle[i]->zone,
  144.                 face->muscle[i]->mval ) ;
  145.       /* 
  146.       * Reset the muscle activity.     
  147.       */
  148.       face->muscle[i]->active = 1 ;
  149.     }
  150.   } 
  151. }
  152. /* ======================================================================== */
  153. /* reset_muscles ( face )      */
  154. /* ======================================================================== */
  155. /*
  156. ** Resets the muscles of the face.  This is achieved by reversing 
  157. ** the muscle contraction.
  158. */
  159. void
  160. reset_muscles ( HEAD *face ) 
  161. {
  162.   int i,j,k ;
  163.   for ( i=0; i<face->npolygons; i++ ) {
  164.     for ( j=0; j<3; j++ ) {
  165.       for ( k=0; k<3; k++ )
  166. face->polygon[i]->vertex[j]->xyz[k] = 
  167.   face->polygon[i]->vertex[j]->nxyz[k] ;
  168.     } /* end for j */
  169.   } /* end for i */