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:
das Flugzeug mit dem Flugzeug Transformation :: Transformation() -Methode - das gibt ein sehr seltsames Ergebnis.
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?
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
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
Die umgekehrte Transposition hat den Trick gemacht, danke. Möchten Sie das als separate Antwort hinzufügen, damit ich es überprüfen kann? – milkyway