Jump to content
Unity Insider Forum

Blender Camera Matrix Import


Stag

Recommended Posts

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...