Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:53

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Aug 19, 2009 20:46 
Offline
DGL Member

Registriert: Mo Aug 17, 2009 20:59
Beiträge: 4
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.

Hier ist ein Screenshot des Zeichenfensters:
- http://s195130324.online.de/bild123.gif

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 ?


(Ich programmiere OpenGL unter C++.NET)


Ich hoffe ihr könnt mir weiterhelfen.


Vielen Dank,
mfg hanzhanz








--------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 19, 2009 21:30 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Naja... eigentlich ist das was du machen willst ja eher Vectorgrafik. Spontan fiele mir auch nicht ein, wie man das machen sollte.

Wie machst du das mit den Linienbreiten? glLineWidth?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 19, 2009 21:47 
Offline
DGL Member

Registriert: Mo Aug 17, 2009 20:59
Beiträge: 4
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).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 20, 2009 13:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Anstatt 8 Linien zu nehmen solltest du den Rahmen dann aus Flächenprimitiven wie Quads oder Triangles zusammen setzen. Ich denke das hilft der GraKa.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 20, 2009 15:19 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 20, 2009 22:51 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 21, 2009 00:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 04, 2008 23:15
Beiträge: 39
Wohnort: Oberösterreich
Programmiersprache: ObjPas, C, DivASM
Zitat:
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.

Code:
  1.  
  2. glPushMatrix;
  3. glTranslatef(FrameCenterX, FrameCenterY, 0);
  4. glScale(0, 0, -Zoom);
  5.  
  6. // Rahmen zeichnen
  7.  
  8. glPopMatrix;
  9.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 21, 2009 07:40 
Offline
DGL Member
Benutzeravatar

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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 21, 2009 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 04, 2008 23:15
Beiträge: 39
Wohnort: Oberösterreich
Programmiersprache: ObjPas, C, DivASM
Oh, stimmt natürlich.

Mir ist da noch ein Fehler aufgefallen. Ein glScale mit 0 ist auch nicht so toll.

Code:
  1.  
  2. glScale(1, 1, 1 / Zoom);
  3.  


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]