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

Aktuelle Zeit: Mi Jul 16, 2025 12:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 29, 2012 13:36 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
Servus,

wollte eigentlich vermeiden hier nachzufragen da ich selber drauf kommen wollte,
aber leider bekomme ich das ganze nicht hin.

Also ich habe ein Objekt das ich an der X Achse mit der Maus verschieben möchte.
Hier im Forum habe ich gelesen das man die Typen umbedingt einhalten muss. Das habe
ich auch schon festtellen können.

Nun ein wenig Code
Code:
  1.  
  2. type
  3.   TVertexD = record
  4.     x,y,z : GLdouble;
  5.   end;
  6.  
  7. var
  8.   fMausGLAlt,
  9.   fMausGLNeu : TVertexD;
  10.   fwinz : single;
  11.  


Code:
  1.  
  2. procedure TfrmMain.Panel3DMouseDown(Sender: TObject; Button: TMouseButton;
  3.   Shift: TShiftState; X, Y: Integer);
  4. begin
  5.   GetCursorPos(maustmp);
  6.   fMausGLAlt := GetOpenGLPos(maustmp.X, maustmp.Y, fwinz, true);
  7. end;
  8.  


Code:
  1.  
  2. procedure TfrmMain.Panel3DMouseMove(Sender: TObject; Shift: TShiftState; X,
  3.   Y: Integer);
  4. var
  5.   ms : TPoint;
  6. begin
  7.   GetCursorPos(ms);
  8.   fMausGLNeu := GetOpenGLPos(ms.X, ms.Y, fwinz, false);
  9.   Diff.x := fMausGLNeu.x - fMausGLAlt.x;
  10.   Diff.y := fMausGLNeu.y - fMausGLAlt.y;
  11.   Diff.z := fMausGLNeu.z - fMausGLAlt.z;
  12.   fMausGLAlt := fMausGLNeu;
  13.  
  14.   Obj.MoveX(Diff.x);
  15. end;
  16.  


Code:
  1.  
  2. function TfrmMain.GetOpenGLPos(X, Y: Integer; var WinZ : Single; ReadZ : Boolean): TVertexD;
  3. var
  4.   viewport:   TGLVectori4;
  5.   modelview:  TGLMatrixd4;
  6.   projection: TGLMatrixd4;
  7.   {winZ,} winY:  Single;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview );
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @projection );
  11.   glGetIntegerv(GL_VIEWPORT, @viewport );                
  12.  
  13.   winY := viewport[3] - y;                                        
  14.   if ReadZ then
  15.     glReadPixels(X, Round(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );
  16.   gluUnProject(X, winY, winZ,
  17.                modelview, projection, viewport,                        
  18.                @Result.x, @Result.y, @Result.z);                      
  19. end;
  20.  


Eigentlich ganz leicht, mehr oder weniger :).
Habe die Cam.z auf -30 stehen und in der Diff.x steht 0.001.
Verschieben geht zwar aber halt nicht da wo die Maus ist.....

gruß


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 29, 2012 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Oah, willkommen bei einem der größten Probleme in 3D (zumindest bei mir so)
Ich hab da ewig rumgesch*** bis ich auf eine graden Zweig gekommen bin, aber alles der Reihe nach:

Hier mal eine einfache Funktion die die X-Y-Position der Maus in 3D-Koordinaten der aktuellen Szene rechnet. Das Ergebnis ist ein GLFloat-Array mit den 3 Koordinatenzahlen.
Du musst halt schaun das das aufgerufen wird NACHDEM du die Kameraposition schon gesetzt hast damit OpenGL weiß was wo ist.


Code:
  1. function to3d(x, y: integer): TGLVectord3;
  2. var
  3.   viewport: TGLVectori4;
  4.   modelview: TGLMatrixd4;
  5.   projection: TGLMatrixd4;
  6.   Z: TGLFloat;
  7.   Y_new: integer;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  11.   glGetIntegerv(GL_VIEWPORT, @viewport);
  12.   Y_new := viewport[3] - y;
  13.   glReadPixels(x, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z);
  14.   gluUnProject(x, Y_new, Z, modelview, projection, viewport, @result[0],
  15.     @result[1], @result[2]);
  16. end;



Dasselbe rückwärts, nur für den Fall:

Code:
  1. function to2d(x, y, Z: real): TGLVectord3;
  2. var
  3.   viewport: TGLVectori4;
  4.   modelview: TGLMatrixd4;
  5.   projection: TGLMatrixd4;
  6. begin
  7.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  8.   glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);
  10.   gluProject(x, y, Z, modelview, projection, viewport, @result[0], @result[1],
  11.     @result[2]);
  12. end;


Und fürs Verschieben der Objekte: Da würd ich das mit den in-3D-Koordinaten-berechnen nur nehmen wenn du ein Objekt im Grund, Auf oder Kreuzriss verschiebst!!!! Wenn du zum Beispiel von oben auf das Objekt schaust, es verschiebst dann stimmt zwar die links-rechts-Position unter der Maus aber die Höhe auf der das Objekt liegt sucht sich OpenGL oft beliebig dann raus und plötzlich liegt dein Würfel auf -200 oder so^^ Da kannst du dir dann das berechnen der Höhenkoordinate sparen!


Nur da würd ich dieses Verfahren benutzen, und halt immer nur für die 2 jeweils benutzten Koordinaten, xy xz oder yz.
Beim freien Draufschaun auf das Objekt hab ich mir eine Funktion geschrieben die quasi eine Linie erstellt die parallell zur Kamera liegt und durch das Objekt geht, auf der wird dann das Objekt verschoben, sowohl nach oben als auch nach links-rechts^^. Aber den code dafür poste ich nur nach Anfrage weil der doch etwas Platz einnimmt^^

lg IDA

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 29, 2012 18:55 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
hey danke für die info.
Nach dem ich die Szene gerendert habe bekomme ich auch brauchbare infos.

Jetzt ist das Objekt aber schneller wie die Maus.
Mit deiner func to3d habe ich geprüft ob x,y auch wieder richtig zurück kommen,
was der Fall war.

Eventuell noch ne idee?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 29, 2012 19:01 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Guck mal in mein Projekt rein. Vielleicht findest Du dort Anregungen.
CamerAH
http://www.delphigl.com/forum/viewtopic.php?f=13&t=9811


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 01, 2012 12:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich mache es folgendermaßen:

1) Von den Screen-Space Koordinaten der Maus (von letztem Zeitintervall Mn und diesem Mm) hole dir dir 3D-Positionen in der Welt (wie in den Posts oben beschrieben) Letzte 3D-Position: Pn, neue: Pm
2) Aus der vorherigen 3D-Mausposition Pn berechne die Ebene auf der du das Objekt bewegen willst (Die Ebene geht durch diesen Punkt), z.B auf Untergrund entlang
3) Hole dir die Rays von den Screen-Space Mauspositionen zu Pn und Pm, von der Kamera aus gesehen: Rn und Rm. Das geht indem du mit gluUnProject die Positionen an Mn/Mm auf der Near/Far Plane holst
4) Schneide Rn und Rm mit der Ebene die du ausgerechnet hast, das ergibt die Schnittpunkte Sn und Sm
5) Neue Position des Objekts: Alte Position + (Sn - Sm)

Das funktioniert bei mir wunderbar. Ich benutze es in einem Editor um Objekte mit der Maus zu verschieben (und in abgewandelter Art, zu rotieren).


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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 ]