xyz Yes it does!
To give you an idea of what is working, here is the core code. Adapted from OP's code, but I made the global changes.
You can see I multiply by each vertex by GlobalTransform, and I also multiply it to upNormal when I pass it to SetUpDirection().
Vector3[] vertices = new Vector3[3];
Vector3[] normals = new Vector3[3];
for (int i = 0; i < 3; i++)
{
vertices[i] = meshData.GetVertex(meshData.GetFaceVertex(normRay.GetCollisionFaceIndex(), i)) * GlobalTransform;
normals[i] = meshData.GetVertexNormal(meshData.GetFaceVertex(normRay.GetCollisionFaceIndex(), i));
}
Vector3 baryCoords = Geometry3D.GetTriangleBarycentricCoords(normRay.GetCollisionPoint(), vertices[0], vertices[1], vertices[2]);
Vector3 upNormal = (normals[0] * baryCoords.X) + (normals[1] * baryCoords.Y) + (normals[2] * baryCoords.Z);
upNormal = upNormal.Normalized();
SetUpDirection(upNormal * GlobalTransform, delta);
In SetUpDirection(), you can see I'm using GlobalTransform as well.
private void SetUpDirection(Vector3 upNormal, double delta)
{
Transform3D normTransform = GlobalTransform;
normTransform.Basis.Y = upNormal;
normTransform.Basis.X = -normTransform.Basis.Z.Cross(normTransform.Basis.Y);
normTransform = normTransform.Orthonormalized();
GlobalTransform = GlobalTransform.InterpolateWith(normTransform, .5f);
}