2016-07-30 45 views
0

Ich habe ein Eltern/Kind Entity-System für ein kleines Spiel geschrieben und habe Probleme, wenn ich versuche, den Standort eines Kindobjekts zu ermitteln.Konvertieren von lokalen Koordinaten zu globalen Koordinaten

So wie es jetzt steht, werden die untergeordneten Elemente einer Entity im Koordinatenraum des übergeordneten Elements transformiert, gedreht und skaliert. Dies bedeutet, dass, wenn sich unser Elternteil an einem Ort von (2, 3, 0) befindet und wir ein Kind zu diesem Elternteil an einem Ort von (1, 2, 1) hinzufügen, sein Weltenraum (3, 5, 1) ist.

Mein Problem ist, dass ich nicht weiß, wie aus dem lokalen Raum (1, 2, 1) in den globalen Raum (3, 5, 1) konvertieren.

Der offensichtlichste Ort zum Starten ist durch Hinzufügen der Elternposition und der Kindposition. Dies funktioniert für nicht rotierte Objekte. Wann immer Rotation und Skalierung angewendet werden, wird es verwirrend und das kann ich nicht herausfinden.

Ich las irgendwo inversen Matrizen verwenden, aber die Erklärung darüber war nicht klar. Jede Hilfe/mathematische Einsicht/Pseudocode wäre sehr dankbar, danke!

Antwort

1

Ich wollte das nur posten, falls es irgendjemandem geholfen hat, weil es mich ziemlich verwirrt hat.

Dies ist eigentlich sehr einfach zu tun. Alles, was Sie tun müssen, ist, die Modellmatrix der Elterneinheiten mit der Modellmatrix des Kindes zu multiplizieren und dann die Koordinaten aus der unteren Reihe wie folgt wiederherzustellen.

Im Beispiel unten können wir sehen, wie ich die Position aus der Modellmatrix einer Entität mit und ohne Eltern erhalten. (Ich weiß nicht wirklich das ich speichern die Position jeder Einheit separat Diese für Unternehmen nur nützlich ist, dass Sie wissen, dass ein Elternteil haben und müssen die Position in der Welt Raum...)

Vector3f Entity::GetPosition() const { 
    Matrix4f matrix; 
    if (GetParent() != 0) { 
     matrix = GetParent()->GetModelMatrix() * GetModelMatrix(); 
    } else { 
     matrix = GetModelMatrix(); 
    } 

    float x = matrix[ 3 ][ 0 ]; 
    float y = matrix[ 3 ][ 1 ]; 
    float z = matrix[ 3 ][ 2 ]; 

    return Vector3f(x, y, z); 
} 

Anmerkung: Ich schrieb meine eigene Matrix-Implementierung, also wie Sie die Positionen multiplizieren und extrahieren, wird höchstwahrscheinlich anders sein.