Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX - Rechteck kippen / an einer Seite strecken (https://www.delphipraxis.net/149190-directx-rechteck-kippen-einer-seite-strecken.html)

XoRiC 16. Mär 2010 10:21


DirectX - Rechteck kippen / an einer Seite strecken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich hatte diese Frage schon einmal gestellt, sie jedoch damals falsch formuliert, bzw einen falschen Ansatz gewählt.

Ich programmiere an einem 2D Spiel, bei dem lediglich der Untergrund einen leichten 3D Effekt erhalten soll, indem er die untere Bildkante ein bisschen breiter ist als die obere. Hier (bzw falls Link noch gültig, dann auch nach diesem Absatz ;)) ist noch einmal eine Skizze, wie ich es mir vorgestellt hatte. Die Sprites, die auf den Boden draufgezeichnet werden, platziere ich dann selbst, sie sollen in ihrer Größe nicht verändert werden. Ich muss dabei nur wissen, um welchen Faktor die obere Bildkante kürzer ist als die untere.

http://img96.imageshack.us/img96/6106/trapez.th.jpg

Meine Idee war zuerst, ein Vertex zu benutzen, bei dem ich die oberen beiden Eckpunkte ein Stück in die Bildschirmmitte verschiebe und die beiden unteren bündig an den Bildschirmrand setze. Der Boden, bzw die Textur die darauf gezeichnet wird, soll dann gestreckt werden. Allerdings funktioniert das so nicht, in der Mitte entsteht beim Zeichnen ein Knick. Der Übergang vom oberen rechten Dreieck zum unteren linken ist nicht fließend. Jetzt weiß ich garnicht, ob sich das so überhaupt realisieren lässt. Hier noch eine Skizze, wie es bisher aussieht (auch im Anhang).

http://img6.imageshack.us/img6/3595/resultbh.th.jpg

Eine Alternative, die mir schon in meinem alten Thread vorgeschlagen wurde, wäre, die Boden-Textur zunächst auf ein Rechteck zu zeichnen und dieses dann ein Stück weit nach hinten zu kippen, also tatsächlich 3D zu zeichnen. Hier hab ich ein paar Probleme und weiß nicht, ob ich das so einfach machen kann. Denn:
- Ich möchte noch 2D Sprites oben drüber zeichnen
- Mein Untergrund besteht aus mehreren Schichten (in den oberen Schichten sind halbtransparente Stellen, durch die man die Schicht darunter sehen soll)
- Ich benötige den Faktor, um den die obere Bildkante schmaler ist als die untere, um die Sprites oben drauf richtig zu platzieren

Meine Frage ist jetzt: Kennt jemand eine Möglichkeit, diesen Kipp-Effekt mit der oberen Herangehensweise (durch ein Vertex in Trapezform) zu realisieren? Falls das so nicht geht und die zuletzt geschilderte Möglichkeit (Kippen eines Rechtecks) funktionieren sollte - hat jemand ein paar Links oder Codeausschnitte, wie ich das realisieren kann?
Ich bin auch für jeden weiteren Vorschlag sehr dankbar.

/Edit: ich arbeite mit DirectX9

Vielen Dank für jegliche Hilfe!
Gruß Xoric

drboon 16. Mär 2010 17:42

Re: DirectX - Rechteck kippen / an einer Seite strecken
 
Du hast doch schon die oberen Vertices zueinander geschoben, indem du die X-Koordinaten angepasst hast. Um das Objekt zu drehen könntest du das gleiche entweder 1) genauso mit den Z-Koordinaten machen oder 2) das Objekt aus der Ausgangsposition mit einer Rotationsmatrix drehen (s. D3DXMatrixRotationAxis).

Ich würde dir letzteres von beiden raten, da man Vertices i.d.R. nicht per Hand transformiert.

Beispielhaft könnte das so aussehen:

1. D3DXMatrixRotationAxis aufrufen und
2. diese Matrix mit SetTransform als Weltmatrix setzen.
3. Das Rechteck wie gewohnt zeichnen und darstellen.

Falls das mit der Transformation nicht klar sein sollte, solltest du dich erstmal mit Matrizen auseinandersetzen und die Einsteigertutorials aus dem DirectX SDK durchgehen.

XoRiC 17. Mär 2010 19:12

Re: DirectX - Rechteck kippen / an einer Seite strecken
 
Hi drboon!

Vielen Dank für den Tipp und die beiden MSDN Links, ich denke ich werd damit klarkommen. Musste nur feststellen, dass ich im Moment noch rhw Vertexe verwende und die Z-Koordinate bei meinem bisherigen Code überhaupt keinen Einfluss nimmt.

Delphi-Quellcode:
type
  TMyVertex = record
    x, y, z, rhw: Single;
    U, V: Single;
  end;
Jetzt muss ich mir erst mal anschauen welche Vertexe ich brauche und was ich im Device und den sonstigen Einstellungen noch verändern muss. Dann werde ich so verfahren wie du es mir beschrieben hast.

Vielen Dank nochmal!
Gruß Xoric


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz