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

Aktuelle Zeit: Fr Jul 18, 2025 12:30

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: billboarded "lines" (/quads)
BeitragVerfasst: Fr Nov 28, 2003 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Sooooo...
Ich habe zwei Punkte (v1,v2 mit je x,y,z, logischerweise *g*)...
Außerdem habe ich die Breite der Linie (linewidth), jetzt soll ein Quad so dazwischen gebastelt werden, dass die Vorderseite immer zum Betracher hinzeigt, wie bei "normalen" Billboards, von z.B. Partikeln.

Um das ganze mal zu veranschaulichen...
Bild

Bei meinem alten Partikelsystem hab ich das ganze mit Hilfe der Matrix gelöst ...
Code:
  1.  
  2. gltexcoord2f(0.0,0.0);
  3. glvertex3f(x+(-matrix[0]-matrix[1])*size,y+(-matrix[4]-matrix[5])*size,z+(-matrix[8]-matrix[9])*size);
  4. gltexcoord2f(1.0,0.0);
  5. glvertex3f(x+(matrix[0]-matrix[1])*size,y+(matrix[4]-matrix[5])*size,z+(matrix[8]-matrix[9])*size);
  6. gltexcoord2f(1.0,1.0);
  7. glvertex3f(x+(matrix[0]+matrix[1])*size,y+(matrix[4]+matrix[5])*size,z+(matrix[8]+matrix[9])*size);
  8. gltexcoord2f(0.0,1.0);
  9. glvertex3f(x+(-matrix[0]+matrix[1])*size,y+(-matrix[4]+matrix[5])*size,z+(-matrix[8]+matrix[9])*size);
  10.  


Ganz so "einfach" scheint das jetzt nicht zu gehen...
Hat vielleicht schonmal einer von euch sowas ähnliches gemacht? Kreative Vorschläge und Lösungsansätze bitte :D

mfg las


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dein Problem ist, dass der Bilboard Algorythmuss deine Punkte transformiert und sie somit durch den Raum schiebt. Was du ja nicht tun dürftest. Warum machst du das nicht so ahnlich wie eine OpenGLLinie. Wenn ich das bisher richtig gesehen habe, dann ist das eigentlich sogar ziemlich simpel. (uhhh 3 Lügen in einem Satz ;-) )

Ich weiß nicht genau wie ich es beschreiben soll. Aber wenn man eine OpenGL Linie mit einer großen Breite (um 10) darstellt und diese Linie dreht, dann hat es den Anschein als ob sich die Linie drehen würde. Siehe Bild unten.

Wenn der Winkel der Linie über 45° ist.
Bild

Und wenn der Winkel der Linie kleiner als 45° ist.
Bild

Das gleiche Phänomen tritt auch in den anderen Ecken ein.

Du müsstest jetzt bei so etwas ähnliches einbauen. Also, dass du nicht dein komplettes Quad veränderst sondern nur deren Rotation um die eigene Achse. Um es so hinzubekommen wie es die GL Linien machen. Müsstest du den Winkel der Linie ausrechnen der zwischen Benutzer (Kamera) und deinem Punkt herscht. Wenn der Benutzer eher von Vorne deine Linie betrachten will, dann müsstest du die Punkt übereinander platzieren. Wenn er sie eher von Oben sehen will müsstest du sie hintereinander (aus der sicht von vorne) anordnen. Also, dass du nicht die Normaler der Fläche in richtung benutze zeigen lässt sondern die Fläche nur in etwa in die Richtung des Benutzers zeigen lässt.
Für breite Linien könnte man dann nicht in 90° das Quad drehen sondern müsste ein wenig genauer werden. Da es sonst nicht gut aussieht. Aber sobald die Linien nur ein paar Pixel breit sind ginge das schon. Es Ist halt eine Abwägung zwischen Leistungsoptimierung und Aussehen.

Ich hoffe mein Denkanstoß war nicht zu verwirrend. Ich hoffe er funktioniert überhaupt. ;-)
Habe mir das gerade nur mal durch den Kopf gehen lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
*räusper*
GeForce 2 MX 400 und die Linien sehen so aus:
Bild

