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

Aktuelle Zeit: Mi Jul 09, 2025 08:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Billiardprogramm
BeitragVerfasst: Sa Jun 06, 2009 19:04 
Offline
DGL Member

Registriert: So Apr 06, 2008 11:57
Beiträge: 1
Hallo liebe Freunde der Sonne,
ich bin gerade dabei ein Billiard zu programmieren. Dabei tun sich mir viele Probleme mit der Grafik auf,
es sieht bis jetzt noch garstig und unrealistisch aus, hauptsächlich deswegen, weil mir noch nicht ganz klar ist, welche Werte die Lichteinstellungen haben müssen und weil das mit der Textur noch nicht einwandfrei funktioniert.
Außerdem ist der Stoss von Kugel zu Kugel noch zentral und nicht realistisch, wobei es mir hier erstmal nur um die Grafik geht. Hier ist der "Hauptcode" der Render-procedure:

Code:
  1.  
  2. procedure tGLform.Render;
  3. var
  4.   i: Integer;
  5.  
  6.  
  7. const
  8.     mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  9.     mat_shininess  : Array[0..0] of GlFloat = (10.0);
  10.     mat_ambient    : Array[0..3] of GlFloat = (0.4, 0.4, 0.4, 1.0);
  11.     mat_diffuse    : Array[0..3] of GlFloat = (0.4, 0.8, 0.4, 1.0);
  12.     mat_emission   : Array[0..3] of GLFloat = (0.3, 0.4, 0.8, 1.0);
  13.  
  14.     light_position : Array[0..3] of GlFloat = (1000, 10.0, 0.0, 1.0);
  15.     light_ambient  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  16.     light_diffuse  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  17.  
  18. begin
  19.     glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  20.     glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  21.     glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  22.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  23.     glMaterialfv(GL_FRONT, GL_EMISSION,  @mat_emission[0]);
  24.  
  25.     glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  26.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  27.     glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  28.  
  29.  
  30.     glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.001);
  31.     glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.000001);
  32.     glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.000004);
  33.  
  34.  
  35.     glEnable(GL_COLOR_MATERIAL);
  36.     glEnable(GL_LIGHTING);
  37.     glEnable(GL_LIGHT0);
  38.  
  39.  
  40.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  41.   glMatrixMode(GL_PROJECTION);
  42.   glLoadIdentity;
  43.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  44.  
  45.   glMatrixMode(GL_MODELVIEW);
  46.   glLoadIdentity;
  47.   glEnd;
  48.  gltranslatef(0,-30,-600);
  49.   glrotatef(-70,1,0,0);
  50.  glpushmatrix();
  51.  gltranslatef(0,0,-10);
  52.  glBegin(GL_QUADS);
  53.    glColor3f(1,1,1); glVertex3f(glgrenze1.x-300, glgrenze1.y-100, 0);
  54.    glColor3f(1,1,1); glVertex3f(glgrenze2.x+170, glgrenze1.y-100, 0);
  55.    glColor3f(1,1,1); glVertex3f(glgrenze2.x+170, glgrenze2.y+240, 0);
  56.    glColor3f(1,1,1); glVertex3f(glgrenze1.x-300, glgrenze2.y+240, 0);
  57.  glEnd;
  58.  glpopmatrix();
  59.  //
  60.  
  61.   for i := 0 to length(glkugeln)-1 do
  62.   begin
  63.   glPushMatrix();
  64.   glColor3f(0,0,1);
  65.   gltranslatef(glkugeln[i].pos.x-300,glkugeln[i].pos.y-100,glkugeln[i].pos.z);
  66.   glusphere(kugel,glkugeln[i].radius,50,50);
  67.   glPopMatrix();
  68.   end;
  69.   SwapBuffers(DC);
  70. end;
  71.  

Gruß, VK

PS: Bei Bedarf kann ich auch den gesamten Quelltext hinzufügen, ich wollte euch nur mein Durcheinander ersparen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 06, 2009 22:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Du könntest noch einen Screenshot beifügen und sagen, was dir genau nicht gefällt.

Code:
  1.  
  2.  glBegin(GL_QUADS);
  3.    glColor3f(1,1,1); glVertex3f(glgrenze1.x-300, glgrenze1.y-100, 0);
  4.    glColor3f(1,1,1); glVertex3f(glgrenze2.x+170, glgrenze1.y-100, 0);
  5.    glColor3f(1,1,1); glVertex3f(glgrenze2.x+170, glgrenze2.y+240, 0);
  6.    glColor3f(1,1,1); glVertex3f(glgrenze1.x-300, glgrenze2.y+240, 0);
  7.  glEnd;
  8.  


