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

Aktuelle Zeit: Fr Jul 18, 2025 11:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jun 16, 2007 14:23 
Offline
DGL Member

Registriert: Fr Jun 15, 2007 18:20
Beiträge: 2
Hallo!

Ich kam irgentwie auf die Idee mich mal mit OpenGL zu beschäftigen und als Einstiegsprojekt wollte ich einen durchsichtigen Würfel erstellen, den man mit der Maus drehen kann. Dann hab ich hier mal im Forum geguckt und hier wurde schon ein Problem mit dem erstellen eines Würfels geschildert und ich habe mir gedacht, mach doch erstmal einen Würfel aus 12 Linien. Da wir gerade erst in der Schule angefangen haben uns mit Delphi zu beschäftigen sind meine Kenntnisse auch hier nicht sehr ausgeweitet und ich hatte erst so meine Probleme mit dem Einbinden eurer dglOpenGL Unit. Die Tutorials haben mir aber sehr weiter geholfen (dickes Lob!) und ich hab mich dann an den eigentlich OpenGL-Teil begeben.

Gezeichnet wird auf das Formular und der Würfel soll bei Programmstart in der Mitte sein. Man sollte dann mit der Maus den Würfel, ähnlich wie Google Earth drehen können, überlegt hatte ich mir hier die Koordinaten vom Ereignis MouseDown und MouseUp zu nehmen und sie zu Subtrahieren, es wird dann zwar erst nach dem MouseUp verschoben, aber etwas anderes ist mir nicht eingefallen.

Hier dann zwei Fragen:
Wie bekomme ich den Würfel in die Mitte und wie bleibt er beim drehen auf der Stelle?
Wie bekomme ich die Mauskoordinaten von Pixeln in die Einheiten, die OpenGl benutzt? (Im Forum habe ich nur von Einheiten in Pixeln gefunden)
Gibt es eine andere Möglichkeit den Würfel direkt mit der Mausbewegung zu verschieben?

Ich hoffe man konnte es lesen und einigermaßen verstehen.

Chris_Kuni


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 16, 2007 14:49 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Willkommen bei DGL

chris_kuni hat geschrieben:
Hier dann zwei Fragen:

Drei *hust*

chris_kuni hat geschrieben:
Wie bekomme ich den Würfel in die Mitte und wie bleibt er beim drehen auf der Stelle?

glLoadIdentity; glTranslatef(-x,0,0); Würfel rendern;
Ansonsten Tutorial Lektion 3 nochmal lesen.

chris_kuni hat geschrieben:
Wie bekomme ich die Mauskoordinaten von Pixeln in die Einheiten, die OpenGl benutzt? (Im Forum habe ich nur von Einheiten in Pixeln gefunden)

gluUnproject

chris_kuni hat geschrieben:
Gibt es eine andere Möglichkeit den Würfel direkt mit der Mausbewegung zu verschieben?

Nein, es gibt keine eingebaute Funktion. Im DGLSDK findest du aber ein Beispiel eines Würfels der sich so bewegen lässt.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 17, 2007 00:01 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Also ich hab das bei nem Programm von mir auch mit OnMouseDown gemacht, hab keine AHnung was in dem tut steht aber ich kann ja mal eben hier reinkopieren wie es bei mir aussieht (übrigens dreht er in Echtzeit und nicht erst nachdem man loslässt)

Code:
  1.  
  2. procedure TForm1.Free1Click(Sender: TObject);
  3. begin
  4. mouse_rotate := true;
  5. end;
  6.  
  7. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  8.   Shift: TShiftState; X, Y: Integer);
  9. begin
  10. if mouse_rotate = true then
  11.  begin
  12.  tmpx := x;
  13.  tmpy := y;
  14.  tmpangelx := angelx;
  15.  tmpangelz := angelz;
  16.  mouse_move := true;
  17.  end;
  18. end;
  19.  
  20. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  21.   Y: Integer);
  22. begin
  23. if mouse_move = true then
  24.  begin
  25.  angelx := tmpangelx + (tmpy - y);
  26.  angelz := tmpangelz + (tmpx -x);
  27.  end;
  28. end;
  29.  
  30. procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  31.   Shift: TShiftState; X, Y: Integer);
  32. begin
  33. mouse_move := false;
  34. end;
  35.  
  36. procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  37.   MousePos: TPoint; var Handled: Boolean);
  38. begin
  39. zoom := zoom -50;
  40. end;
  41.  
  42. procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  43.   MousePos: TPoint; var Handled: Boolean);
  44. begin
  45. zoom := zoom + 50;
  46. end;
  47.  
  48. procedure Tform1.cam(x,z,distance : integer);
  49. begin
  50. if angelx < x then angelx := angelx + 1;
  51. if angelx > x then angelx := angelx - 1;
  52. if angelz < z then angelz := angelz + 1;
  53. if angelz > z then angelz := angelz - 1;
  54. if zoom < distance then zoom := zoom + 2;
  55. if zoom > distance then zoom := zoom -2;
  56. if (round(angelx) = x) and (round(angelz) = z) and (round(zoom) = distance) then turning := false;
  57. end;
  58.  


