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

Aktuelle Zeit: Fr Jul 18, 2025 21:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Dez 11, 2006 19:45 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hallo zusammen,

ich beschäftige mich seit dem Wochenende mit OpenGL und hab auch schon ein wenig hinbekommen können. Aber was mir absolut nicht gelingen will, ist eine realistische Ansicht der Tennisbälle.

Ich habe ein ganz normal Textur über die Spheren gelegt. Wenn ich mit Licht arbeiten muss, dann frage ich mich wie. Ich habe alle parameter verstellt und nichts ändert sich.

Kann mir jemand ein wenig helfen ?

hier ein Screenshot und ein wenig Source:


Bild

Code:
  1.  
  2. var
  3.   Form1: TForm1;
  4.   Palette: HPALETTE;
  5.   rot:           array[0..3] of GLFloat = (1, 0, 0, 1);
  6.   Gruen:         array[0..3] of GLFloat = (0, 1, 0, 1);
  7.   Weiss:         array[0..3] of GLFloat = (1, 1, 1, 1);
  8.   Schwarz:       array[0..3] of GLFloat = (0, 0, 0, 1);
  9.   Grau:          array[0..3] of GLFloat = (0.5 , 0.5, 0.5, 1);
  10.   LichtPosition: array[0..3] of GLFloat = (-10, 10, 30, 1);
  11.   LichtRichtung: array[0..3] of GLFloat = (-10, 10, 30, 0);
  12.   Viewport: TVector4i;
  13.   Treffer: Boolean;
  14.   Ball: TBall;
  15.   ModellMatrix: TMatrix4d;
  16.   ProjectionMatrix: TMatrix4d;
  17.   mZ: Single;
  18.   myTex: Cardinal;
  19.   TexturNamen:    array [1..2] of GLuint;
  20.   PBitmap: Pointer;
  21.   Quadric : PGLUQuadric;
  22.  
  23. const
  24.   BufSize = 512;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. { TForm1 }
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. var
  34.   Breite: Integer;
  35.   Hoehe: Integer;
  36.   Tiefe: Integer;
  37. begin
  38.   mZ := 0;
  39.   BallListe := TBallListe.Create;
  40.  
  41.   InitOpenGL;
  42.   DC := GetDC(Panel1.Handle);
  43.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 0, 0, 0, 0, Palette);
  44.   wglMakeCurrent(DC, RC);
  45.  
  46.   glEnable(GL_DEPTH_TEST);
  47.  
  48.   glEnable(GL_LIGHT0);
  49.   glEnable(GL_LIGHTING);
  50.  
  51.   glLightfv(GL_LIGHT1, GL_AMBIENT, @Rot);
  52.   glLightfv(GL_LIGHT1, GL_DIFFUSE, @Rot);
  53.   glLightfv(GL_LIGHT1, GL_SPECULAR, @Rot);
  54.   glLightfv(GL_LIGHT1, GL_POSITION, @LichtPosition);
  55.  
  56.   glLightfv(GL_LIGHT2, GL_AMBIENT, @Rot);
  57.   glLightfv(GL_LIGHT2, GL_DIFFUSE, @Rot);
  58.   glLightfv(GL_LIGHT2, GL_SPECULAR, @Rot);
  59.   glLightfv(GL_LIGHT2, GL_POSITION, @LichtRichtung);
  60.  
  61.   glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1);
  62.  
  63.   glGenTextures(2,@TexturNamen);
  64.  
  65.   CreateImageBMP('C:\BallNeu.bmp',Breite,Hoehe,PBitmap);
  66.   glBindTexture(GL_TEXTURE_2D,TexturNamen[2]);
  67.   glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,Breite,Hoehe,0,
  68.                GL_RGB,GL_UNSIGNED_BYTE ,PBitmap);
  69.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  70.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  71.   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
  72.   gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,Breite,Hoehe,GL_RGB,GL_UNSIGNED_BYTE,PBitmap);
  73. end;
  74.  
  75. procedure TForm1.DrawScene;
  76. var
  77.   i: Integer;
  78. begin
  79.   glPushAttrib(GL_ALL_ATTRIB_BITS);
  80.   glEnable(GL_DEPTH_TEST);
  81.   glEnable(GL_Normalize);
  82.  
  83.   gluPerspective(45, Panel1.Width/Panel1.Height, 1, 2000);
  84.  
  85.   Quadric:=gluNewQuadric;
  86.   gluQuadricDrawStyle(Quadric, GLU_FILL);
  87.   gluQuadricTexture(Quadric, GL_TRUE);
  88.   glEnable(GL_TEXTURE_2D);
  89.   glMatrixMode(GL_TEXTURE);
  90.   glLoadIdentity;
  91.  
  92.   glEnable(GL_BLEND);
  93.   glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
  94.  
  95.   glBindTexture(GL_TEXTURE_2D,TexturNamen[2]);
  96.  
  97.   glMatrixMode(GL_MODELVIEW);
  98.   glLoadIdentity;
  99.  
  100.   gluLookAt(0, 0, 0, 0, 0, -100, 0, 1, 0);
  101.  
  102.   for i := 0 to BallListe.Liste.Count - 1 do
  103.   begin
  104.     TBall(BallListe.Liste.Items[i]).DrawBall;
  105.   end;
  106. end;
  107.  
  108. { TBall }
  109.  
  110. procedure TBall.DrawBall;
  111. begin
  112.   glDisable(GL_LIGHT0);
  113.   glEnable(GL_LIGHT1);
  114.   glDisable(GL_LIGHTING);
  115.  
  116.   glLoadName(Nummer);
  117.  
  118.   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, @Weiss);
  119.   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @Schwarz);
  120.   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20);
  121.  
  122.   glPushMatrix;
  123.  
  124.   glTranslatef(Position[0], Position[1], Position[2]);
  125.  
  126.   GLUSphere(Quadric, 5, 40, 40);
  127.  
  128.   glPopMatrix;
  129. end;
  130.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 22:13 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wenn du den Ball renderst deaktivierst du mit glDisable(GL_LIGHTING) das Licht. Somit kann sich nichts mehr an dem Licht verändern ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 23:05 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Selbst wenn ich das Licht anschalte verändert sich nichts

Code:
  1.  
  2. procedure TBall.DrawBall;
  3. begin
  4.   glEnable(GL_LIGHT0);
  5.   glEnable(GL_LIGHT1);
  6.   glEnable(GL_LIGHTING);
  7.  
  8.   glLoadName(Nummer);
  9.  
  10.   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, @Weiss);
  11.   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @Schwarz);
  12.   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20);
  13.  
  14.   glPushMatrix;
  15.  
  16.   glTranslatef(Position[0], Position[1], Position[2]);
  17.   glRotatef(Angle, 10, 5, 0);
  18.  
  19.   GLUSphere(Quadric, 5, 40, 40);
  20.  
  21.   glPopMatrix;
  22. end;
  23.  


Wenn sich doch wenigstens ein wenig was verändern würde, dann wüsste ich ja in welche Richtung ich weiter nachdenken muss. Ich weiß nicht mehr weiter. Hab so viele Sachen ausprobiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 23:30 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Mir ist augefallen, sobald ich glEnable(GL_TEXTURE_2D) ausführe werden anscheinend keine Lichtberechnungen mehr berücksichtigt.

Kommentier ich die Zeile aus sehe ich rote Bälle mit Lichtberechnung. Schalte ich das Licht aus sind die Bälle weiß. Aberdas ist ja auch richtig so und ich versteh auch warum. Aber warum die Bälle bei glEnable(GL_TEXTURE_2D) und enable(GL_LIGHTING) nur wie 2D-Bilder aussehen versteh ich nicht.

Hier die Bälle mit auskommentierter glEnable(GL_TEXTURE_2D) Zeile:

Bild

Code:
  1.  
  2. procedure TBall.DrawBall;
  3. begin
  4.   glDisable(GL_LIGHT0);
  5.   glEnable(GL_LIGHT1);
  6.   glEnable(GL_LIGHTING);
  7.  
  8.   glLoadName(Nummer);
  9.  
  10.   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, @Weiss);
  11.   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @Schwarz);
  12.   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 1);
  13.  
  14.   glPushMatrix;
  15.  
  16.   glTranslatef(Position[0], Position[1], Position[2]);
  17.   glRotatef(Angle, 10, 5, 0);
  18.  
  19.   glutSolidSphere(5, 40, 40);
  20.  
  21.   glPopMatrix;
  22. end;
  23.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 07:09 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Versuch mal glEnable(GL_COLOR_MATERIAL), das ist eine der Möglichkeiten Texturen mit Licht darzustellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

die Normalen sind bei Quadrics nicht standardmässig aktiviert.

Versuchs mal mit

Code:
  1. gluQuadricNormals(Quadric, GLU_SMOOTH);


;)

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 12:25 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Vielen Dank schon mal für eure Antworten.

