📄 muscle.c
字号:
/* ========================================================================== MUSCLE_C============================================================================= FUNCTION NAMES float VecLen -- calculates a vector length. float CosAng -- compute the cosine angle between two vectors. activate_muscle -- activate a muscle. act_muscles -- activate muscles. reset_muscles -- reset all the muscles. C SPECIFICATIONS float VecLen ( float *v ) float CosAng ( float *v1, float *v2 ) activate_muscle ( HEAD *face, float *vt, float *vh, float fstart, float fin, float ang, float val ) act_muscles ( HEAD *face ) reset_muscles ( HEAD *face ) DESCRIPTION This module is where all the muscle action takes place. This module comes as is with no warranties. SIDE EFFECTS Unknown. HISTORY Created 16-Dec-94 Keith Waters at DEC's Cambridge Research Lab.============================================================================ */#include <math.h>#include <stdio.h>#include "head.h"#ifdef _WIN32#pragma warning (disable:4244) /* Disable bogus conversion warnings. */#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */#endif/* Some <math.h> files do not define M_PI... */#ifndef M_PI#define M_PI 3.14159265358979323846#endif#define DTOR(deg) ((deg)*0.017453292) /* degrees to radians */#define RTOD(rad) ((rad)*57.29577951) /* radians to degrees */#define RADF 180.0 / M_PI /* ======================================================================== *//* float VecLen ( vec ) *//* ======================================================================== *//*** Caculates the length of the vector.*/float VecLen ( float *v ){ return (float) sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);}/* ======================================================================== *//* float CosAng ( v1, v2 ) *//* ======================================================================== *//*** Rotates the facial muscles 90.0 degrees.*/float CosAng ( float *v1, float *v2 ){ float ang, a,b ; a = VecLen ( v1 ) ; b = VecLen ( v2 ) ; ang = ((v1[0]*v2[0]) + (v1[1]*v2[1] ) + (v1[2]*v2[2])) / (a*b) ; return ( ang ) ;}/* ======================================================================== *//* activate_muscle ( face, vt, vh, fstart, fin, ang, val ) *//* ======================================================================== *//*** activate the muscle.*/voidactivate_muscle (HEAD *face, float *vt, float *vh, float fstart, float fin, float ang, float val){ float newp[3], va[3], vb[3] ; int i,j,k,l ; float valen, vblen ; float cosa, cosv, dif, tot, percent, thet, newv, the, radf ; radf = 180.0/ M_PI ; the = ang / radf ; ; thet = cos ( the ) ; cosa = 0.0 ; /* find the length of the muscle */ for (i=0; i<3; i++) va[i] = vt[i] - vh[i] ; valen = VecLen ( va ) ; /* loop for all polygons */ for (i=0; i<face->npolygons; i++) { /* loop for all vertices */ for (j=0; j<3; j++) { /* find the length of the muscle head to the mesh node */ for (k=0; k<3; k++) vb[k] = face->polygon[i]->vertex[j]->xyz[k] - vh[k] ; vblen = VecLen ( vb ) ; if ( valen > 0.0 && vblen > 0.0) { cosa = CosAng ( va, vb ) ; if ( cosa >= thet ) { if ( vblen <= fin ) { cosv = val * ( 1.0 - (cosa/thet) ) ; if ( vblen >= fstart && vblen <= fin) { dif = vblen - fstart ; tot = fin - fstart ; percent = dif/tot ; newv = cos ( DTOR(percent*90.0) ) ; for ( l=0; l<3; l++) newp[l] = (vb[l] * cosv) * newv ; } else { for ( l=0; l<3; l++) newp[l] = vb[l] * cosv ; } /* endif vblen>fin */ for (l=0; l<3; l++) face->polygon[i]->vertex[j]->xyz[l] += newp[l] ; } /* endif vblen>fin */ } /* endif cosa>thet */ } /* endif mlen&&tlen */ } /* end for j vertices */ } /* end for i polygon */}/* ======================================================================== *//* act_muscles ( face ) *//* ======================================================================== *//*** activate the muscles*/voidact_muscles ( HEAD *face ) { int i ; /* * Loop all the muscles. */ for (i=0; i<face->nmuscles; i++) { /* * Check to see if the muscle is active. */ if (face->muscle[i]->active) { activate_muscle ( face, face->muscle[i]->head, face->muscle[i]->tail, face->muscle[i]->fs, face->muscle[i]->fe, face->muscle[i]->zone, face->muscle[i]->mval ) ; /* * Reset the muscle activity. */ face->muscle[i]->active = 1 ; } } }/* ======================================================================== *//* reset_muscles ( face ) *//* ======================================================================== *//*** Resets the muscles of the face. This is achieved by reversing ** the muscle contraction.*/voidreset_muscles ( HEAD *face ) { int i,j,k ; for ( i=0; i<face->npolygons; i++ ) { for ( j=0; j<3; j++ ) { for ( k=0; k<3; k++ ) face->polygon[i]->vertex[j]->xyz[k] = face->polygon[i]->vertex[j]->nxyz[k] ; } /* end for j */ } /* end for i */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -