Hallo,
ich arbeite gerade an einem 2D-Zeichenprogramm. Mit dem Programm soll man Linien zeichnen können.
Durch eine Zoom-Funktion soll man die Linien grösser / kleiner darstellen können.
Wenn man mit der Maus ans Ende einer Linie kommt, dann möchte ich gerne einen roten Rahmen um
das Linienende zeichnen (wie auf dem Screenshot). Der Rahmen soll dabei immer 11 Pixel breit / hoch sein.
Ich habe das ganze auch schon programmiert, und es funktioniert auch. Nur habe ich das Problem, dass sich
beim Zoomen der Linien auch die Grösse des roten Rahmens ändert. Werden die Linien kleiner dargestellt, so
wird der rote Rahmen auch kleiner, ...
Was kann ich da machen, dass der Rahmen immer mit einer Breite von 11 Pixel dargestellt wird ?
Hallo,
# Wie machst du das mit den Linienbreiten?
Meinst du die Linienbreite des roten Rahmens ? Diese sollte immer 2 Pixel breit sein.
Den roten Rahmen habe ich bisher immer aus 8 einzelnen Linien gezeichnet (Jede
Linie mit einer Linienbreite von 1 Pixel).
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wegen deinem eigentlichen Resizeproblem. OpenGL ist eine Statemaschine. Wenn du sagst jetzt bitte alles doppelt so groß zeichen (glScale), dann betrifft das ALLES was danach gezeichnet wird. Also auch deinen Rahmen. Um immer einen einheitliche Rahmengröße zu haben musst du dafür sorgen, dass das Zeichnen von ihnen nicht durch dein Scale beeinflusst wird. Dazu gibt es unter anderem verschiedene Möglichkeiten (mehr fallen mir gerade nicht ein). Welche die bessere für dich ist kann ich gerade nicht abschätzen.
glPushMatrix/glPopMatrix auf die ModelViewMatrix. Allerdings würden dadurch auch Transformationen und Rotationen mit zurückgesetzt. Im ungünstigsten Fall müsstest du die skalierte Position deines Rahmens selber berechnen.
Du könntest auch kurz vor dem Zeichnen des Rahmens 1/Zoom Skalieren. Dann solltest du wieder eine Skalierung von 1 bekommen. Falls danach noch Geometrie kommt müsstest du wieder mit Zoom skalieren, da die Geometrie danach sonst falsch skaliert würde.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Naja, das wird so nicht gehen, denn du kannst die "Position" deiner Linie nicht unabhängig von der "Dicke" skalieren.
Einzige Möglichkeit, die mir jetzt einfällt, wäre wirklich die Position neu zu berechnen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Naja, das wird so nicht gehen, denn du kannst die "Position" deiner Linie nicht unabhängig von der "Dicke" skalieren. Einzige Möglichkeit, die mir jetzt einfällt, wäre wirklich die Position neu zu berechnen.
Wieso? Den "Nullpunkt" der Modelviewmatrix in die Mitte des Rahmens verschieben, die Skalierung zurücksetzten, den Rahmen zeichnen und wider die alte Modelviewmatrix herstellen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also wenn die Linien mit Quads gezeichnet würde. Was eventuell durchaus machmal Sinn macht. Dann würden sie mitskaliert werden. Wenn die Linien aber richtige Linien sind, dann natürlich nicht. Dann wird die Dicke nur durch glLineWidth beeinflusst. Wenn du allerdings eine dicke Linie mit mehreren Linien zusammensetzt, dann würden die Abstände zwischen den einzelnen Linien mit skaliert werden. Was sich dann optisch auch in einer Art Skalierung der Linienstärke äußern kann.
-Zoom: Mit einer negativen Skalierung kannst du Dinge auf den Kopf stellen. Um etwas kleiner zu machen muss der Wert zwischen 0-1 liegen. Um etwas größer zu machen dann Größer 1. Also für deinen Fall müsste 1/Zoom sein. Aber sonst sollte das was du da gepostet hast schon passende Dienste verrichten. Wenn mir meine Vorstellungskraft nicht gerade ein Schnippchen schneidet.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.