2017-09-10 2 views
1

Ich habe eine 3D-Ebene, die durch drei Punkte definiert ist, und ich möchte sie mit einer 4x4-Matrix mit DirectXTK transformieren.Eine Ebene mit DirectXTK/DirectXMath transformieren

versuchte ich zwei Möglichkeiten, dies zu tun:

  1. das Flugzeug mit dem Flugzeug Transformation :: Transformation() -Methode - das gibt ein sehr seltsames Ergebnis.

  2. Transformieren Sie die drei Punkte und erstellen Sie eine Ebene aus den transformierten Punkten - das funktioniert einwandfrei.

Ich habe auch versucht, die Matrix zu transponieren, bevor Ebene Aufruf :: Transformation() und es wurde die Ebene normal richtig, aber die Konstante ist falsch (plus, dass die Matrix wirklich umgesetzt habe mich keinen Sinn macht).

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(); 
} 

Hier sind die Ergebnisse nach der Normalisierung:

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 

Flugzeug :: Transform() ruft XMPlaneTransform, die Teil der DirectXMath Bibliothek und ihre Dokumentation sagt einfach „Wandelt eine Ebene, die durch eine gegebene Matrix ist. ". Ich denke, die Methode ist in Ordnung, aber was stimmt dann mit meinem Code nicht?

Antwort

1

Da Sie Transform auf dem DirectXTK Plane fordern scheint es, dass es nicht normalisiert hat, ist erforderlich, bevor der Anruf zu tun. Aber die DirectXTK Wiki für Plane::Transform Staaten dieses:

Planes sollte, durch die inverse transponieren der Matrix transformiert werden, die für die reine Drehungen Ergebnisse in der gleichen Matrix wie das Original.

github.com/Microsoft/DirectXTK/wiki/Plane

1

Von den Spezifikationen:

Die normalisierte Ebene zu transformieren. Diese Ebene muss bereits normalisiert sein, so dass ihr Normaler Vektor Einheitslänge hat, bevor diese Methode aufgerufen wird.

Der Aufruf dieser Methode mit einer Ebene, die nicht normalisiert ist, wird eine Art Müll produzieren, denke ich. Also würde ich das Flugzeug zuerst normalisieren und nochmal überprüfen.

Plane.Transform Method (Plane, Matrix)

+0

Die Ausgangsebene ist [1.0, 0.0, 0.0, 2.4] und ruft Normalisieren nicht diese Werte ändern. Übrigens scheint es, dass Sie sich auf die XNA-Dokumentation beziehen, während ich DirectXTK verwende. Die Dokumentation der zugrundeliegenden DirectXMath-Methode erwähnt nicht, dass es eine normalisierte Ebene erfordert. https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.plane.xmplanetransform(v=vs.85).aspx – milkyway

+0

Es schien mir ziemlich offensichtlich, dass das Flugzeug nicht normalisiert ist, zumindest aus dem Blick auf die 3 Vektoren. Das DirectXTK-Wiki für Plane :: Transform besagt: * Ebenen sollten durch die inverse Transponierung der Matrix transformiert werden, was für reine Rotationen zur selben Matrix wie das Original führt. * Https://github.com/Microsoft/DirectXTK/wiki/Plane – yacc

+1

Die umgekehrte Transposition hat den Trick gemacht, danke. Möchten Sie das als separate Antwort hinzufügen, damit ich es überprüfen kann? – milkyway