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

Aktuelle Zeit: Mo Mai 20, 2024 10:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 01:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich benutze z.Z. folgende Funktion für's Billboarding (also um ein Quad immer flach zur Kamera zu richten)

<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> <span class='reserved'>procedure</span> Billboard;
<span class='reserved'>const</span>
NewView: <span class='reserved'>Array</span>[<span class='integer'>0</span>..<span class='integer'>11</span>] <span class='reserved'>of</span> GLFloat = (<span class='integer'>1</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>1</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>1</span>,<span class='integer'>0</span>);
<span class='reserved'>var</span>
ModelView: <span class='reserved'>Array</span>[<span class='integer'>0</span>..<span class='integer'>15</span>] <span class='reserved'>of</span> GLFloat;
<span class='reserved'>begin</span>
glGetFloatv(GL_MODELVIEW_MATRIX,@ModelView[<span class='integer'>0</span>]);
Move(NewView[<span class='integer'>0</span>],ModelView[<span class='integer'>0</span>],SizeOf(NewView));
glLoadMatrixf(@ModelView[<span class='integer'>0</span>]);
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Hierbei wird nur leider jedes glRotate zunichte gemacht... :(

deswegen, gibt es evtl noch andere, bessere Billboarding Methoden??? Vorallem eine wo glRotate nich seine wirkung verliert ;)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 09:55 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
*kopfkratz* Ein Billboard hat doch gar keine Rotation :huh: Das doch gerade der Gag an der Sache, dass es egal von wo aussieht als würde es auf einen zeugen...

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

jep.. das mein ich.. :)

Ich möchte z.B. ein Quad um 45° drehen und das aber trotzdem immer flach zur Kamera ausrichten...

Oder bei meiner ParticleEngine... ich möchte z.B. auch gern von oben darauf gucken können, also würde ich die kamera einfach über die Partikel setzen und mit glRotate nach unten drehen... nur, durch das Billboarding wird die Rotation einfach wieder weggemacht...:(

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 20:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 27, 2002 16:29
Beiträge: 77
Wohnort: Düsseldorf
Dann darfst du nur bestimmte Rotationswerte verändern/löschen, der Rotationswert um die X-Achse ist bei den Indexs 5 (cos), 6 (-sin), 9 (sin) und 10 (cos), der um die Y-Achse bei 0 (cos), 2 (sin), 8 (-sin), 10 (cos), und der um die Z bei 0 (cos), 1 (-sin), 4(sin) und 5(cos). Dabei gibt es aber das Problem, das sie die Indexs überlappen (bei 0 gibt z.B.: Y und Z).

Um die Rotation trotzdem zu haben, kannst du sie "per Hand" einfügen, also ohne gLRotate, indem du an den richtigen Index die jeweilige Winkelfunktion einsetzt {also z.B.: bei Rotation von 45° (=0,785398163397448309615660845819876 im Bogenmaß, Cosinus=0,999906049801550508019717952940444, Sinus=0,0137073546047074765840170910675833) . um die Z Achse, setzt du in den Index 0 den Cosinus ein, in 1 den negativen Sinus, in 4 den Sinus und in 5 wieder den Cosinus)

_________________
Probleme sind zum Lösen da


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 23, 2003 00:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
*Delphic über den haufen knuddl*
Hab's geschafft Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 23, 2003 09:19 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Ich meine mir ist es ja egal, wer hier mit wem, aber... ;) Was hat Delphic mit diesem Thread zu tun?!

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 23, 2003 09:26 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Zitat:
Ich meine mir ist es ja egal, wer hier mit wem, aber... ;) Was hat Delphic mit diesem Thread zu tun?!


Noch zudem: solltet ihr irgenmdwie ne gute Lösung gefunden haben, könntet ihr die hier irgendwie posten? Ist evtl. für andere Leute auch interissant ;) :P

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 23, 2003 12:09 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Für alle, die wissen wollen, warum Aya sich so freut, der schaue sich bitte diesen ICQ log an: Die Erklärung zum Kameraspace ist nicht besonders gut, aber man sollte verstehen können, was gemeint ist - ansonsten googeln, da gibts sicher saubere beschreibungen.

Aya: und was is für viele Partikel brauchbar? :)
Delphic: ok, ich zeig dir wies in meiner engine läuft....
Aya: ok *guckt neugierig*
Delphic: zuerst merkt man sich die Kameramatrix irgendwo, dann läd man die identität in die modelviewmatrix - glLoadIdentity ;-)
Delphic: dann transformiert man den mittelpunkt - oder was auch immer des partikels in den Kameraspace, etwa so:
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
P := GetCameraSpacePosition(Position);
<span class='reserved'>function</span> GetCameraSpacePosition(P : TVertex): TVertex;
<span class='reserved'>begin</span>
Assert(Assigned(ActiveCamera));
Result := _VectorTransform(P, ActiveCamera.fMatrix);
<span class='reserved'>end</span>;
<span class='reserved'>function</span> _VectorTransform(<span class='reserved'>const</span> V: TAffineVector; <span class='reserved'>const</span> M: TMatrix): TAffineVector; register;
<span class='reserved'>begin</span>
Result[X]:=V[X] * M[X, X] + V[Y] * M[Y, X] + V[Z] * M[Z, X] + M[W, X];
Result[Y]:=V[X] * M[X, Y] + V[Y] * M[Y, Y] + V[Z] * M[Z, Y] + M[W, Y];
Result[Z]:=V[X] * M[X, Z] + V[Y] * M[Y, Z] + V[Z] * M[Z, Z] + M[W, Z];
<span class='reserved'>end</span>;
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Aya: *nickt leicht*
Aya: *guckt verwirrt*
Delphic: jetzt kannste in 2d um P herumzeichnen
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
V[<span class='integer'>0</span>] := VectorAdd(P, Shape[<span class='integer'>0</span>]);
V[<span class='integer'>1</span>] := VectorAdd(P, Shape[<span class='integer'>1</span>]);
V[<span class='integer'>2</span>] := VectorAdd(P, Shape[<span class='integer'>2</span>]);
V[<span class='integer'>3</span>] := VectorAdd(P, Shape[<span class='integer'>3</span>]);
glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>1.0</span>);
glVertex3fv(@V[<span class='integer'>0</span>]);

glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>);
glVertex3fv(@V[<span class='integer'>1</span>]);

glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>0.0</span>);
glVertex3fv(@V[<span class='integer'>2</span>]);

glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
glVertex3fv(@V[<span class='integer'>3</span>]);
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
z.b.
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
Shape[<span class='integer'>0</span>][<span class='integer'>0</span>] := -<span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>0</span>][<span class='integer'>1</span>] := -<span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>0</span>][<span class='integer'>2</span>] := <span class='integer'>0.0</span>;

Shape[<span class='integer'>1</span>][<span class='integer'>0</span>] := <span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>1</span>][<span class='integer'>1</span>] := -<span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>1</span>][<span class='integer'>2</span>] := <span class='integer'>0.0</span>;

Shape[<span class='integer'>2</span>][<span class='integer'>0</span>] := <span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>2</span>][<span class='integer'>1</span>] := <span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>2</span>][<span class='integer'>2</span>] := <span class='integer'>0.0</span>;