Da ich noch auf Arbeit bin kann ich eure Ideen erst ab 19.00 Uhr ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 18:14 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hallo!

Also, ich habe eure Ideen ausprobiert und keine von beiden sorgt für die kleinste Veränderung in der Scene.

Ich habe mal die pas und die dfm und alle erforderlichen Dateien hochgeladen.

Währe super, wenn sich die mal jemand anschauen kann.

Besten Dank schon einmal.

Hier der Link


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 19:25 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
schön dass du die glut32.dll reingepackt hast, aber die dpr hast du vergessen ;)

ist aber kein problem, diese hier geht:
Code:
  1.  
  2. program Ball;
  3.  
  4. uses
  5.   Forms,
  6.   Unit1 in 'Unit1.pas' {Form1};
  7.  
  8. {$R *.res}
  9.  
  10. begin
  11.   Application.Initialize;
  12.   Application.CreateForm(TForm1, Form1);
  13.   Application.Run;
  14. end.
  15.  


der header ist auch net mehr so aktuell, lade dir mal bitte die dglopengl.pas findest du im wiki und ob glut noch so aktuell und gebräuchlich ist, weiß ich auch net \";)\"

was mich stutzig macht an deine, code ist das hier:

Code:
  1.   glEnable(GL_LIGHT0);
  2.   glEnable(GL_LIGHTING);
  3.  
  4.   glLightfv(GL_LIGHT1, GL_AMBIENT, @Rot);
  5.   glLightfv(GL_LIGHT1, GL_DIFFUSE, @Rot);
  6.   glLightfv(GL_LIGHT1, GL_SPECULAR, @Rot);
  7.   glLightfv(GL_LIGHT1, GL_POSITION, @LichtPosition);
  8.  
  9.   glLightfv(GL_LIGHT2, GL_AMBIENT, @Rot);
  10.   glLightfv(GL_LIGHT2, GL_DIFFUSE, @Rot);
  11.   glLightfv(GL_LIGHT2, GL_SPECULAR, @Rot);
  12.   glLightfv(GL_LIGHT2, GL_POSITION, @LichtRichtung);
  13.  


du aktivierst light0 und setzt werte für light1 und light2, das kann garnet klappen und wozu hast du einmal licht position und einmal licht richtung ? bei zwei verschiedenen lichtern die du garnet aktivierst ?

ebenso, dass du alles auf rot setzt, ich glaube dadurch wirst du kein richtiges licht erhalten.

mfg


Zuletzt geändert von Seth am Di Dez 12, 2006 19:30, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 19:27 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Die brauch man doch nun wirklich nicht.

Der Source kann doch in ein von dir neu erstelltes Projekt kopiert werden. --- Aber ich kann auch alles komplett hochladen.

mom....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 19:31 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
guck dir nochmal an was ich oben editiert habe, vielleicht sticht dir dann dein fehler schon ins auge


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 19:34 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hier der Link zum komletten Projekt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 19:38 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
der eigentliche fehler liegt in dieser zeile:
Code:
  1.  
  2. //  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
  3.  

die musst du auskommentieren, sonst hast du nicht viel vom licht \";)\"

