Wie kann ich ein 2D-Gummiband-Rechteck in DirectX zeichnen? Vorzugsweise mit C#.
Antworten
Zu viele Anzeigen?Die klassische Art des Rubberbanding ist:
- Zeichnen Sie die normale Szene, d. h. den "Hintergrund".
- Wechseln Sie in den "XOR-Modus", in dem Ihr Stift die bereits im Framebuffer vorhandenen Pixel XOR-verknüpft. Es ist wichtig, dass der Modus hier XOR ist, da XOR verlustfrei "rückgängig" gemacht werden kann, anders als z.B. eine Additionsoperation.
- Während des "Gummibandfahrens":
- Zeichnen Sie das Gummiband-Rechteck in seinen aktuellen Koordinaten
- Zeichnen Sie im nächsten Bild das Rechteck erneut, immer noch mit XOR, unter Verwendung der vorherigen Koordinaten. Dadurch wird das Rechteck entfernt und der Framebuffer bleibt intakt.
- Aktualisierung der Koordinaten des Rechtecks
Details dazu, wie man das "mit DirectX" macht, sind etwas schwieriger ... Ich glaube, DirectDraw, die "alte Schule" Weg der 2D in DirectX zu tun ist veraltet, so dass ich vermute, Sie müssen Direct3D verwenden. Leider bin ich mir bei den Details nicht sicher. Es könnte sein, dass Sie kein Glück haben, vordefinierte Funktionen für das XOR-Zeichnen zu finden, und dass Sie Ihre eigenen entwickeln müssen. Hoffentlich kann jemand genauere Angaben dazu machen. Bitte entschuldigen Sie, wenn Sie bereits mit der Rubberbanding-Theorie vertraut sind.
Sie benötigen zwei Punktvariablen (mit jeweils einer x- und y-Koordinate). Nennen wir sie FirstPoint und SecondPoint.
Beim Mousedown wird die aktuelle Mausposition in FirstPoint und SecondPoint gespeichert. Solange die Maus unten ist, wird bei jeder Bewegung SecondPoint mit der neuen Mausposition aktualisiert.
Dann jedes Bild, wenn die Maus unten ist, zeichnen ein Rechteck auf der Grundlage der beiden Ecken, FirstPoint und SecondPoint. Sie benötigen ein wenig Mathematik, um zu erkennen, ob sie oben links/unten rechts oder oben rechts/unten links sind und welche die richtige ist, aber dann zeichnen Sie einfach ein Rechteck zwischen ihnen oder zwei Dreiecke. Natürlich müssen Sie vor dem Zeichnen in den orthografischen (2D) Modus wechseln.
Ich bin mir bei der Antwort von unwind nicht sicher, ich weiß nicht einmal, wie man eine XOR-Operation durchführt, und es scheint zu kompliziert zu sein, es sei denn, man möchte ausdrücklich, dass das Rechteck ein Negativ des Hintergrunds ist (was die XOR-Operation meiner Meinung nach tun würde). Wenn Sie die Szene bei jedem Bild neu zeichnen, gibt es außerdem keinen Grund, eine dumme XOR-Operation durchzuführen, um das vorherige Rechteck zu löschen; es wurde bereits durch das Zeichnen des neuen Bildes überschrieben.
Ich persönlich würde es vorziehen, ein Rechteck mit einer soliden Kontur und einer durchsichtigen Füllung zu zeichnen; setzen Sie dazu die aktuelle Farbe auf einen Alphawert von vielleicht 128 (oder 0,5f) und zeichnen Sie das Rechteck zwischen den beiden Punkten, und ändern Sie dann den Polygon-Zeichenmodus auf Linie und setzen Sie die Farbe solid, und zeichnen Sie ein weiteres Rechteck.
Schließlich bin ich sicher, dass Sie auf das Gummiband reagieren möchten; wenn die Maus losgelassen wird, tun Sie, was Sie auf der Grundlage der FirstPoint und SecondPoint Variablen benötigen. Auch Ihre Zeichnung Code sollte nur das Rechteck zeichnen, während die Maus nach unten ist, so wird es aufhören, gezeichnet werden.