Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1.  
  2. //--------------------------------------------------------------------------------------------------
  3. // Melax, Volint.cpp, http://melax.com
  4. void lmPoly::ComputeMass( lmMassData* md ) const
  5. {
  6.     lmVec3 diag;
  7.     lmVec3 offDiag;
  8.     lmVec3 centroid;
  9.     lmIdentity( diag );
  10.     lmIdentity( offDiag );
  11.     lmIdentity( centroid );
  12.     r32 volume = r32( 0.0 );
  13.  
  14.     for ( i32 i = 0; i < hull->faceCount; ++i )
  15.     {
  16.         const lmHalfEdge *start = hull->GetEdge( hull->GetFace( i )->edge );
  17.         const lmHalfEdge *middle = hull->GetEdge( start->next );
  18.         const lmHalfEdge *last = hull->GetEdge( middle->next );
  19.  
  20.         while ( last != start )
  21.         {
  22.             lmVec3 u = hull->GetVertex( start->vert );
  23.             lmVec3 v = hull->GetVertex( middle->vert );
  24.             lmVec3 w = hull->GetVertex( last->vert );
  25.  
  26.             u = lmMul( local, u );
  27.             v = lmMul( local, v );
  28.             w = lmMul( local, w );
  29.  
  30.             r32 currentVolume = lmScalarTripleProduct( u, v, w );
  31.             volume += currentVolume;
  32.             centroid += (u + v + w) * currentVolume;
  33.  
  34.             for ( i32 j = 0; j < 3; ++j )
  35.             {
  36.                 i32 j1 = (j + 1) % 3;
  37.                 i32 j2 = (j + 2) % 3;
  38.  
  39.                 diag[ j ] += (
  40.                     u[ j ] * v[ j ] + v[ j ] * w[ j ] + w[ j ] * u[ j ] +
  41.                     u[ j ] * u[ j ] + v[ j ] * v[ j ] + w[ j ] * w[ j ]) * currentVolume;
  42.  
  43.                 offDiag[ j ] += (
  44.                     u[ j1 ] * v[ j2 ]        + v[ j1 ] * w[ j2 ]        + w[ j1 ] * u[ j2 ]  +
  45.                     u[ j1 ] * w[ j2 ]        + v[ j1 ] * u[ j2 ]        + w[ j1 ] * v[ j2 ]  +
  46.                     u[ j1 ] * u[ j2 ] * 2.0f + v[ j1 ] * v[ j2 ] * 2.0f + w[ j1 ] * w[ j2 ] * 2.0f ) * currentVolume;
  47.             }
  48.  
  49.             middle = last;
  50.             last = hull->GetEdge( last->next );
  51.         }
  52.     }
  53.  
  54.     centroid /= (volume * 4.0f);
  55.     volume *= (1.0f / 6.0f);
  56.     diag /= volume * 60.0f;
  57.     offDiag /= volume * 120.0f;
  58.     md->mass = density * volume;
  59.  
  60.     if ( md->mass != 0 )
  61.     {
  62.         md->inertia.Set(
  63.             diag.y + diag.z, -offDiag.z     , -offDiag.y,
  64.             -offDiag.z     , diag.x + diag.z, -offDiag.x,
  65.             -offDiag.y     , -offDiag.x     , diag.x + diag.y
  66.             );
  67.         md->inertia *= md->mass;
  68.     }
  69.     else
  70.         md->inertia = lmDiagonal( 0 );
  71.  
  72.     md->center = centroid;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement