Преобразование плоскости с помощью DirectXTK / DirectXMath

У меня есть трехмерная плоскость, определяемая тремя точками, и я хочу преобразовать ее с помощью матрицы 4x4, используя DirectXTK.

Я попробовал два способа сделать это:

  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, и в ее документации просто говорится "Преобразование плоскости по заданной матрице". Я думаю, что метод просто отлично, но тогда что не так с моим кодом?

2 ответа

Решение

Так как ты звонишь Transform на DirectXTK Plane кажется, что не требуется нормализовать его перед выполнением вызова. Но DirectXTK вики для Plane::Transform утверждает это:

Плоскости должны быть преобразованы путем обратной транспонирования матрицы, что для чистых вращений приводит к той же самой матрице, что и оригинал.

https://github.com/Microsoft/DirectXTK/wiki/Plane

Из спецификации:

Нормализованная плоскость для преобразования. Эта плоскость уже должна быть нормализована, так что ее вектор Normal имеет единичную длину, прежде чем вызывать этот метод.

Я полагаю, что вызов этого метода с не нормализованной плоскостью приведет к мусору. Поэтому я сначала нормализую самолет и проверим снова.

Plane.Transform Метод (Плоскость, Матрица)

Другие вопросы по тегам