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

Aktuelle Zeit: So Jul 13, 2025 17:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GL + 3DS-Dateien
BeitragVerfasst: So Apr 17, 2005 18:58 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 12:31
Beiträge: 14
N'abend zusammen :)

Ich habe es irgendwie geschafft einen 3D Planeten (3ds datei) in mein Programm einzubingen.
Allerdings erkennt man nicht viel... Es ist einfach zu dunkel... Ich habe sogar versucht in 3D Studio Max Licht
hinzuzufügen... Klappt nur nicht wirklich. Hier ist der Code, den ich benutze:
Code:
  1.  
  2. // ***************************************************************************
  3. // ********************** Loading a 3DS object *******************************
  4. // **********************   Juan José Montero  *******************************
  5. // ******************* juanjo.montero@telefonica.net *************************
  6. // *********************** Release 19/11/2003 ********************************
  7. // ***************************************************************************
  8.  
  9. unit Unit1;
  10.  
  11. interface
  12.  
  13. uses
  14.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  15.   Dialogs, AppEvnts, Unit3DS, OpenGL;
  16.  
  17. type
  18.   TForm1 = class(TForm)
  19.     ApplicationEvents1: TApplicationEvents;
  20.     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  21.     procedure FormResize(Sender: TObject);
  22.     procedure FormShow(Sender: TObject);
  23.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  24.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  25.       Shift: TShiftState; X, Y: Integer);
  26.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  27.       Y: Integer);
  28.   private
  29.     { Private declarations }
  30.   public
  31.     { Public declarations }
  32.     Model:T3DModel;
  33.     procedure Render;
  34.   end;
  35.  
  36. var
  37.   Form1: TForm1;
  38.  
  39. // ********************************** NEW NEW **********************************
  40.   Ax, Mx:Single;
  41.   Ay, My:Single;
  42. // ********************************** END NEW **********************************
  43.  
  44. implementation
  45.  
  46. uses UglContext;
  47.  
  48. {$R *.dfm}
  49.  
  50.  
  51. procedure TForm1.FormShow(Sender: TObject);
  52. begin
  53.   CreateGLContext(Handle);
  54.   Model:=T3DModel.Create;
  55.   Model.LoadFromFile('planet.3DS');
  56.   glEnable(GL_LIGHT0);
  57.   glEnable(GL_LIGHTING);
  58. end;
  59.  
  60. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  61. begin
  62.   Model.Free;
  63.   DestroyGLContext;
  64. end;
  65.  
  66. procedure TForm1.FormResize(Sender: TObject);
  67. begin
  68.   ResizeGL(Width, Height);
  69. end;
  70.  
  71. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  72.   var Done: Boolean);
  73. begin
  74.   Done:=False;
  75.   Render;
  76. end;
  77.  
  78. procedure TForm1.Render;
  79. begin
  80.   ClearGL;
  81.   ResetModelView;
  82. // ********************************** NEW NEW **********************************
  83.   glRotatef(Ax, 1, 0, 0);
  84.   glRotatef(-Ay, 0, 1, 0);
  85. // ********************************** END NEW **********************************
  86.   Model.Draw;
  87.   SwapGL;
  88. end;
  89.  
  90.  
  91. // ********************************** NEW NEW **********************************
  92. // When mouse is down, captures mouse position
  93. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  94.   Shift: TShiftState; X, Y: Integer);
  95. begin
  96.   Mx:=X;   // captures new positions ...
  97.   My:=Y;   // ... for next call to MouseMove event
  98. end;
  99.  
  100.  
  101. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  102.   Y: Integer);
  103. begin
  104.   if ssLeft in Shift then // when mouse moves with left button ....
  105.   begin
  106.     Ax := Ax + (Y-My)/2;  // ... calculate rotation for X ....
  107.     Ay := Ay + (X-Mx)/2;  // ... and Y
  108.     Mx:=X;                // and captures new positions ...
  109.     My:=Y;                // ... for next call to MouseMove event
  110.   end;
  111. end;
  112. // ********************************** END NEW **********************************
  113. end.
  114.  




Kann mir jemand helfen?


Viele Grüße

David

moderiert von Lossy eX: Code durch Pascaltags ersetzt.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 11:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schalt doch das OpenGL Licht ein. Gibt hier ein Tut dazu. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 12:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich bezweifele mal stark, dass die 3D Max Lichter in einem 3ds exportiert werden. Aber das spielt auch keine Rolle.

Das Problem welches du hast sind falsche bzw fehlende Lichtparameter. Licht hast du ja aktiviert. Du hast OpenGL aber nicht gesagt wie dein Licht aussehen soll.

Also mit Licht meine ich folgende beide Zeilen.
Code:
  1.   glEnable(GL_LIGHT0);
  2.   glEnable(GL_LIGHTING);


Wenn du diese auskommentierst bzw. durch
Code:
  1. glDisable(GL_LIGHTING);
ersetzt, dann ist das Licht aus. Entgegen dem logischen verständniss, dass dann gar nicht mehr zu sehen sein sollte ist dann aber alles zu 100% beleuchtet.

Licht Tutorial


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 14:10 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 12:31
Beiträge: 14
Das mit dem Licht ist verwirrend. Ich glaube, dass ich einen gravierenden Denkfehler mache.

Ich habe mal die beiden Funktionen (die ja in meinem Quelltext enthalten waren) auskommentiert.
Und siehe da, es ging... Nur habe ich keine Ahnung welche Kameraperspektive ich habe. Ich habe schon
mit verschiedenen Werten rumgespielt, aber ehrlichgesagt nichts geschafft.
Hier mein Quelltext:
Code:
  1.  
  2. implementation
  3.  
  4. uses UglContext;
  5.  
  6. {$R *.dfm}
  7.  
  8.  
  9. procedure TForm1.FormShow(Sender: TObject);
  10. begin
  11.   CreateGLContext(Handle);
  12.   Model:=T3DModel.Create;
  13.   Model.LoadFromFile('planet.3DS');
  14.  
  15.  
  16. //  glEnable(GL_LIGHTING);          // Verdrehte Funktion?
  17. //  glEnable(GL_POSITION);          // Verdrehte Funktion?
  18.  
  19. end;
  20.  
  21. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  22. begin
  23.   Model.Free;
  24.   DestroyGLContext;
  25. end;
  26.  
  27. procedure TForm1.FormResize(Sender: TObject);
  28. begin
  29.   ResizeGL(Width, Height);
  30. end;
  31.  
  32. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  33.   var Done: Boolean);
  34. begin
  35.   Done:=False;
  36.   Render;
  37. end;
  38.  
  39. procedure TForm1.Render;
  40. begin
  41.   ClearGL;
  42.   ResetModelView;
  43. // ********************************** NEW NEW **********************************
  44.   glRotatef(Ax, 1, 0, 0);
  45.   glRotatef(-Ay, 0, 1, 0);
  46. // ********************************** END NEW **********************************
  47.   Model.Draw;
  48.   SwapGL;
  49. end;
  50.  
  51.  
  52. // ********************************** NEW NEW **********************************
  53. // When mouse is down, captures mouse position
  54. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  55.   Shift: TShiftState; X, Y: Integer);
  56. begin
  57.   Mx:=X;   // captures new positions ...
  58.   My:=Y;   // ... for next call to MouseMove event
  59. end;
  60.  
  61.  
  62. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  63.   Y: Integer);
  64. begin
  65.   if ssLeft in Shift then // when mouse moves with left button ....
  66.   begin
  67.     Ax := Ax + (Y-My)/2;  // ... calculate rotation for X ....
  68.     Ay := Ay + (X-Mx)/2;  // ... and Y
  69.     Mx:=X;                // and captures new positions ...
  70.     My:=Y;                // ... for next call to MouseMove event
  71.   end;
  72. end;
  73. // ********************************** END NEW **********************************
  74.  
  75.  
  76. procedure TForm1.Timer1Timer(Sender: TObject);
  77. begin
  78.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  79.  glMatrixMode(GL_PROJECTION);
  80.  glLoadIdentity;
  81.  gluPerspective(strtoint(edit1.Text), ClientWidth/ClientHeight, 1, 1000);
  82.  edit1.Text := inttostr(strtoint(edit1.Text) +1);
  83. end;
  84.  
  85. end.


Ich habe auch noch die Funktionen GlScale, GlMatrixMode ausprobiert... Irgendwie werde ich daraus nicht schlau.
Ich hoffe, dass ihr mir helfen könnt, und mit mir Geduld habt. :)

Viele Grüße

David




Naja und die exe inclusive allem anderen zum ausprobieren habe ich direkt in den Anhang gelegt


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 15:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
glEnable akzeptiert erstmal überhaupt gar niemals nicht GL_POSITION. Das is ne Konstante fürs Licht.

Was genau willst du denn so richtig wissen?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 17:05 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 12:31
Beiträge: 14
Ich möchte gerne wissen, wie die Kameraposition gewählt wird, so dass ich den ganzen Planeten sehen kann.
Und von da an möchte ich beispielsweise per "+ -" heran- und wegzoomen. Der Planet sollte nicht das ganze
Fenster einehmen, sondern alles sichtbar sein. Das ist was ich möchte.


Viele Grüße

David


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 17:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
das geht über gltranslate und glrotate, die vor dem zeichnen(innerhalb der renderschleife) aufgerufen werden. du verschiebst/rotierst damit zwa r die ganze szene - aber nach dem relativitätsprinzip ist das so, als würdest du die kamera verschieben. also gltranslate(0,0,-10) sollte mal n bisschen rauszoomen. und wenn du anstatt -10 ne globale variable nimmst, dann kannst du das auch zur laufzeit verändern.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 22:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
luketheduke hat geschrieben:
- aber nach dem relativitätsprinzip ...
Dein Beitrag zum Einsteinjahr :mrgreen:

Ja. Luke hat soweit recht. Du must aber wohl selber probieren. Einen Wert wird dir hier niemand sagen können, um den du verschieben musst. Du kannst ja mal das Forum nach "Idealen Zoom" oder so durchsuchen. Da hat Nico (glaub ich :oops: ) mal eine Nette Skizze gemacht... (gehört eigentlich glatt ins Wiki wenn das funktioniert....8) )

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


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


Wer ist online?

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