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

Aktuelle Zeit: Mo Jul 14, 2025 21:42

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Maus Pos nach GlPos
BeitragVerfasst: Mi Sep 10, 2003 10:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
hi,
habe gerade versucht mit der Funktion
Code:
  1.  
  2. Function WinToGl(posX, posY, posZ: Double;oldVertex : TVertex) : TVertex;
  3. var
  4.   ModelView, Projection: TMatrix4d;
  5.   Viewport: TVector4i;
  6.   ObjX, ObjY, ObjZ: TGLDouble;
  7. begin
  8.   result := oldVertex;
  9.   glGetDoublev(GL_MODELVIEW_MATRIX,@ModelView);
  10.   glGetDoublev(GL_PROJECTION_MATRIX,@Projection);
  11.   glGetIntegerv(GL_VIEWPORT,@Viewport);
  12.   gluUnProject(posX,Viewport[3] - posY - 1,posZ,ModelView,Projection,Viewport,@ObjX,@ObjY,@ObjZ);
  13.   Result.X:=ObjX;
  14.   Result.Y:=ObjY;
  15.   Result.Z:=ObjZ;
  16. end;
  17.  

die ich im FAQ gefunden habe und ein wenig abgeändert habe
doch wenn ich diese Funktin jetzt aufrufe so
Code:
  1.  
  2.     NMPos := Mouse.CursorPos;
  3.     //Vertex verschieben
  4.     if VerticesDraw.VertexIndex <> -1 then begin
  5.       V := VerticesDraw.GetVertex(VerticesDraw.VertexIndex);
  6.       v := GetMousePos(NMPos.X,NMPos.Y,0,v);
  7.       VerticesDraw.UpdateVertex(VerticesDraw.VertexIndex,v);
  8.     end;
  9.  

dann klappt das nicht richtig. Wieso habe doch alles richtig gemacht oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 11:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das geht deshalb nicht, weil dein PosZ = 0 ist.Du musst gluUnproject allerdings einen gültigen Z-Wert mitgeben, wenn du ein brauchbares Ergebnis geliefert bekommen willst.
Deshalb musst du vor dem Aufruf von gluUnproject erstmal die Z-Koordinate unter dem Mauscursor auslesen :
Code:
  1.  glReadPixels(MausX,MausY,  1,1, GL_DEPTH_COMPONENT, GL_FLOAT, @MausZ);

Dann musst du MausZ an gluUnproject übergeben, und erhälst dann (bei gültigem Z-Pufferinhalt) auch ein brauchbares Ergebnis.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
MausZ ist bei immer 0. Ich muss wohl noch dazu sagen das ich auf einem 2D Fenster mit der Maus bin und das zeichne ich ja nicht mit OpenGl, kann es daran liegen. Aber eigentlich ja nicht oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 12:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
MausZ ist bei immer 0. Ich muss wohl noch dazu sagen das ich auf einem 2D Fenster mit der Maus bin und das zeichne ich ja nicht mit OpenGl, kann es daran liegen. Aber eigentlich ja nicht oder?


Ich trau mich gar nicht zu fragen ob der ernst gemeint war :shock:
Wenn du über eine gl-Funktion etwas auslesen willst (u.a. Tiefeninformationen), musst das doch auf einem gültigen Renderkontext funktionieren...dein normales Windows-Fenster hat aber doch garkeinen Renderkontext und somit auch keinen Tiefenpuffer aus dem diese Infos herausgelesen werden können...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ja war es :oops: habe mal wieder falsch gedacht. Aber jetzt ist es ja klar.
Aber wie soll ich die 2D Koordinaten in GL Koordinaten umwandeln. so?
Code:
  1.  
  2.       v.Fx := (NMPos.X/FZoom) - ScrollBarZoomX.Position/FZoom;
  3.       v.FY := (NMPos.Y/FZoom) - ScrollBarZoomY.Position/FZoom);
  4.  

Mit x geht es aber nicht mit y
Fzoom=Zoom Faktor
ScrollBarZoomX und ScrollBarZoomY sind scrollbars um das Level zu verschrieben. Min = -100 Max = Form.Width + 100


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 12:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wie du die Koordinaten umrechnest kann ich dir nicht sagen.Das hängt davon ab, wie du die Sache mit den Scrollbalken behandelst, und wie du die Koordinaten deines OpenGL-Viewportes via glOrtho setzt.

Allerdings stellt sich mir die Frage, warum du die 2D-Koordinaten nach GL wandeln musst.Denn da gibts doch sicherlich ne bessere Alternative, denn das was du da vorhast hab ich im ZornEdit auch nicht gebraucht.
Beschreib also mal bitte genauer was du vorhast, und wir finden dann evtl. ne viel einfachere Lösung.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 13:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Ich wollte das so machen. Wenn ich mit meiner Maus (2D Front XY) einen Vertex oder ein Face anklicke möchte ich den vertex mit der Maus verschieben können an der Position an der sich die Maus befindet.

//Edit
Alle meine vertices sind in einer Liste. Wenn ich die vertices auf meinem 2D Fenster zeichne wandle ich die Koordinaten in Wondows Koordinaten um. Und wenn ich den vertex verschieben will muss ich ja wieder von windows nach opengl umrechnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 13:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dazu brauchst du aber auf keinen Fall sowas wie gluUnproject.Das geht nämlich ganz einfach.Ich poste mal ein kurzes Schnipsel Quellcode, von der Methode die ich in ZornEdit nutze :
Code:
  1. MausX := Mouse.X;
  2. MausY := ClientWidth-Mouse.Y;
  3. ...
  4. for i := 0 to High(VertexListe) with
  5.  Vertex[i] do
  6.    begin
  7.    Pos2D := Point(Round(z*10*Zoom)-ScrollBar1.Position, Round(y*10*Zoom)+ScrollBar2.Position);
  8.    if (MausX>Pos2D.x-3) and (MausX<Pos2D.x+3) and (MausY>Pos2D.y-3) and (MausY<Pos2D.y+3) then
  9.      SelectedVertex := @Vertex[i];
  10.    end;
  11.  


Wie du siehst ist das also recht einfach, und ich hoffe mal das dir obiger Quellcode bei deinem Problem weiterhilft.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
danke erst mal :D . Mal schauen was ich damit anfagen kann .


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 » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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.009s | 15 Queries | GZIP : On ]