Vortex2D + Transformationsmatrixen

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Vortex2D + Transformationsmatrixen

    Hallo,

    bin neu hier im Forum, beschäftige mich allerdings schon etwas länger mit C-Sharp.
    Momentan taste ich mich etwas an die Spieleprogrammierung heran. Ich arbeite momentan mit der Vortex2D Engine weil sie mir von Anfang an gut gefallen hat und fast alles prima funktioniert hat.
    Allerdings kenne ich mich mit Transformationsmatrixen überhaupt nicht aus.
    Bzw. formuliere ich das ganze mal etwas genauer.

    In Vortex2D kann man z.B. Sprites/Texturen Translatieren, Rotieren, Skalieren.
    In meinem Spiel brauche ich davon auf jeden Fall die Möglichkeit meine Sprites rotieren zu lasssen.
    Das habe ich auch schon geschafft, allerdings nicht so wie ich mir das vorstelle.
    Von GDI kenne ich, dass ich das Sprite mit DrawImage und den ersten zwei Parametern positionieren kann.
    Bei Vortex2D in der DrawSprite Methode funktioniert das auch allerdings wenn dann das rotieren dazu kommt spielt die ganze Transformation verrückt (oder bin ich verrückt?)
    Ich bin mir nicht sicher, ob man das bewegen eines Sprites mit dem Translatieren machen soll oder mit den ersten beiden Parametern in der DrawSprite Methode.

    Ich musste das Sprite in DrawSprite auf 0, 0 positionieren und konnte dann mit dem Translatieren die Position setzen und dann hat das rotieren auch ganz gut funktioniert. Jetzt frage ich mich allerdings ob das nur in Vortex2D so ist oder ob das generell bei jeder halbwegs guten Engine so ist. Ich bins von GDI so gewohnt die Position des Sprites in der DrawImage Methode zu setzen.

    Vielleicht habt ihr noch ein paar nützliche und einfach zu verstehende Links zu Transformationsmatrixen für mich. Gerne auch auf Englisch.

    Ich hoffe mir kann jemand ein paar Dinge dazu erzählen.

    Danke im Voraus
    Mfg Yothrii
    Eine Rotationsmatrix dreht immer um den Koordinatenursprung. Wenn um einen anderen Punkt rotiert werden soll, muss dieser zuerst in den Ursprung verschoben, dann rotiert und dann wieder zurückverschoben werden. Dies lässt sich in einer einzigen Matrix darstellen, indem du die Rotationsmatrix mit den entsprechenden Translationsmatrizen multiplizierst.
    Kann speziell zu Vortex2D nichts sagen aber so sollte es eigentlich Standard sein.
    Falls es nicht bekannt ist. Die Multiplikation von Matrizen ist NICHT kommutativ, also bitte auf die Reihenfolge achten in der du die Aktionen ausführen willst, und so dann auch multiplizieren (Translation, Rotation, Translation zurück)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Danke,

    ich erläutere nochmal ein weiteres Problem/eine weitere Frage.

    Undzwar habe ich zwei Sprites:
    Das erste ist ein Panzer ohne das Kanonenrohr. Und das zweite ist das Kanonenrohr.
    Ich möchte das Kanonenrohr in jeweils einer anderen Rotation über dem Panzer zeichnen lassen. Nunja das ist auch nicht das Problem sondern
    das ich nicht weiß wie ich den Drehpunkt meines Kanonenrohrs verändere. Habe das mal bisschen verdeutlicht.
    Das Kanonenrohr hat wie jedes andere Bild den Rotationspunkt immer in der Mitte:


    Genau das möchte ich bei dem Sprite nicht haben, sondern so:

    Sodass ich das Kanonenrohr so bewegen kann:


    Und nicht so:


    Ich hoffe mir kann jemand helfen. Hat das auch was mit den Transformationen zutun?

    Artentus schrieb:

    setz halt nicht die Mitte in der Formel oben ein sondern den gewünschten Punkt.



    Nunja, das ist ja der Punkt.
    Ich setze nicht wirklich die Mitte.

    Bei Vortex2D lade ich so eine Textur:

    C#-Quellcode

    1. Texture tank = new Texture("tank.png");

    Die Transformationen dann so:

    C#-Quellcode

    1. Translation tankTranslation = new Translation(0, 0);
    2. Rotation tankRotation = Rotation.Empty;
    3. Scaling tankScaling = Scaling.Empty;

    Zeichnen geht dann wie folgt:

    C#-Quellcode

    1. using(canvas <= tankTranslation <= tankRotation <= tankScaling)
    2. {
    3. canvas.DrawSprite(0, 0, tank.ToSprite(), ColorU.White);
    4. }


    Wenn ich das using nicht benutze und mit diesem Operator <= die Transformation anwende ist alles was im using Statement steht von den Transformationen nicht betroffen.
    Um jetzt den Tank zu drehen mache ich dann einfach in der update Methode:

    C#-Quellcode

    1. tankRotation.Angle += MathHelper.ToRadians(30f) * deltaTime;


    Nur als Beispiel jetzt halt.
    Aber ich verstehe nicht wo ich jetzt den Rotationspunkt verändern kann.
    Sehr komische Syntax, hab ich so auch noch nicht gesehen.
    Normalerweise sollte es etwas so aussehen (Pseudocode):

    Quellcode

    1. ​WorldTransform = Matrix.Translation(x, y) * MAtrix.Rotation(angle) * Matrix.Translation(-x, -y)
    2. Draw()
    3. WordlTransform = Matrix.Identity

    Da musst du jetzt halt schauen, wie das bei dieser Engine formuliert werden muss.
    Okey, habe mir nochmal die Dokumentation angeschaut und sehe gerade bei der Rotation Klasse gibt es Eigenschaften wie Origin, OriginX und OriginY.
    Vielleicht ist das genau was ich suche. Probiere jetzt mal rum.

    Edit: Hab es hinbekommen. Wie schon vermutet mit der OriginY Eigenschaft wo ich dann den Rotationspunkt festlegen konnte. Es funktioniert jetzt wie ich wollte.
    Hier:


    Ich danke allen für die Tipps und Unterstützung. Gerne heiße ich Links zum Thema weiterhin willkommen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yothrii“ ()

    ThePlexian schrieb:

    also bitte auf die Reihenfolge achten in der du die Aktionen ausführen willst
    Jou, das ist gaaaaaanz wichtig.
    @Yothrii Mach Dir ein Testprogramm, in dem Du genau dies untersuchst. 2 Button mit Reihenfolge a und Reihenfolge b, ggf. Reihenfolge c.
    Und immer das Ergebnis darstellen und interpretieren. Und immer alle Möglichkeiten betrachten.
    Du ersparst Dir damit viel Ärger. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Yothrii schrieb:

    Ich denke eher nicht?!
    Dann hast Du Dir möglicherweise schon alles verbaut, bevor Du richtig angefangen hast. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst du mir eine Engine empfehlen die für 2D gedacht ist und was Spiele betrifft möglichst Anfängerfreundlich ist? Ich hab zwar selber schon gesucht aber von Unity halte ich recht wenig, Duality genauso. Hatte mal OpenTK angefangen aber als ich dann gemerkt habe wie viel Aufwand es ist ne Textur zu laden bin ich an die Decke gesprungen.
    What about Sharpex2D?
    Findest auch hier im Forum.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    What about Sharpex2D?
    Findest auch hier im Forum.

    Grüße


    Danke das sieht auf den ersten Blick ganz gut aus. Komisch das ich die über Google nicht gefunde habe.

    Edit: @ThuCommix Der Download Link auf sharpex2d.de für die 1.3.0 funktioniert nicht?! Könntest du den reparieren oder bin ich zu blöd den aufzurufen?
    Edit²: @ThuCommix Sobald ich irgend ein DirectX Renderer in die Engine Configuration übergebe läuft nix mehr. (Siehe Bild)


    Mit dem GDI Renderer der von Haus aus dabei ist klappt alles.
    BTW: Die DX Renderer hab ich sowie auch Sharpex2D selbst per NuGet Console zu meinem Projekt hinzugefügt.
    Mein Projekt läuft aufm FW 4.
    Vllt. brauchst du diese Daten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Yothrii“ ()