Hi, try this:

// Obtain model "normal" from current rotation quaternion (or rotation matrix)

Vector3 currentNormal = Matrix.CreateFromQuaternion(m_Rotation).Up;

// Obtain triangle normal

Vector3 newNormal = tri.Normal;

// Obtain axis between two normals, it will be the rotation axis

Vector3 axis = Vector3.Normalize(Vector3.Cross(currentNormal, newNormal));

// Calc angle between normals

float angle = (float)Math.Acos(Vector3.Dot(currentNormal, newNormal));

if (angle != 0.0f)

{

// Create a quaternion with the rotation difference between normals

m_Inclination = Quaternion.CreateFromAxisAngle(axis, angle);

}

else

{

m_Inclination = Quaternion.Identity;

}

// Calc final transform

m_ModelSpace = Matrix.CreateScale(m_Scale);

m_ModelSpace *= Matrix.CreateFromQuaternion(m_Rotation);

m_ModelSpace *= Matrix.CreateFromQuaternion(m_Inclination);

m_ModelSpace *= Matrix.CreateTranslation(m_Position);

If you want you can apply some slerp to make the transitions between triangles more realistic.

You can see the results of this code in www.codeplex.com/tanksgame

Regards