我有一个由三点定义的三维平面,我想用DirectXTK将它转换成一个4x4矩阵。
我尝试了两种方法:
我还尝试在调用平面::Transform()之前将矩阵转置,使平面变得正常,但是常数是错误的(另外,转置矩阵对我来说真的没有任何意义)。
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();
}以下是标准化后的结果:
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平面::Transform()调用XMPlaneTransform,这是DirectXMath库的一部分,它的文档简单地说“用给定的矩阵来转换平面”。我想这个方法很好,但是我的代码有什么问题呢?
发布于 2017-09-11 04:10:11
由于您是在DirectXTK Plane上调用Plane,所以在执行调用之前似乎不需要将其规范化。但是,用于DirectXTK的Plane::Transform wiki声明如下:
平面应由矩阵的逆转置变换,而对于纯旋转,则产生与原矩阵相同的矩阵。
发布于 2017-09-10 11:05:40
从规格:
要变换的归一化平面。在调用此方法之前,必须对此平面进行规范化,使其法线向量具有单位长度。
用一个没有归一化的平面来调用这个方法,我想会产生一些垃圾。所以我先把飞机正常化,然后再检查一遍。
https://stackoverflow.com/questions/46139369
复制相似问题