Reputation: 55
I have a 3D plane defined by three points and I want to transform it with a 4x4 matrix using DirectXTK.
I tried two ways to do this:
Transform the plane with Plane::Transform() method - this gives a very strange result.
Transform the three points and create a plane from the transformed points - this works fine.
I also tried to transpose the matrix before calling Plane::Transform() and it got the plane normal right, but the constant is wrong (plus that transposing the matrix really makes no sense to me).
void TestPlaneTransform()
{
Vector3 p1(-2.4f, -2.0f, -0.2f);
Vector3 p2(p1.x, p1.y + 1, p1.z);
Vector3 p3(p1.x, p1.y, p1.z + 1);
Plane plane(p1, p2, p3);
Matrix m = Matrix::CreateTranslation(-4, -3, -2);
// transform plane with matrix
Plane result1 = Plane::Transform(plane, m);
// transform plane with transposed matrix
Plane result2 = Plane::Transform(plane, m.Transpose());
// transform points with matrix
Vector3 t1 = Vector3::Transform(p1, m);
Vector3 t2 = Vector3::Transform(p2, m);
Vector3 t3 = Vector3::Transform(p3, m);
// plane from transformed points
Plane result3(t1, t2, t3);
result1.Normalize();
result2.Normalize();
result3.Normalize();
}
Here are the results after normalization:
result1 x:-0.704918027 y:-0.590163946 z:-0.393442601 w:0.196721300
result2 x:1.00000000 y:0.000000000 z:0.000000000 w:-1.59999990
result3 x:1.00000000 y:0.000000000 z:0.000000000 w:6.40000010
Plane::Transform() calls XMPlaneTransform which is part of the DirectXMath library and its documentation says simply "Transforms a plane by a given matrix.". I guess the method is just fine, but then what is wrong with my code?
Upvotes: 2
Views: 413
Reputation: 3361
Since you are calling Transform
on the DirectXTK Plane
it seems that it's not required to have it normalized before doing the call.
But the DirectXTK wiki for Plane::Transform
states this:
Planes should be transformed by the inverse transpose of the matrix, which for pure rotations results in the same matrix as the original.
github.com/Microsoft/DirectXTK/wiki/Plane
Upvotes: 1
Reputation: 3361
From the specs:
The normalized Plane to transform. This Plane must already be normalized, so that its Normal vector is of unit length, before this method is called.
Calling this method with a plane that is not normalized will produce sort of rubbish I guess. So I'd normalize the plane first and check again.
Plane.Transform Method (Plane, Matrix)
Upvotes: 1