Advertisement
snake5

anim.deformer code fix

Nov 4th, 2015
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1.     // produce animation data
  2. #if 1
  3.     for( int i = 0; i < count; ++i )
  4.     {
  5.         m_positions[ i ] = animSource->m_positions[ i ];
  6.         m_rotations[ i ] = animSource->m_rotations[ i ];
  7.         m_scales[ i ] = animSource->m_scales[ i ];
  8.         m_factors[ i ] = animSource->m_factors[ i ];
  9.     }
  10.     if( count > 0 )
  11.     {
  12.         Vec3 off = m_bonePositions[ 0 ] - posns[ 0 ];
  13.         m_positions[ 0 ] += m_invSkinOffsets[ 0 ].TransformNormal( off );
  14.     }
  15.     Mat4 skinXF[ SGRX_MAX_MESH_BONES ];
  16.     for( int i = 0; i < count; ++i )
  17.     {
  18.         skinXF[ i ] = m_mesh->m_bones[ i ].boneOffset;
  19.         if( i > 0 )
  20.         {
  21.             int pid = GetParentBoneID( i );
  22.             skinXF[ i ] = skinXF[ i ] * skinXF[ pid ];
  23.         }
  24.        
  25.         // gather average global target/local original child pos.
  26.         Vec3 avgtgt = V3(0);
  27.         Vec3 avgpos = V3(0);
  28.         int cc = 0;
  29.         for( int ch = i + 1; ch < count; ++ch )
  30.         {
  31.             if( GetParentBoneID( ch ) != i )
  32.                 continue;
  33.             avgtgt += m_bonePositions[ ch ];
  34.             avgpos += posns[ ch ];
  35.             cc++;
  36.         }
  37.        
  38.         if( cc == 0 )
  39.             continue;
  40.        
  41.         avgpos /= cc;
  42.         avgtgt /= cc;
  43.        
  44.         Mat4 curxf = Mat4::CreateSRT( m_scales[ i ], m_rotations[ i ], m_positions[ i ] );
  45.         Mat4 inv = Mat4::Identity;
  46.         ( curxf * skinXF[ i ] ).InvertTo( inv );
  47.         avgtgt = inv.TransformPos( avgtgt ).Normalized();
  48.         avgpos = m_invSkinOffsets[ i ].TransformPos( avgpos ).Normalized();
  49.         m_rotations[ i ] = m_rotations[ i ] * Quat::CreateAxisAxis( avgpos, avgtgt );
  50.        
  51.         skinXF[ i ] = Mat4::CreateSRT(
  52.             m_scales[ i ], m_rotations[ i ], m_positions[ i ] ) * skinXF[ i ];
  53.        
  54.         m_factors[ i ] = 1;
  55.     }
  56. #else
  57.     for( int i = 0; i < count; ++i )
  58.     {
  59.         m_positions[ i ] = animSource->m_positions[ i ];
  60.         m_rotations[ i ] = animSource->m_rotations[ i ];
  61.         m_scales[ i ] = animSource->m_scales[ i ];
  62.         m_factors[ i ] = animSource->m_factors[ i ];
  63.        
  64.         int pid = GetParentBoneID( i );
  65.         if( pid >= 0 )
  66.         {
  67.             // rotate bone with axis/angle in bone space
  68.             Vec3 nmdir = m_bonePositions[ i ] - m_bonePositions[ pid ];
  69.             Vec3 omdir = dirs[ i ];
  70.            
  71.             Vec3 tf_nmdir = m_invSkinOffsets[ i ].TransformNormal( nmdir ).Normalized();
  72.             Vec3 tf_omdir = m_invSkinOffsets[ i ].TransformNormal( omdir ).Normalized();
  73.             m_rotations[ i ] = m_rotations[ i ] * Quat::CreateAxisAxis( tf_omdir, tf_nmdir );
  74.            
  75.             // rotate child bones backwards
  76.             for( int ch = i + 1; ch < count; ++ch )
  77.             {
  78.                 if( GetParentBoneID( ch ) != i )
  79.                     continue;
  80.                 tf_nmdir = m_invSkinOffsets[ ch ].TransformNormal( nmdir ).Normalized();
  81.                 tf_omdir = m_invSkinOffsets[ ch ].TransformNormal( omdir ).Normalized();
  82.                 m_rotations[ ch ] = m_rotations[ ch ] * Quat::CreateAxisAxis( tf_nmdir, tf_omdir );
  83.             }
  84.         }
  85.         else
  86.         {
  87.             // move bone set in world space
  88.             m_positions[ i ] += m_invSkinOffsets[ i ].TransformNormal( m_bonePositions[ i ] - posns[ i ] );
  89.         }
  90.         m_factors[ i ] = 1;
  91.     }
  92. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement