Stag Geschrieben 9. März 2020 Melden Share Geschrieben 9. März 2020 Hallo Community, ich versuche eine Camera Matrix aus Blender (in Textdatei exportiert) in Unity zu verwenden, was allerdings nicht so richtig klappen will. Einerseits gehts es um das extrahieren der Skalierung, Translation und Rotation aus der Blender Camera Matrix und zweitens um die Anpassung der Unterschiede zwischen dem Coordinatensystem von Blender (Z ist up, Y ist forward) und Unity (Z is forward, Y is up). Zu Beginn wird die komplette Matrix um x90° rotiert, damit z der forward-Vektor ist und y der up-Vektor. Somit sollten die Coordinatensysteme gleich sein, sofern nicht hier schon ein Fehler vorliegt? Danach werden Scale, Trans und Rotation extrahiert. Hier auch noch eine Frage zur Extraktion der Skalierung. Warum wird die Skalierung mittels GetColumn und der Distanz dieser Spalte errechnet? Eigentlich müssen doch nur die diagonalen Matrixfelder (links oben nach rechts unten) in einen Vektor gepackt werden und man hat die Skalierung. Warum ist das hier anders? Nachdem die Rotation extrahiert wurde, wird sie noch von einem rechthändigen System ins linkshändige System transformiert und danach angewandt. Leider kommt aber nicht die gewünschte Kameratransformation heraus. Was mache ich falsch? Vielleicht hat ja einer von Euch Transformations-Göttern eine Ahnung ? // Correct coordinate space Quaternion rot = Quaternion.Euler(90.0f, 0.0f, 0.0f); Matrix4x4 m = camReader.cameraMatrixList[camIndex]; m = m * Matrix4x4.Rotate(rot); // Extract scale and translation originController.transform.localScale = extractScale(m); //(camReader.cameraMatrixList[camIndex]); originController.transform.position = extractPosition(m); //(camReader.cameraMatrixList[camIndex]); // Extract rotation Quaternion q = extractRotation(m); // (camReader.cameraMatrixList[camIndex]); // Switch from right handed coord-sys to left handed q.x = -q.x; q.y = -q.y; q.z = q.z; q.w = q.w; // Set rotation originController.transform.rotation = q; // Funktionen zum Extrahieren private Vector3 extractPosition(Matrix4x4 mat) { Vector3 pos; pos.x = mat.m03; pos.y = mat.m13; pos.z = mat.m23; return pos; } private Quaternion extractRotation(Matrix4x4 mat) { Vector3 forward; forward.x = mat.m02; forward.y = mat.m12; forward.z = mat.m22; Vector3 upwards; upwards.x = mat.m01; upwards.y = mat.m11; upwards.z = mat.m21; return Quaternion.LookRotation(forward, upwards); // * Quaternion.Euler(0.0f, 90.0f, 0.0f); } private Vector3 extractScale(Matrix4x4 matrix) { Vector3 scale; scale.x = matrix.GetColumn(0).magnitude; scale.y = matrix.GetColumn(1).magnitude; scale.z = matrix.GetColumn(2).magnitude; return scale; //scale.x = matrix.m00; //scale.y = matrix.m11; //scale.z = matrix.m22; //return scale; } Viele Grüße, Stag Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.