Shape[<span class='integer'>3</span>][<span class='integer'>0</span>] := -<span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>3</span>][<span class='integer'>1</span>] := <span class='integer'>1.0</span>/<span class='integer'>4</span>;
Shape[<span class='integer'>3</span>][<span class='integer'>2</span>] := <span class='integer'>0.0</span>;
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Aya: mhmh... klingt logisch.. *guckt unsicher auf den Code* Jetzt muß ich nur dne Code verstehen :D
Delphic: dann erzähl mal was du glaubst was passiert, cih erkläre unklarheiten
Aya: Nu jaa~~*g*
ähh... so halt... *pfeift*
Delphic: das ganze läuft darauf hinaus, dass du anfängt wirklich in 2D zu zeichen, und zwar um den punkt P herum.... P hast du aber so berechnet, dass er die koordinaten hat, an denen er normalerweise auf dem "bildschirm" erscheinen würde.... so in etwa
Aya: Also nochmal langsam... :)
Ich speichere erstmal die WorldMatrix irgendwo zwischen... ja?
Dann nehm ich die Position von PartikelA und mach das in diese GetCameraSpacePosition funktion.. ja?? Da bekomm ich dann nen PunktB raus wo ich mein Partikel zeichne... ja?
Delphic: genau... aber zwischendrin musst du die identitätsmatrix an openmgl geben, sonst gehts nit
Aya: TAffineVextor is dasselbe wie TVertex?
Aya: ActiveCamera.fMatrix is die aktuelle WorldMatrix?
Delphic: das ist die vorher gerettete matrix - bzw in dem fall andersherum - sie wurde irgendwann an opengl übergeben, aber das läuft auf das selbe hinaus udn ist nur ne sache von meiner engine
Aya: gut gut .. :)
und wie genau schaut bei dir nen TVertex, TAffineVector und ne TMatrix aus??? (Constanten X,Y,Z,W = 1,2,3,4 ??)
Delphic: das sind die teile aus geometry.pas
Aya: oh.. gut.. die hab ich.. irgendwo... *g*
Aya: Dann probier ich das jetzt mal *guckt fröhlich*
Delphic: aber bei den typen sit eh nur wichtig, das sie die passende grösse haben, bzw. die benötigte zahl der komponenten und das kann variieren
Aya: Jep :)
Delphic: und in diesem fall ist TAffineVector=TVertex mit jeweils 3 Koordinaten, also X,Y,Z
Aya: Ok ^^
Delphic: nur der normale VectorTransform aus geometry.pas macht keine verscheibungen mit, sondern ignoriert sie, darum das _VectorTransform von mir
Aya: achso :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 23, 2003 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Gibts hier den keine Suchfunktion??? tze... :D
<a href='http://www.phobeus.de/hosting/dgl/forum/index.php?act=ST&f=2&t=1234&hl=billboard&s=' target='_blank'>http://www.phobeus.de/hosting/dgl/forum/in...hl=billboard&s=</a>

Hier nen bissel Code aus meinem Partikel-Sys:
Code:
  1.  
  2. procedure tjetemitter3d.render;
  3. var particle:pparticle3d;matrix:array[0..15]of single;
  4. begin
  5.  if count>0 then
  6.  begin
  7.  &nbsp;particle:=firstparticle;
  8.  &nbsp;glgetfloatv(gl_modelview_matrix,@matrix);
  9.  &nbsp;glbindtexture(gl_texture_2d,texture);
  10.  &nbsp;glbegin(gl_quads);
  11.  &nbsp; while particle<>nil do
  12.  &nbsp; begin
  13.  &nbsp; &nbsp;glcolor4fv(@particle^.color);
  14.  &nbsp; &nbsp;gltexcoord2f(0.0,0.0);
  15.  &nbsp; &nbsp;glvertex3f(particle^.pos.x+(-matrix[0]-matrix[1])*size,particle^.pos.y+(-matrix[4]-matrix[5])*size,particle^.pos.z+(-matrix[8]-matrix[9])*size);
  16.  &nbsp; &nbsp;gltexcoord2f(1.0,0.0);
  17.  &nbsp; &nbsp;glvertex3f(particle^.pos.x+(matrix[0]-matrix[1])*size,particle^.pos.y+(matrix[4]-matrix[5])*size,particle^.pos.z+(matrix[8]-matrix[9])*size);
  18.  &nbsp; &nbsp;gltexcoord2f(1.0,1.0);
  19.  &nbsp; &nbsp;glvertex3f(particle^.pos.x+(matrix[0]+matrix[1])*size,particle^.pos.y+(matrix[4]+matrix[5])*size,particle^.pos.z+(matrix[8]+matrix[9])*size);
  20.  &nbsp; &nbsp;gltexcoord2f(0.0,1.0);
  21.  &nbsp; &nbsp;glvertex3f(particle^.pos.x+(-matrix[0]+matrix[1])*size,particle^.pos.y+(-matrix[4]+matrix[5])*size,particle^.pos.z+(-matrix[8]+matrix[9])*size);
  22.  &nbsp; &nbsp;particle:=particle^.next;
  23.  &nbsp; end;
  24.  &nbsp;glend;
  25.  end;
  26. end;
  27.  




mfg las

_________________
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  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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 | 14 Queries | GZIP : On ]