Direct3D - Sprite drehen?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von X-Zat.

    Direct3D - Sprite drehen?

    Hallo Community!

    Habe die letzten Tage die Engine meines Spieles von GDI auf Diret3D umgestellt und es funzt alles wunderbar. Nur habe ich ein Problem:
    Es werden zur Laufzeit Objekte generiert und verwaltet sowie berechnet, die nicht nur via Sprite angezeigt, sondern auch gedreht werden sollen. Nur das mag Direct3D scheinbar nicht.

    Ich habe versucht, bei "Sprite.Draw2D" sowohl das Center als auch die Drehung (in Radians? Also (Pi/180)*Winkel?) anzugeben und dort wurde dann der Sprite um die linke obere Ecke gedreht, schnitt den angegebenen Punkt und besaß die Drehung, die angegeben wurde. Nur das Center war das vollkommen falsche.

    Habe auch versucht, die Matrix des Sprites zu ändern und die Z-Achse zu drehen (Z-Achse müsste es ja sein, oder?) mit Sprite.Transform.RotateZ(Winkel). Ändert nur leider auch nichts :/

    Habe stundenlang Google gequält, wenige Lösungen gefunden und noch weniger, die für mich nachvollziehbar waren. Letztlich auch keine, die gefruchtet hat. Was nicht daran liegt, dass die meisten Code-Beispiele im Netz für VB amüsanterweise in C# geschrieben wurden (etwas C# verstehe ich auch noch).


    Hätte denn jemand eine Idee, wie ich Sprites in Direct3D rotieren lassen kann?
    (Ich suche keinen C&P sondern eine Anleitung/Tut, weil ich doch durchaus etwas lernen möchte ;))

    Danke schonmal im Voraus, kann jede Hilfe brauchen :)

    MfG,
    X-Zat / Momo
    msdn.microsoft.com/en-us/library/ms881036.aspx
    Guck dir doch mal die Parameter an, da gibt es RotationCenter als Point, dort gibst du einfach den Punkt um welchen gedreht werden soll an...
    Würde bei dir also heißen (Width / 2, Height / 2)...

    Also bei mir hat es immer funktioniert...

    Bzw. guck dir mal die Draw-Methode an, die kann glaub ich ein bisschen mehr ;)

    Ob dafür ein ganzes Tutorial nötig ist weiß ich nicht^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl: Dein Link sagt mir nur, was ich im Objektkatalog über Sprites schon gelesen habe - Und zwar nicht viel hinsichtlich meines Problemes :D Habe meines Wissens alles richtig gemacht...

    @SystemUnknow: Mit deinem ersten Link kann ich leider gar nichts anfangen, den zweiten habe ich mir näher beschaut und habe versucht, das ganze nach zu basteln, ohne Erfolg.

    Hier mal meine Ansätze und Resultate:


    VB.NET-Quellcode

    1. '1. Draw: Keine Rotation, korrekte Darstellung
    2. tSprite.Draw2D(Texture, _
    3. New Point(0, 0), _
    4. 0, _
    5. New Point(mPoint.X - WorldView.X, mPoint.Y - WorldView.Y), _
    6. AlphaColor)
    7. '2. Draw: Rotation um Koordinate (0|0), Schnittpunkt mit dem Parameter "position"
    8. tSprite.Draw2D(Texture, _
    9. New Point(0, 0), _
    10. mRotation, _
    11. New Point(mPoint.X - WorldView.X, mPoint.Y - WorldView.Y), _
    12. AlphaColor)
    13. '3. Draw: siehe 2.
    14. tSprite.Draw2D(Texture, _
    15. New Point(GibSize.Width / 2, GibSize.Height / 2), _
    16. GetRotation(mRotation), _
    17. New Point(mPoint.X - WorldView.X, mPoint.Y - WorldView.Y), _
    18. AlphaColor)
    19. '4. Draw: Rotation um Koordinate (0|0), Radius minimal, max. 5 Pixel
    20. Dim tCenter As Vector3 = New Vector3(GibSize.Width / 2, GibSize.Height / 2, 0)
    21. Dim tMat As Matrix = Matrix.Translation(mPoint.X - WorldView.X + tCenter.X, mPoint.Y - WorldView.Y + tCenter.Y, 0)
    22. tSprite.Transform = Matrix.RotationZ(GetRotation(mRotation)) * tMat
    23. tSprite.Draw(Texture, tCenter, New Vector3(mPoint.X - WorldView.X, mPoint.Y - WorldView.Y, 0), AlphaColor)
    24. 'GibSize: Globale Variable zum Speichern der Größe der Objekte
    25. 'GetRotation: Gibt Radian eines Winkels wieder
    26. 'WorldView: "Kamera"/Ausschnitt der zu rendernden Welt
    27. 'mPoint: Koordinate des Objektes in der Welt, das gezeichnet wird


    Kann es sein, dass Direct3D eine Art definierte Kamera brauch? Denn irgendwo muss ja der Fehler liegen, dass DirectX so fixiert ist auf meine obere linke Fensterecke...
    Bin hier leicht am verzweifeln...

    (Erklärung zum Bild im Anhang: Die auf der linken Seite gezeigten Zustände kann ich herstellen, den rechten jedoch nicht...)

    MfG,
    X-Zat / Momo
    Bilder
    • DXD3D_DRAW2D_ROTATION.PNG

      28,62 kB, 740×640, 130 mal angesehen
    probier doch mal das...

    VB.NET-Quellcode

    1. Draw2D(texture,Rectangle.Empty,Rectangle.Empty,New Point(texture.GetSurfaceLevel(0).Description.Width / 2,texture.GetSurfaceLevel(0).Description.Height),GetRotation(mRotation),New Point(mPoint.X - WorldView.X, mPoint.Y - WorldView.Y), Color.White)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok...

    Jetzt wird zwar die Bewegung beibehalten (recht ruckelig), aber die Positionen sind verkehrt und die Sprites scheinen sich immer noch nicht zu drehen...
    Weil sich das ganze ziemlich mies beschreiben lässt, hab ich euch mal wieder ein Bild angehängt^^.
    Ich übergebe als Wert für die Rotation "GetRotation(mRotation)" (Single) - Wenn ich mRotation in hohen Schritten erhöhe (wie mit +=5 oder +=10), dann rotiert der Sprite wieder um die obere linke Bildschirmecke, wenn ich mit z.B. +=0.1 erhöhe, passiert das nicht. Ich sehe dann nur nicht wirklich eine Rotation.
    (Die übergebene Rotation von GetRotation ist 0.0174532924 * mRotation)

    ---> Kann es sein, dass ich mich vielleicht die ganze Zeit im Fachausdruck vertan hab? Denn eigentlich sollen nicht die Sprites an sich, sondern die Texturen der Sprites gedreht werden. Oder ist das so ziemlich dasselbe? ?(

    MfG,
    X-Zat / Momo

    Edit:

    Die Kurve, die die Sprites "laufen" wird schon per mPoint dargestellt! Die Kurve an sich soll gar nicht Ziel der Rotation sein - Mir geht's hier um die Textur, dass sich diese dreht... Hätte ich das vielleicht vorher sagen sollen? *Verwirrt*
    Bilder
    • DXD3D_DRAW2D_ROTATION2.PNG

      10,17 kB, 740×357, 130 mal angesehen