Derek Nedelman

You should calculate the world space plane from your vertices (using your model's local->world transformation matrix, which is what you seem to already be doing) and then transform the coefficients of that plane by the inverse transpose world*view*proj matrix. (The world matrix in this case is an additional, optional, world transformation, not your model's world matrix)

You will end up with code that looks something like this:

//It's assumed there's a plane instance called worldClipPlane and a Matrix called worldViewProjection that takes world space coordinates to projective space coordinates. If you don't do anything with your world coordinates (like flip them for doing reflections), then worldViewProjection is the same as view*projection

Matrix planeProjectionMatrix = Matrix.Transpose(Matrix.Invert(worldViewProjection));

Vector4 worldClipPlaneCoefficients = new Vector4(worldClipPlane.Normal.X, worldClipPlane.Normal.Y, worldClipPlane.Normal.Z, worldClipPlane.D);

Vector4 projectedPlaneCoefficients = Vector4.Transform(worldClipPlaneCoefficients, planeProjectionMatrix);

projectedPlaneCoefficients.Normalize();

graphicsDevice.ClipPlanes[0].Plane = new Plane(projectedPlaneCoefficients);

graphicsDevice.ClipPlanes[0].IsEnabled = true;

This code is adapted from my

3DS Viewer project, which I use to render reflections. You can find the usage in the DrawMirrors() method in Scene.cs.