cam wird in der Zeitroutine so aufgerufen:
Code:
  1.  
  2.  if turning = true then cam(destx,destz,destzoom);
  3.  


Ich habe das ganze geschreiben als ich mit 3D Sachen noch nicht viel Erfahrung hatte, vielleicht geht es auch viel einfacher, hoffe das alles bei ist was du brauchst, wenn es Verständnisprobleme gibt frag nach, dann schau ich nochmal wie das genau funzt.[/pascal]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 17, 2007 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
ich habe das ähnlich wie gucky auch im MouseMove gemacht (Echtzeit). Wobei ich meine Methode für weniger kompliziert halte. Vorweg: Du brauchst 3 globale (oder in der Private-Section der Form-Klasse) deklarierte Array-Variablen. Einmal für die Mouse-Position, einmal für den Status, welche Maustaste gedrückt ist, und dann noch die letztendliche Rotation:
Code:
  1. Var
  2.   mDrag : Array [0..2] of Boolean; // 0=links, 1=mitte, 2=rechts
  3.   mPos  : Array [0..1] of Integer; // 0=X, 1=Y
  4.   mRot  : Array [0..1] of Single;  // 0=Rotation um X Achse, 1=Rotation um Y-Achse



So, hier kommen noch die Event-Procedures:
Code:
  1. procedure TfGL.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2. begin
  3.   Case Button of
  4.     mbLeft   : mDrag[0] := true;
  5.     mbMiddle : mDrag[1] := true;
  6.     mbRight  : mDrag[2] := true;
  7.   End;
  8.  
  9.   mPos[0]:=X;
  10.   mPos[1]:=Y;
  11. end;
  12.  
  13.  
  14. procedure TfGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  15. begin
  16.   // Wenn linke Maustatse gedrückt -> Rotation berechnen
  17.   If (mDrag[0]) Then Begin  
  18.     mRot[0] := mRot[0] + (Y - mPos[1]);
  19.     mRot[1] := mRot[1] + (X - mPos[0]);
  20.  
  21.     // Bereich von 0-360
  22.     If mRot[0] < 0    Then mRot[0]:=mRot[0]+360;
  23.     If mRot[0] >= 360 Then mRot[0]:=mRot[0]-360;
  24.  
  25.     If mRot[1] < 0    Then mRot[1]:=mRot[1]+360;
  26.     If mRot[1] >= 360 Then mRot[1]:=mRot[1]-360;
  27.  
  28.     // neue Position speichern
  29.     mPos[0]:=X;
  30.     mPos[1]:=Y;
  31.   End;
  32. end;
  33.  
  34.  
  35. procedure TfGL.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  36. begin
  37.   Case Button of
  38.     mbLeft   : mDrag[0] := false;
  39.     mbMiddle : mDrag[1] := false;
  40.     mbRight  : mDrag[2] := false;
  41.   End;
  42. end;



Schliesslich noch das Rendern:
Code:
  1. ...
  2. gltranslatef(x, y, z);
  3. glrotatef(mRot[0], 1.0, 0.0, 0.0);
  4. glrotatef(mRot[1], 0.0, 1.0, 0.0);
  5. // Würfel rendern
  6. ...

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 17, 2007 10:48 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
gucky hat geschrieben:
cam wird in der Zeitroutine so aufgerufen:
Code:
  1.  
  2.  if turning = true then cam(destx,destz,destzoom);
  3.  


auf true zu prüfen ist ganz schlechter Stil...

Nimm lieber das dafür:

Code:
  1. if turning then cam(destx,destz,destzoom);

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 17, 2007 19:58 
Offline
DGL Member

Registriert: Fr Jun 15, 2007 18:20
Beiträge: 2
Erstmal vielen Dank für die Lösungsansätze, aber ich habe im Moment wenig Zeit mich damit zu beschäftigen, werde in ein paar Tagen darauf zurückkommen und bestimmt ein paar Fragen haben. :wink:

chris_kuni


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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 | 16 Queries | GZIP : On ]