I'm not sure how is your 3D input data works, but I think your local matrix should be:
//-----------------------------------------------------------------------------------------------------------------------
public void UpdateLocal( )
{
Vector2 traslation = Translator.GetValue();
float rotation = Rotator.GetValue();
Vector2 scale = Scalator.GetValue();
Matrix mTraslation, mRotation, mScale;
Matrix.CreateTranslation( traslation.X, traslation.Y, 0, out mTraslation );
Matrix.CreateRotationZ( rotation, out mRotation );
Matrix.CreateScale(scale.X, scale.Y, 1 , out mScale );
Matrix.Multiply( ref mScale, ref mRotation, out Local );
Matrix.Multiply( ref Local, ref mTraslation, out Local );
}
//-----------------------------------------------------------------------------------------------------------------------
public virtual void UpdateTransformTopToDown( )
{
global_counter++;
SpecialUpdateTransformTopToDown( );
}
//-----------------------------------------------------------------------------------------------------------------------
protected virtual void SpecialUpdateTransformTopToDown( )
{
if ( counter == global_counter ) return;
counter = global_counter;
UpdateLocal( );
if ( Parent != null )
{
Matrix.Multiply( ref Local, ref (Parent as BoneData).Absolute, out Absolute );
}
else
{
Absolute = Local;
}
foreach ( BoneData child in _children.OfType<BoneData>() )
{
child.SpecialUpdateTransformTopToDown( );
}
}
And this is my code to animate Warcraft3 models, (based in MagosX War3ModelEditor code):
public void BuildTransformMatrix(Intervalo Time, Camara Camara)
{
Vector3 TranslationVector;
Vector4 RotationVector;
Vector3 ScalingVector;
TranslationVector = Translation.GetValue(Time);
RotationVector = Rotation.GetValue(Time);
ScalingVector = Scaling.GetValue(Time);
Matrix mPivotPoint = Matrix.CreateTranslation(PivotPoint);
Matrix mScaling = Matrix.CreateScale(ScalingVector);
Matrix mRotation = Matrix.CreateFromQuaternion(RotationVector.ToQuaternion());
Matrix mTranslation = Matrix.CreateTranslation(TranslationVector);
Matrix mPivotPointInverse = Matrix.Invert(mPivotPoint);
Transform = mPivotPointInverse * mScaling * mRotation * mPivotPoint * mTranslation;
if (Parent != null && Parent.NodeId != -1)
{
Transform = Matrix.Multiply(Transform, Parent.Transform);
}
foreach (BaseNode child in Children)
{
child.BuildTransformMatrix(Time, Camara);
}
}