1

我有一个由三个点定义的 3D 平面,我想使用 DirectXTK 将其转换为 4x4 矩阵。

我尝试了两种方法来做到这一点:

  1. 使用 Plane::Transform() 方法变换平面 - 这会产生非常奇怪的结果。

  2. 变换三个点并从变换的点创建一个平面 - 这很好用。

我还尝试在调用 Plane::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

Plane::Transform() 调用 XMPlaneTransform ,它是 DirectXMath 库的一部分,它的文档简单地说“通过给定矩阵变换平面。”。我想这个方法很好,但是我的代码有什么问题?

4

2 回答 2

1

从规格:

要变换的标准化平面。在调用此方法之前,此平面必须已被归一化,以便其法线向量具有单位长度。

我猜用未标准化的飞机调用此方法会产生某种垃圾。所以我会先对飞机进行标准化并再次检查。

Plane.Transform 方法(平面、矩阵)

于 2017-09-10T11:05:40.657 回答
1

由于您正在调用TransformDirectXTK Plane,因此似乎不需要在调用之前对其进行标准化。但是 DirectXTK wikiPlane::Transform说明了这一点:

平面应该通过矩阵的逆转置来转换,对于纯旋转,这会产生与原始矩阵相同的矩阵。

github.com/Microsoft/DirectXTK/wiki/Plane

于 2017-09-11T04:10:11.470 回答