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

Aktuelle Zeit: Fr Jul 18, 2025 20:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Billboardingsystem
BeitragVerfasst: Sa Okt 21, 2006 13:01 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Tjoar ich nutze das in meiner Particleengine: Demo: http://shaddow89.sh.funpic.de/particle.exe

Wenn ich ihr euch ma mit Maus und Tasten n bissel bewegt und dabei mal f6 für den wireframe drueckt, seht ihr das problem. Durch das Billboardingsystem dreht sich die Particleengine nicht, sodass sie sich relativ zu mir immer bewegt. der Wireframe also bleibt fest, die particle aber nicht.
Billboardingcode:
Code:
  1. procedure FXBillBoardBegin;
  2. var x, y : Byte;
  3.     Matrix : Array[0..15] of Single;
  4. begin
  5.   // Sichern der Matrix
  6.   glPushMatrix();
  7.   // Speichern der Matrix in der Variable
  8.   glGetFloatv(GL_MODELVIEW_MATRIX, @Matrix);
  9.   for x:=0 to 2 do
  10.     for y:=0 to 2 do
  11.       if x=y then Matrix[x*4+y] := 1
  12.       else Matrix[x*4+y]:=0;
  13.   glLoadMatrixF(@Matrix);
  14. end;


Code:
  1. procedure FXBillBoardEnd;
  2. begin
  3.   glPopMatrix();
  4. end;

Aus dem entsprechenden Tut. die Frage is jetz, wie bekomm ich das so abgeaendetr, dass die Quads zwar immer zum betrachter gerichtet sind, aber dass sie sich trotzdem immer relativ zur Position bewegen, sodass sie immer im Wireframe bleiben


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 21, 2006 14:06 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Code:
  1. // Speichern der Matrix in der Variable
  2. glGetFloatv(GL_MODELVIEW_MATRIX, @Matrix);
  3. for x:=0 to 2 do
  4. for y:=0 to 2 do
  5. if x=y then Matrix[x*4+y] := 1
  6. else Matrix[x*4+y]:=0;
  7. glLoadMatrixF(@Matrix);

Das sieht mir nach einer Implementierung von glLoadIdentity aus.
also brauchst du vor dem rendern von billboards nur folgendes aufrufen:

Code:
  1. glGetfloatv(GL_MODELVIEW_MATRIX,@mat);
  2.  glPushMatrix;
  3.  glLoadIdentity;


zum rendern eines billboards dann folgene Funktion aufrufen:
Code:
  1. procedure RenderBillboard(v:TVector4f;const radius:single);
  2. begin
  3.     v:=vectortransform(v,mat);
  4.     glBegin(GL_QUADS);
  5.      glTexCoord2f(0,0);
  6.      glVertex3f(v[0]-radius,v[1]-radius,v[2]);
  7.      glTexCoord2f(0,1);
  8.      glVertex3f(v[0]+radius,v[1]-radius,v[2]);
  9.      glTexCoord2f(1,1);
  10.      glVertex3f(v[0]+radius,v[1]+radius,v[2]);
  11.      glTexCoord2f(1,0);
  12.      glVertex3f(v[0]-radius,v[1]+radius,v[2]);
  13.     glEnd;
  14. end;


und am schluss dann einfach glPopMatrix


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 21, 2006 15:10 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja ich dachte auch erst, dass es ne Identitaetsmatrix ist, aber wenn ich stattdessen LoadIdentity nehm, dann funkts nimmer.

Mein Aufruf sieht folgendermaßen aus:
Code:
  1.         glPushMatrix();
  2.         glColor4f  (Color[0], Color[1], Color[2], Saturation/2);
  3.         glTranslatef(Position[0], Position[1], Position[2]);
  4.  
  5.         FXBillBoardBegin;
  6.  
  7.         glBegin(GL_QUADS);
  8.           glTexCoord2f(1,0);
  9.           glVertex3f(TextureSize[0][0]+StartPosition[0],TextureSize[0][1]+StartPosition[1],TextureSize[0][2]+StartPosition[2]);
  10.           glTexCoord2f(0,0);
  11.           glVertex3f(TextureSize[1][0]+StartPosition[0],TextureSize[1][1]+StartPosition[1],TextureSize[1][2]+StartPosition[2]);
  12.           glTexCoord2f(0,1);
  13.           glVertex3f(TextureSize[2][0]+StartPosition[0],TextureSize[2][1]+StartPosition[1],TextureSize[2][2]+StartPosition[2]);
  14.           glTexCoord2f(1,1);
  15.           glVertex3f(TextureSize[3][0]+StartPosition[0],TextureSize[3][1]+StartPosition[1],TextureSize[3][2]+StartPosition[2]);
  16.         glEnd();
  17.  
  18.         FXBillBoardEnd;
  19.  
  20.         glPopMatrix();


Hab mir eben die Funktion nochma angesehen. Wenn ich mich nich verrechnet habe, dann ist die entstehende Matrix die folgende:
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 21:59 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Noch wer ne Idee?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 29, 2006 05:23 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Wie machst du dein Partikelsystem eigentlich? Sieht bei deinem Code irgendwie so aus als würdest du für jedes einzelne Partikel das du zeichnest deine FXBillBoardBegin/End Methoden aufrufen ... da da ein glGetFloatv drinnen ist wäre das aus Performance Sicht nicht unbedingt die aller beste Idee. Wenn du es allerdings so machst, so stellt sich mir die Frage was das StartPosition zu bedeuten hat. Wenn StartPosition immer 0 wäre, so sollten die Partikel immer an ihrer Position bleiben. Also wenn du es so machst mach das StartPosition auch als Translate davor und nicht beim glVertex rein.

Wenn du allerdings alle Partikel eines Systems mit einem FXBillBoardBegin/End-Aufruf zeichnest so ist anzunehmen, dass das StartPosition die Position relativ in diesem System angeben soll, was auch grundlegend mal keine schlechte Idee ist. Da aber wie gesagt nur Partikel mit StartPos 0 an ihrer Position bleiben werden, wäre es hierfür sinnvoll wenn das Zentrum deines Partikelsystems die Position 0 besitzt, wodurch sich alle anderen Partikel um dieses Zentrum herum drehen sollten und nicht um irgend einen anderen Punkt.


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 » OpenGL


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 | 16 Queries | GZIP : On ]