glColor3f musst du nur einmal mit 1, 1, 1 aufrufen - die Farbe ist dann in der Statemachine
fest gesetzt. Musst du nicht vor jedem Vertex machen.

Auch gehören die ganzen Materialeinstellungen und die glEnables nicht in die Renderschleife,
da sie nur einmal aufgerufen werden müssen.

Das Gleiche gilt auch für:
Code:
  1.  
  2.   glMatrixMode(GL_PROJECTION);
  3.   glLoadIdentity;
  4.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  5.  
  6.   glMatrixMode(GL_MODELVIEW);
  7.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 07, 2009 16:02 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
Wenn ich (der an typ der da mit-programmiert hat) auch noch was sagen darf:

das mit den texturen verwirrt, weil wenn ich

gluQuadricTexture(kugel,GL_TRUE);

aufrufe bevor ich eine textur drüberklebe (das ich wie ich im Wiki gelesen habe doch auch machen muss),
bekomm ich eine error mit >> ByteBool <> Integer << o.O

das hab ich abolut nich verstanden....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 07, 2009 16:35 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
Ich kann zwar kein Delphi, aber ich vermute einmal dass GL_TRUE eine Integer konstante ist.
Also musst du entweder casten oder du verwendest die Delphi konstante (falls es sowas gibt).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 07, 2009 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
ein einfaches True macht es an der stelle also einfach das "GL_" weg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 08, 2009 16:53 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
Hey,....
ich schäm ich... ok aber es funktioniert vielen Dank!

Um nochmals auf das Lichtproblem aufmerksam zu machen:

durch probieren findat man da schnell ein paar sachen raus,
um mich an warans zu halten (zum Zeitpunkt des Posts war mir das auch schon klar, dass das nich in Render Stehen muss).

Was mich aber interessiert ist, wie ich es jetzt bewerkstellige objekte mit unterschiedlichen Materialkonstanten zu zeichnen,
so dass die eine Kugel vllt. als auf Hochglanz polierte Edelstahlkugel, die daneben als verottete Holzkugel dargestellt wird =).

_________________
Wieso kann es nicht einfach funktionieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 08, 2009 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Materialsammlung is da was für dich dabei??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 00:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Also richtig chic werden deine Kugeln erst, wenn du Per-Pixel-Lighting mit einem guten
Materialalgo benutzt (z.B. Blinn Shading). Eine andere interessante PPL-Methode, die auch
auf älterer Hardware läuft, ist Environmentmapping (siehe Licht-Artikel).

Wenn du mehrere Objekte mit unterschiedlichen Materialeigenschaften zeichnen willst, wird
dir nichts anderes übrig bleiben, als für jedes Objekt glMaterialfv aufzurufen. Wenn du mit
Shadern arbeitest, kannst du diese Eigenschaften auch gut per Uniform-Variable übergeben
(aber nur, wenn sich das Material nur geringfügig unterscheidet. Sobald ein "if" in deinem Shader
auftaucht ist das ein Zeichen, das Material auf einen neuen Shader auszulagern ^^).

Multitexturing ist auch einen Blick wert. Du könntest eine Lightmap für die Ambient-Occlusion
vorrendern und es so aussehen lassen, als würde der Billiardtisch von unten Licht auf die Kugeln
zurückwerfen (GI-Fake). Auch eignen sich mehrschichtige Materialien für allerlei kleine
Details (z.B. Macken/Markierungen auf den Kugeln).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Wir sind hier in einem Einsteigerforum und schon wieder kommt die Shaderkeule. :shock:
Der in dem Licht-Tutorial im Wiki angerissene Weg, anstatt Normalen polygonweit, sondern punktweit als Mittel der angrenzenden Polygone zu berechen, dürfte schon genug schicke Kugel machen. Klar, später kann man noch nen Shader hinzufügen, aber für den Anfang ist das schon ein cooler Effekt.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 10:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Er benutzt gluSphere... also denke ich mal, dass da schon Punktnormalen verwendet werden.

Wenn man sie berechnen muss ist ein einfacherer Weg, denke ich, den Normalenvektor
durch "vPunkt - vMittelpunkt" zu bekommen und dann zu normalisieren. Klappt selbstverständlich
nur bei Kugeln.

Das mit den Shadern ist eher "für Später" gemeint. Das Licht erstmal mit GL-Bordmitteln zu machen
ist auch ok.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 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.008s | 14 Queries | GZIP : On ]