so sieht das bei mir momentan aus und es geht:
Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, StdCtrls, ExtCtrls, OpenGL12, GLUT, ComCtrls, Math, GLToolsDelphi;
  9.  
  10. type
  11.   TPosition = array[0..2] of GLFloat;
  12.  
  13. type
  14.   TBall = Class
  15.   private
  16.     FNummer: Integer;
  17.     FPosition: TPosition;
  18.     FFarbe: Pointer;
  19.   public
  20.     procedure DrawBall;
  21.     property Nummer: Integer read FNummer write FNummer;
  22.     property Position: TPosition read FPosition write FPosition;
  23.     property Farbe: Pointer read FFarbe write FFarbe;
  24.   End;
  25.  
  26. type
  27.   TBallListe = class
  28.   private
  29.     FListe: TList;
  30.   public
  31.     procedure DrawBaelle;
  32.     constructor Create;
  33.     destructor Destroy; override;
  34.     property Liste: TList read FListe write FListe;
  35.   end;
  36.  
  37. type
  38.   TForm1 = class(TForm)
  39.     Panel1: TPanel;
  40.     Button1: TButton;
  41.     Timer1: TTimer;
  42.     TrackBar1: TTrackBar;
  43.     TrackBar2: TTrackBar;
  44.     TrackBar3: TTrackBar;
  45.     procedure FormCreate(Sender: TObject);
  46.     procedure FormDestroy(Sender: TObject);
  47.     procedure Timer1Timer(Sender: TObject);
  48.     procedure Button1Click(Sender: TObject);
  49.     procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  50.       Shift: TShiftState; X, Y: Integer);
  51.     procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  52.       Shift: TShiftState; X, Y: Integer);
  53.     procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  54.       Y: Integer);
  55.   private
  56.     RC: HGLRC;
  57.     DC: HDC;
  58.     BallListe: TBallListe;
  59.     function GetBallByNummer(aNummer: Integer): TBall;
  60.     function GetOpenGLPos(aX, aY: Integer): TVector3d;
  61.   public
  62.     procedure DrawScene;
  63.   end;
  64.  
  65. var
  66.   Form1: TForm1;
  67.   Palette: HPALETTE;
  68.  
  69.     mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  70.     mat_shininess  : Array[0..0] of GlFloat = (50.0);
  71.     mat_ambient    : Array[0..3] of GlFloat = (0.4, 0.4, 0.4, 1.0);
  72.     mat_diffuse    : Array[0..3] of GlFloat = (0.4, 0.8, 0.4, 1.0);
  73.  
  74.     light_position : Array[0..3] of GlFloat = (0.0, 10.0, 0.0, 1.0);
  75.     light_ambient  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  76.     light_diffuse  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  77.  
  78.   rot:           array[0..3] of GLFloat = (1, 0, 0, 1);
  79.   Gruen:         array[0..3] of GLFloat = (0, 1, 0, 1);
  80.   Weiss:         array[0..3] of GLFloat = (1, 1, 1, 1);
  81.   Schwarz:       array[0..3] of GLFloat = (0, 0, 0, 1);
  82.   Grau:          array[0..3] of GLFloat = (0.5 , 0.5, 0.5, 1);
  83.   LichtPosition: array[0..3] of GLFloat = (-10, 10, 30, 1);
  84.   LichtRichtung: array[0..3] of GLFloat = (-10, 10, 30, 0);
  85.   Viewport: TVector4i;
  86.   Treffer: Boolean;
  87.   Ball: TBall;
  88.   ModellMatrix: TMatrix4d;
  89.   ProjectionMatrix: TMatrix4d;
  90.   mZ: Single;
  91.   myTex: Cardinal;
  92.   TexturNamen:    array [1..2] of GLuint;
  93.   PBitmap: Pointer;
  94.   PBitmap1: Pointer;
  95.   Quadric : PGLUQuadric;
  96.   Angle: GLFloat;
  97. const
  98.   BufSize = 512;
  99.  
  100. implementation
  101.  
  102. {$R *.dfm}
  103.  
  104. { TForm1 }
  105.  
  106. procedure TForm1.FormCreate(Sender: TObject);
  107. var
  108.   Breite: Integer;
  109.   Hoehe: Integer;
  110.   Tiefe: Integer;
  111. begin
  112.   Angle := 0;
  113.   mZ := 0;
  114.   BallListe := TBallListe.Create;
  115.  
  116.   InitOpenGL;
  117.   DC := GetDC(Panel1.Handle);
  118.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 0, 0, 0, 0, Palette);
  119.   wglMakeCurrent(DC, RC);
  120.  
  121.   glEnable(GL_DEPTH_TEST);
  122.   glEnable(GL_CULL_FACE);
  123.  
  124.     glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  125.     glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  126.     glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  127.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  128.  
  129.     glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  130.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  131.     glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  132.  
  133.   glEnable(GL_LIGHT0);
  134.   glEnable(GL_LIGHTING);
  135.  
  136. //  glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1);
  137.  
  138.   glGenTextures(2,@TexturNamen);
  139.  
  140.   glEnable(GL_TEXTURE_2D);
  141. //  glEnable(GL_COLOR_MATERIAL);
  142.  
  143.   CreateImageBMP('BallNeu.bmp',Breite,Hoehe, PBitmap);
  144.   glBindTexture(GL_TEXTURE_2D,TexturNamen[2]);
  145.   glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,Breite,Hoehe, 0,
  146.                GL_RGB,GL_UNSIGNED_BYTE ,PBitmap);
  147.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  148.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  149. //  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
  150.   gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,Breite,Hoehe,GL_RGB,GL_UNSIGNED_BYTE, PBitmap);
  151. end;
  152.  
  153. procedure TForm1.FormDestroy(Sender: TObject);
  154. begin
  155.   DestroyRenderingContext(RC);
  156. end;
  157.  
  158. function TForm1.GetBallByNummer(aNummer: Integer): TBall;
  159. var
  160.   i: Integer;
  161. begin
  162.   Result := nil;
  163.   for i := 0 to BallListe.Liste.Count - 1 do
  164.   begin
  165.     if TBall(BallListe.Liste.Items[i]).Nummer = aNummer then
  166.     begin
  167.       Result := TBall(BallListe.Liste.Items[i]);
  168.       Exit;
  169.     end;
  170.   end;
  171. end;
  172.  
  173. function TForm1.GetOpenGLPos(aX, aY: Integer): TVector3d;
  174. var
  175.     modelview:  TMatrix4d;
  176.     projection: TMatrix4d;
  177.     winZ,winY:  Single;
  178. begin
  179.     glGetDoublev(GL_MODELVIEW_MATRIX, @modelview );
  180.     glGetDoublev(GL_PROJECTION_MATRIX, @projection );
  181.  
  182.   winY := viewport[3] - ay;
  183.  
  184.   if mZ = 0 then
  185.   begin
  186.     glReadPixels(aX, Round(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );
  187.     mz := winz;
  188.   end;
  189.     gluUnProject(aX, winY, mZ,
  190.               modelview, projection, viewport,
  191.                     @Result[0], @Result[1], @Result[2]);
  192.   caption := FloatToStr(winZ);
  193. end;
  194.  
  195. procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  196.   Shift: TShiftState; X, Y: Integer);
  197. var
  198.   SelectBuf: Array[0..BufSize - 1] of GLuInt;
  199.   Hits: GLInt;
  200.   i: GLInt;
  201.   j: GLInt;
  202.   k: GLInt;
  203.   Names: GLInt;
  204.   n: extended;
  205.   msg: String;
  206. begin
  207.   ShowCursor(False);
  208.  
  209.   n := IntPower(2, 32) - 1;
  210.  
  211.   glSelectBuffer(BufSize, @SelectBuf);
  212.  
  213.   glRenderMode(GL_SELECT);
  214.  
  215.   glInitNames;
  216.   glPushName(0);
  217.  
  218.   glMatrixMode(GL_PROJECTION);
  219.   glPushMatrix;
  220.   glLoadIdentity;
  221.   gluPickMatrix(X, Viewport[3] - Y, 4, 4, Viewport);
  222.   DrawScene;
  223.   glPopMatrix;
  224.  
  225.   glPopName;
  226.  
  227.   Hits := glRenderMode(GL_RENDER);
  228.  
  229.   for i := 0 to Hits - 1 do
  230.   begin
  231.     Names := SelectBuf[0];
  232.     Caption := IntToStr(SelectBuf[3]);
  233.     Ball := GetBallByNummer(SelectBuf[3]);
  234.     Treffer := True;
  235.     //showmessage(FloatToStr(SelectBuf[2]));
  236.   end;  
  237. end;
  238.  
  239. procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  240.   Y: Integer);
  241. var
  242.   Pos: TPosition;
  243.   mouse : TPoint;
  244.   mouse3D: TVector3d;
  245. begin
  246.   if Treffer then
  247.   begin
  248.     // Get the 3D Projected Vector from our 2D mouse position
  249.     mouse3D := GetOpenGLPos(X, Y);
  250.     //Caption := FloatToStr(Mouse3D[0]) + '/' + FloatToStr(Mouse3D[1]);
  251.     Pos[0] := Mouse3D[0];
  252.     Pos[1] := Mouse3D[1];
  253.     Pos[2] := Ball.Position[2];
  254.     Ball.Position := Pos;
  255.   end;
  256. end;
  257.  
  258. procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  259.   Shift: TShiftState; X, Y: Integer);
  260. begin
  261.   Treffer := False;
  262.   mZ := 0;
  263.   ShowCursor(True);
  264. end;
  265.  
  266. procedure TForm1.Timer1Timer(Sender: TObject);
  267. begin
  268.   if Angle >= 360 then
  269.     Angle := 0
  270.   else
  271.     Angle := Angle + 5;
  272.  
  273.   glClearColor(0, 0, 0.05, 1);
  274.  
  275.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  276.  
  277.   glViewport(0, 0, Panel1.Width, Panel1.Height);
  278.   glGetIntegerv(GL_VIEWPORT, @Viewport);
  279.  
  280.   glMatrixMode(GL_PROJECTION);
  281.   glLoadIdentity;
  282.  
  283.   glEnable(GL_AUTO_NORMAL);
  284.   glEnable(GL_Normalize);
  285.  
  286.   DrawScene;
  287.  
  288.   SwapBuffers(DC);
  289. end;
  290.  
  291. procedure TForm1.Button1Click(Sender: TObject);
  292. var
  293.   i: Integer;
  294.   Ball: TBall;
  295.   Pos: TPosition;
  296.   Wert: GLFloat;
  297.   Erster: Boolean;
  298. begin
  299.   Randomize;
  300.   Wert := -40;
  301.   Erster := False;
  302.   for i := 1 to 100 do
  303.   begin
  304.     Ball := TBall.Create;
  305.     Ball.Farbe := @Gruen;
  306.     Pos[0] := Wert;//Random(100) * -1;
  307.     Pos[1] := 0;
  308.     Pos[2] := 10 * i * -1;//Random(100) * -1;
  309.     Ball.Position := Pos;
  310.     Ball.Nummer := i;
  311.     BallListe.Liste.Add(Ball);
  312.     if Erster then
  313.     begin
  314.       Wert := Wert -80;
  315.       Erster := False;
  316.     end
  317.     else
  318.     begin
  319.       Wert := Wert +80;
  320.       Erster := True;
  321.     end;
  322.   end;
  323. end;
  324.  
  325. procedure TForm1.DrawScene;
  326. var
  327.   i: Integer;
  328. begin
  329.   glPushAttrib(GL_ALL_ATTRIB_BITS);
  330.   glEnable(GL_DEPTH_TEST);
  331.   glEnable(GL_Normalize);
  332.  
  333.   gluPerspective(45, Panel1.Width/Panel1.Height, 1, 2000);
  334.  
  335.   Quadric:=gluNewQuadric;
  336.   gluQuadricDrawStyle(Quadric, GLU_FILL);
  337.   gluQuadricTexture(Quadric, GL_TRUE);
  338.   gluQuadricNormals(Quadric, GLU_SMOOTH);
  339.   glMatrixMode(GL_TEXTURE);
  340.   glLoadIdentity;
  341.  
  342.   glBindTexture(GL_TEXTURE_2D, TexturNamen[2]);
  343.  
  344.   glMatrixMode(GL_MODELVIEW);
  345.   glLoadIdentity;
  346.  
  347.   gluLookAt(0, 0, 0, 0, 0, -100, 0, 1, 0);
  348.  
  349.   for i := 0 to BallListe.Liste.Count - 1 do
  350.   begin
  351.     TBall(BallListe.Liste.Items[i]).DrawBall;
  352.   end;
  353. end;
  354.  
  355. { TBall }
  356.  
  357. procedure TBall.DrawBall;
  358. begin
  359.   glEnable(GL_LIGHT0);
  360.   glEnable(GL_LIGHTING);
  361.  
  362.   glLoadName(Nummer);
  363.  
  364.   glPushMatrix;
  365.  
  366.   glTranslatef(Position[0], Position[1], Position[2]);
  367.   glRotatef(Angle, 10, 5, 0);
  368.  
  369.   gluQuadricNormals(Quadric, GLU_SMOOTH);
  370.  
  371.   GLUSphere(Quadric, 5, 40, 40);
  372.  
  373.   glPopMatrix;
  374. end;
  375.  
  376. { TBallListe }
  377.  
  378. constructor TBallListe.Create;
  379. begin
  380.   Liste := TList.Create;
  381. end;
  382.  
  383. destructor TBallListe.Destroy;
  384. var
  385.   i: Integer;
  386. begin
  387.   for i := 0 to Liste.Count - 1 do
  388.   begin
  389.     TBall(Liste.Items[i]).Free;
  390.   end;
  391.   Liste.Free;  
  392.   inherited;
  393. end;
  394.  
  395. procedure TBallListe.DrawBaelle;
  396. var
  397.   i: Integer;
  398. begin
  399.   for i := 0 to Liste.Count - 1 do
  400.   begin
  401.     TBall(Liste.Items[i]).DrawBall;
  402.   end;  
  403. end;
  404.  
  405. end.
  406.  


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 20:10 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Vielen vielen Dank !!!!!

Super, nun funktioniert es !!!

Ich habe für den Tennisball noch eine Textur die für die Struktur des Balls sein soll.

Wie bekomme ich nun diese noch dazu ??

Stichwort Bumpmapping. Lieg ich richtig ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 12, 2006 20:38 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Mit Bump bzw Normalmaps liegst du zwar richtig, das ist aber deultlich komplexer und wird meist mit shadern statt gllicht gelöst.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 16 Queries | GZIP : On ]