Und ich hätte es scho gerne so wie unten dargestellt *g*
Außerdem soll ja auch ne Texture drauf, daher...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Gesucht ist ja der Vektor v3.
Wenn V die Kameraposition ist, dann gilt
v3'=(v1-v) X (v2-v1)
v3= v3' / |v3| * Linewidth


Dateianhänge:
test11.gif
test11.gif [ 2.42 KiB | 12006-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
*räusper*
GeForce 2 MX 400 und die Linien sehen so aus:

Hmmm. Solche komischen Linien habe ich ja noch gar nicht gesehen. Und das obwohl ich auch schon einige nVidias zum Testen hatte. Merkwürdig. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Funktioniert das auch wenn ich rotiere?!
Ich probiers mal aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich habe das noch nicht ausprobiert, aber der Unterschied zum normalen Billbord ist ja das diese Kante v3 nicht nur im rechten Winkel zum Kameravektor stehen muß, sondern auch noch zusätzlich im rechten Winkel zu v1-v2. Anstelle von (v1-v) könntest du auch probieren den Vektor zu nehmen in den die Kamera schaut. Das wäre dann der Vektor (matrix[8],matrix[9],matrix[10]).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Solange nicht rotiert wird, scheint das Ganze zu funzen, mit der Formel von Oben.
Jetzt rotieren... Ich bin mit meiner Mathematik am Ende.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 18:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wie meinst du das mit Rotieren?
Die Positionen sind dann natürlich im gleichen Raum wie v1,v2, die Kameraposition und der Kameravektor. Also wenn man nur glLookAt verwendet, dann dürfte es gehen. Ansonsten muß man die nachfolgenden Tranformationen rückgängig machen und die Punkte nochmal mit der inversen Matrix multiplizieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2003 18:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Ich benutze glrotate.
Wenn ich rotiere soll halt das Ganze "mitgedreht" werden.
Habe gllookat ehrlich gesagt noch nie verwendet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 03, 2003 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
ähmmm, wo sind die ganzen Mathe-Genies hin?
:mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 03, 2003 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Zitat:
ähmmm, wo sind die ganzen Mathe-Genies hin?

Das gefällt mir nicht...

Der direkteste Weg ist, die Projektion von v1 und v2 auf dem Bildschirm zu berechnen, was das Ganze auf ein 2D-Problem reduziert.
Du nimmst dann den Differenzvektor v1 v2 (jetzt als 2D-Koordinaten), die Normale eines Vektors (x,y) ist dann (y,-x), womit du dann dein Rechteck basteln kannst.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 03, 2003 21:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
gute Idee...
na, ich denk mir da mal am Wochenende was Schönes aus...
:mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2004 13:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
So, ich würde mal sagen ich komme der Sache näher...
Ich habe für v3 jetzt einfach mal:
Code:
  1.  
  2.   v3.x:=matrix[1];
  3.   v3.y:=matrix[5];
  4.   v3.z:=matrix[9];
  5.  

genommen, und das Quad wird parallel zum Betrachter gezeichnet, "nur" jetzt fehlt noch das was ich oben beschrieben habe.

Code:
  1.  
  2. procedure billboard(v1,v2:tvec3;linewidth:single);
  3. var v3,tmp:tvec3;
  4. var matrix:array[0..15]of single;
  5. begin
  6.  glgetfloatv(gl_modelview_matrix,@matrix);
  7.  glbegin(gl_quads);
  8.   v3.x:=matrix[1];
  9.   v3.y:=matrix[5];
  10.   v3.z:=matrix[9];
  11.   normalize3d(v3);
  12.   tmp.x:=v1.x+v3.x*linewidth;
  13.   tmp.y:=v1.y+v3.y*linewidth;
  14.   tmp.z:=v1.z+v3.z*linewidth;
  15.   glvertex3fv(@tmp);
  16.   tmp.x:=v1.x-v3.x*linewidth;
  17.   tmp.y:=v1.y-v3.y*linewidth;
  18.   tmp.z:=v1.z-v3.z*linewidth;;
  19.   glvertex3fv(@tmp);
  20.   v3.x:=matrix[1];
  21.   v3.y:=matrix[5];
  22.   v3.z:=matrix[9];
  23.   normalize3d(v3);
  24.   tmp.x:=v2.x-v3.x*linewidth;
  25.   tmp.y:=v2.y-v3.y*linewidth;
  26.   tmp.z:=v2.z-v3.z*linewidth;;
  27.   glvertex3fv(@tmp);
  28.   tmp.x:=v2.x+v3.x*linewidth;
  29.   tmp.y:=v2.y+v3.y*linewidth;
  30.   tmp.z:=v2.z+v3.z*linewidth;;
  31.   glvertex3fv(@tmp);
  32.  glend;
  33.  glbegin(gl_lines);
  34.   glvertex3fv(@v1);
  35.   glvertex3fv(@v2);
  36.  glend;
  37. end;
  38.  


So siehts bis jetzt aus:
Bild

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2004 21:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
So scheint es zu gehen:
(Nach Hilfe eines Mathe/Informatik Stundenten und einigem herumprobieren mit den Vorzeichen...)

Code:
  1.  
  2. procedure billboard(p1,p2:tvec3;linewidth:single);
  3. var cam,dir,vec:tvec3;
  4. matrix:array[0..15]of single;
  5. length:single;
  6. begin
  7.  glgetfloatv(gl_modelview_matrix,@matrix);
  8.  glbegin(gl_quads);
  9.   cam.x:=matrix[2];
  10.   cam.y:=-matrix[6]; // Da muss erstmal einer drauf kommen! *g*
  11.   cam.z:=matrix[10];
  12.   dir.x:=p2.x-p1.x;
  13.   dir.y:=p2.y-p1.y;
  14.   dir.z:=p2.z-p1.z;
  15.   //Kreuzprodukt von cam und dir...
  16.   vec.x:=dir.y*cam.z-dir.z*cam.y;
  17.   vec.y:=-(dir.z*cam.x-dir.x*cam.z);
  18.   vec.z:=dir.x*cam.y-dir.y*cam.x;
  19.   //Vektor normalisieren
  20.   length:=sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z);
  21.   if length<>0 then
  22.   begin
  23.    vec.x:=vec.x/length;
  24.    vec.y:=vec.y/length;
  25.    vec.z:=vec.z/length;
  26.   end
  27.   else
  28.   begin
  29.    exit;
  30.   end;
  31.   //Mit Linienbreite multiplizieren
  32.   vec.x:=vec.x*linewidth/2;
  33.   vec.y:=vec.y*linewidth/2;
  34.   vec.z:=vec.z*linewidth/2;
  35.   //Zeichnen
  36.   gltexcoord2f(0,0);
  37.   glvertex3f(p1.x-vec.x,p1.y-vec.y,p1.z-vec.z);
  38.   gltexcoord2f(0,1);
  39.   glvertex3f(p1.x+vec.x,p1.y+vec.y,p1.z+vec.z);
  40.   gltexcoord2f(1,1);
  41.   glvertex3f(p2.x+vec.x,p2.y+vec.y,p2.z+vec.z);
  42.   gltexcoord2f(1,0);
  43.   glvertex3f(p2.x-vec.x,p2.y-vec.y,p2.z-vec.z);
  44.  glend;
  45. end;
  46.  


Falls ihr noch Fehler findet, bitte melden ;)
Im Anhang, eine Demo Anwendung.
P.S.: Ideal für Laserschwerter, Blitze, Regen ...
P.P.S.: Guckt mal auf die Größe der Exe

Danke an den Ecksperten und -red ;)

mfg las


Dateianhänge:
billboard.rar [6.81 KiB]
528-mal heruntergeladen

_________________
www.las.eu.tc
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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.011s | 17 Queries | GZIP : On ]